Home

Vim-users.jp

Vim勉強会#5が開催されました

2010年1月31日(日)、第五回目となる関西でのVim勉強会が開催され、大盛況の中終了しました。

Vim5

関西vim勉強会#5

  1. ujihisaさん: Vim初級者レッスン(前半)
  2. ujihisaさん: Vim初級者レッスン(後半)
  3. Sixeightさん: text-object
  4. 少佐さん: はじめてのVim
  5. tsukkeeさん: .vimrcの書き方
  6. .vimrc hackathon

Vim勉強会は、家に帰って感想記事を書いてブログを書いてトラックバック等を送るまでがVim勉強会です。

食べ放題のお菓子、カナダ土産の美味しいお菓子、活発な質問、居心地の良い空間、エネミー、そしてVimへの愛にあふれたすばらしい勉強会でした。勉強会の後の懇親会では、乾杯のときに「Vim」という声が自然と出てきたとか。いやはや、高まるVim熱は、とどまるところを見せません。

次回のVim勉強会は5月中旬に行なわれる予定です。

Vim勉強会#5 ujihisa発表資料

Vim勉強会5 初級者向け講座

ujihisa

初級者とは

「初級者向け講座」 … 具体的に、初級者とは?

Vim使いのレベル10

  • Lv1 vimtutorを終わらせた。あるいは、hjklで移動できて保存と終了ができる
  • Lv2 ビジュアルモードを使うのをやめ、y}やdawなどの素晴らしい操作性に自己陶酔する
  • Lv3 自分でインストールしたプラギンの数が5を越え、ダメプラギンはすぐに判別できるようになる
  • Lv4 自分で作ったプラギンをvim.orgでリリースし、何人かをLife Changingさせる
  • Lv5 他のアプリケーション使用時にescやiを打鍵してしまい、イラっとする日々を送る
  • Lv6 シェルは当然vimshell。ネオコンなど大規模プラギンのバグを発見し、パッチ付きで報告する
  • Lv7 Vim本体のソースコードを読み、あまりの魔界に発狂する
  • Lv8 他言語インタフェースif_***を作り、vim_devに投稿する。当然採用されない
  • Lv9 Vim本体の開発への貢献が日常になる。投稿し採用されたパッチ数が10を越える
  • Lv10 神になる

つまり

  • Lv1~Lv4 初級者
  • Lv4~Lv7 中級者
  • Lv7~Lv10 上級者

今日の目標

Lv4 自分で作ったプラギンをvim.orgでリリースし、何人かをLife Changingさせる

全員ここまでやる

Be Lv1

  • Lv1 vimtutorを終わらせた。あるいは、hjklで移動できて保存と終了ができる

VimをインストールしてVimtutorを全部やる。25~30分。

$ vimtutor

Lv1の重要な点

  • u
    • undo。無制限
    • Vimは終了しない
    • キャンセルは<C-r>
  • A
    • その行の行末から文字入力開始!
  • dw
    • (delete 'word)
    • カーソル位置からその単語の終わりまでまとめて削除!
  • d$
    • カーソル位置から行末まで削除!
  • dd
    • その行を削除
  • p, P
    • 消した文字を貼付け。PだとVim以外のソフトのペーストのような挙動
  • 0
    • 行頭に移動

ビジュアルモード

  • v
    • 一文字単位のビジュアルモード
  • V
    • 行単位のビジュアルモード
  • <C-v>
    • 矩形選択

vしてyでヤンク、あるいはdで削除できる!

Be Lv2

  • Lv2 ビジュアルモードを使うのをやめ、y}やdawなどの素晴らしい操作性に自己陶酔する

非オブジェクト指向言語

値x に対して、 引数2 で、 関数f を実行する

f(x, 2)

オブジェクト指向言語

値x に対して、 引数2 で、 関数f を実行する

# f(x, 2)
x.f(2)

Vimのビジュアルモード

範囲x に対して、 引数2 で、 操作f を実行する

# f(x, 2)
# x.f(2)
x2f

Vimの非ビジュアルモード

範囲x に対して、 引数2 で、 操作f を実行する

# f(x, 2)
# x.f(2)
# x2f
2fx

例: 次の空行まで削除

ビジュアルモード

v}d

非ビジュアルモード

d}

非ビジュアルモードの薦め

  • 自分で画面を確認する必要がない! EP確保 (後述)
  • キータイプ数が少ない!
  • 範囲の大きさに依存しない!

dawは?

text-objectの一つ。

詳しくは次のSixeightさんによるtext-objectのためだけのプレゼンに刮目せよ!

Be Lv3

  • Lv3 自分でインストールしたプラギンの数が5を越え、ダメプラギンはすぐに判別できるようになる

Vim plugins

インストール: 単にファイルを置くだけ

  • (大抵の場合) ビルドとかいらないよ!

便利で小さいプラギン

  • quickrun
    • 編集中バッファを「実行」する
  • git-vim
    • gitをラクに使う
  • smartchr
    • いい感じに文字入力をラクにする

便利で大きいプラギン

  • neocomplcache
    • 補完!
  • vimshell
    • Vim scriptで実装されたシェル
  • blogger.vim
    • blogspot.comにブログを投稿する

自己紹介

ujihisa

自分のプロジェクト

  • quickrun.vim (現在はthincaさんがメインブランチ)
  • blogger.vim
  • few

関わっているプロジェクト

  • Termtter
  • Ruby Core

最近の活動

  • アメリカの大学院入試。いまは結果待ち
  • 明後日カナダに帰ります
  • アセンブリ言語勉強しています (LLVM, IA-32)

Be Lv4

  • Lv4 自分で作ったプラギンをvim.orgでリリースし、何人かをLife Changingさせる

プラギンの作り方

  1. Vimを使いまくる
  2. こんな機能があればラクなのになあと思う
  3. Vim標準でその機能があるか調べる :h
  4. www.vim.orgにそのスクリプトがあるか調べる

#

  1. 大抵はすぐにいくつか見つかる
  2. 実際に使ってみる
  3. ヒドい出来具合に発狂する
  4. 自分で実装する
  5. githubで公開する
  6. vim.orgで公開する

今後の発展

  • Vim用語を抑える
  • Vim hacksを毎日読む
  • Lingr Vim Roomに常駐する

Vim用語

  • Bram
  • 教皇
  • エネミー
  • hkn

Vim Hacks

http://vim-users.jp/

  • kana, ujihisa, thinca, Shougo, ukstudioらが執筆
  • 時々ゲスト執筆者も。

ゲスト執筆者は常時募集中!

Lingr Vim Room

http://lingr.com/room/vim/

  • 大勢が常に常駐
  • tsukkeeさんのlingr-vimを使うとさらに快適に!

let g:loaded_vimlectur = 1

Hack #120: gVim でウィンドウの位置とサイズを記憶する

GUI アプリケーションではよく終了時にウィンドウの位置とサイズを記憶し、次回起動時に復元するものを見かけます。Vim でも設定次第で同様のことが可能です。

設定

.gvimrc に以下のように書きます。

let g:save_window_file = expand('~/.vimwinpos')
augroup SaveWindow
  autocmd!
  autocmd VimLeavePre * call s:save_window()
  function! s:save_window()
    let options = [
      \ 'set columns=' . &columns,
      \ 'set lines=' . &lines,
      \ 'winpos ' . getwinposx() . ' ' . getwinposy(),
      \ ]
    call writefile(options, g:save_window_file)
  endfunction
augroup END

if filereadable(g:save_window_file)
  execute 'source' g:save_window_file
endif

解説

g:save_window_file

この変数で指定するファイルにウィンドウの位置やサイズを保存します。expand() は ~ を $HOME に展開するのに必要で、その必要がない場合はなくても問題ありません。

設定の書き出し

augroup SaveWindow 〜 augroup END で、Vim の終了時に発生するイベントを登録しています。

ここでは Vim の終了時に s:save_window() と言う関数を呼ぶようにしています。そしてこの関数のなかで、g:save_window_file にウィンドウの位置とサイズの情報を Vim スクリプトの形式で書き出しています。

設定の読み出し

最後の if でウィンドウ情報ファイルが存在するかをチェックし、存在した場合はそのファイルを :source で読み込みます。情報ファイルは Vim スクリプトとして書き出されているので、:source するだけで位置とサイズが復元されます。

thinca

Hack #119: neocomplcache Hacks(2)  オムニ補完

二回目の今回はオムニ補完です。AutoComplPopでも自動呼び出しが可能ですが、neocomplcacheでは、それに改良を加え、設定しやすくなっています。

オムニ補完とは

オムニ補完とは、Vim組み込みで用意されている補完とは違い、文脈を解析して行う補完です。関数を'omnifunc'に設定し、<C-x><C-o>のキーシーケンスを入力することで呼び出されます。標準でもいくつかの言語のオムニ補完関数が用意されていますが、ユーザーが自分で定義することができます。

inoremap <expr><C-x><C-o> &filetype == 'vim' ? "\<C-x><C-v><C-p>" : neocomplcache#manual_omni_complete()

私はこのようにキーマッピングを設定し、Vim組み込みのオムニ補完を置き換えています。

拡張機能

neocomplcacheのオムニ補完には次のような拡張機能があります。

自動補完の文脈定義

g:NeoComplCache_OmniPatterns[filetype]を設定すれば、呼び出し条件をカスタマイズしたり、呼び出しを無効化することができます。

多数の言語に対応

AutoComplPopでは標準でPerl/Ruby/html/CSS/Pythoのオムニ補完が可能です。neocomplcacheではPerl以外の確認できたすべての言語に対応しています。キーワードパターンに追加するだけなので、新たな言語に対応させることが容易です。

補完スキップ

g:NeoComplCache_EnableSkipCompletionが1ならば(デフォルト)、候補の取得に時間がかかりすぎる場合、補完をスキップすることができます。

ワイルドカード

ほかの補完と同様、ワイルドカードによる絞り込みに対応しています。

エラーを出さない

特定のオムニ補完では、変な場所で呼び出すとエラーを出したりすることがあります。neocomplcacheではエラーをcatchしているので、neocomplcache内部にバグがない限り、オムニ補完中にエラーになることはありません。

補完環境の厳密な判定

PythonやRubyのオムニ補完は:python:rubyが正常に動作する環境でなければ動作しません。よって、内部で判定しています。

ファイル名補完やバッファ名補完との同時呼び出し

オムニ補完とほかの補完を同時に呼び出せないAutoComplPopとは違い、neocomplcacheのオムニ補完はほかの補完と統合されています。 よって、同時に候補を出すことができるので、さらに便利に使えます。 ただし、オムニ補完の開始パターンが先にマッチした場合、オムニ補完の候補のみが計算されて表示されます。 これはVim自体の仕様です。これを防ぐためには、一度補完のポップアップを閉じて、補完を再呼び出しするしかありません。

キーワードの収集

空文字列でオムニ補完を呼び出してキーワードを収集してキャッシュし、オムニ補完候補として利用することができます。

neocomplcacheからオムニ補完関数を呼び出すときの注意

neocomplcacheは大抵のオムニ補完関数に対応していますが、オムニ補完関数を内部で無理矢理呼んで変換するという動作を行っているので、呼び出す関数によっては補完がうまく働かないことがあります。現在、complete_add()関数を内部で呼んでいる場合には動作がおかしくなることがわかっています。これはオムニ補完関数側がcomplete_add()を呼ばないようにするしかありません。 他に、Rubyのオムニ補完は時々フリーズする現象があることが報告されています。 これはRubyのオムニ補完が外部インタフェースを内部で使用しているためだと思われます。 Vimの外部インタフェース機能は不安定なので、時々エラーをはいたりフリーズすることがあります。 無効にしたい場合は.vimrcで

if !exists('g:NeoComplCache_OmniPatterns')
let g:NeoComplCache_OmniPatterns = {}
endif
let g:NeoComplCache_OmniPatterns['ruby'] = ''

と設定すると、無効にできます。これでは不便なので、Rubyのオムニ補完を書き直してくれる人を現在募集中です。

Shougo

Hack #118: ホームディレクトリをラクに入力する

問題

Vimのコマンドラインでホームディレクトリを入力する機会は比較的多いものの、~/という文字列を見ただけで小指に疲労が走ってくるのは、ほとんどのVimユーザに共通するのではないでしょうか。 もしも入力しやすいキー、例えばバックスラッシュなどで一発で~/が入力できれば、どんなに素晴らしいことでしょうか。

解決

以下のコードを~/.vimrcに記述することで、コマンドラインモードでバックスラッシュで~/が入力できる上、~/が来て欲しくなさそうなところではそのままバックスラッシュが入力されます。

function! HomedirOrBackslash()
  if getcmdtype() == ':' && (getcmdline() =~# '^e ' || getcmdline() =~? '^r\?!' || getcmdline() =~? '^cd ')
    return '~/'
  else
    return '\'
  endif
endfunction
cnoremap <expr> <Bslash> HomedirOrBackslash()

この設定を有効にしたVimで:e \と打鍵すると、ただちに:e ~/に展開されます。 また、:s/\と打鍵した場合は、:s/\とそのままになります。(:s/~/のように展開されません)

発展

本Hackはcho45さんの.zshrcへのハックへのアナロジーで考案されました。 残念ながら現在cho45さんの最新版の.zshrcにはそのコードは存在していないようですが、 少し古いところに残っています。 著者の手元の.zshrcから引用すると、以下のようなコードでした。

expand-to-home-or-insert () {
  if [ "$LBUFFER" = "" -o "$LBUFFER[-1]" = " " ]; then
    LBUFFER+="~/"
  else
    zle self-insert
  fi
}
zle -N expand-to-home-or-insert
bindkey "\\"  expand-to-home-or-insert
ujihisa

京都でVim勉強会#5が開催されます

2010年01月31日(日)、京都でVim勉強会が開催されます。

参加登録や詳細はこちらを参照ください。 http://cotocoto.jp/event/37291

※画像はイメージです

a

高まるVim熱!

Hack #117: 置換行為を繰り返す

問題

:substitute (:s)による置換処理は頻繁に使います。 バッファ全体を対象にする場合は:%s/foo/bar/gなどでできますし、 特定範囲のみを対象にする場合はVisual modeで選択しておいて :s/foo/bar/gでできます。

では飛び飛びの場所で置換を行なう場合はどうでしょうか。 例えばソースコード中の特定の関数3つに対して置換を行なうとしましょう。 この場合は3箇所それぞれを対象として置換を実行することになりますが、 毎回 :s/foo/bar/g のような長ったらしいコマンドを入力したくはありません。 <Up>/<Down> でコマンドの入力履歴を辿って実行してもいいのですが、 これらのキーは概して遠い位置にあるため押下が面倒ですし、 押し易いキーバインドを設定することも面倒です。 どうにかして最小の手数で置換行為を繰り返せないでしょうか。

解決方法

以下のコマンドを実行します:

:s

通常、:sには検索パターンと置換文字列を指定しますが、 それらを省略した場合は最後に実行された :sと同じ検索パターンと置換文字列で置換が行なわれます。

なお:sでは :s/foo/bar/gc などのフラグは無視されます。 フラグまで同一にする場合は:sの代わりに

:&&

を使います。

また1行だけ繰り返す場合には:sの代わりに

&

を使うこともできます。

参考資料

kana

Vim使いのレベル10

  • Lv1 vimtutorを終わらせた。あるいは、hjklで移動できて保存と終了ができる
  • Lv2 ビジュアルモードを使うのをやめ、y}dawなどの素晴らしい操作性に自己陶酔する
  • Lv3 自分でインストールしたプラギンの数が5を越え、ダメプラギンはすぐに判別できるようになる
  • Lv4 自分で作ったプラギンをvim.orgでリリースし、何人かをLife Changingさせる
  • Lv5 他のアプリケーション使用時にescやiを打鍵してしまい、イラっとする日々を送る
  • Lv6 シェルは当然vimshell。ネオコンなど大規模プラギンのバグを発見し、パッチ付きで報告する
  • Lv7 Vim本体のソースコードを読み、あまりの魔界に発狂する
  • Lv8 他言語インタフェースif_***を作り、vim_devに投稿する。当然採用されない
  • Lv9 Vim本体の開発への貢献が日常になる。投稿し採用されたパッチ数が10を越える
  • Lv10 神になる

文責: ujihisa

Hack #116: 機能を割り当てるキーを探す際のヒント

Vim に新しくプラグインをインストールした際や、自分で便利な設定を書いた場合、それらの機能を素早く呼び出すために Key mapping を定義したいと思うでしょう。しかし、Vim では標準で多くの機能が各キーに割り当てられていて新しい機能を割り当てる場所が見つからないことがあります。本 hack ではそういった場合の手助けをします。

キーボードを眺める

キーボードを眺めて Vim における各キーの機能を思い出してください。思い出せないキーがあった場合、それはつまりあなたがそのキーの機能を使っていないということです。まずは :help でそのキーの機能を確認し、本当に必要ないと思えばそのキーには新しい便利な別の機能を割り当てられます。

プレフィックスキーを活用する

プレフィックスキーを使うことで、より多くの機能を割り当てることができます。ストローク数は 1 つ増えてしまいますが、キーボードのキーの数を考えるとこれは仕方がないでしょう。

以下にプレフィックスキーとして使えそうなキーを紹介します。

\

\ キーは標準の mapleader キーです。つまり、最初からプレフィックスキーとして使えるように空けられています。

<Space>

<Space> は非常に押し易い位置にあるにも関わらず、Normal mode ではカーソルを右に移動させるだけで、これは l と同じなので使われることは滅多にありません。これを使わない手はないでしょう。

m

m には標準でマークを付けると言う機能が割り当てられていますが、今は Visual mode もあるのでそれほど使われません。これをプレフィックスキーにしてしまうのも良いでしょう。

q

q はキーボードマクロの記録を開始するキーです。キーボードマクロは便利な機能なので潰すべきではありませんが、マクロとして記録できる場所は a から z まで 26 個もあります。そして、大抵はどこに記録したかなどは覚えていられないので、使い慣れた特定のキーを使うと思います。その場合、残りの使わないキーに対して機能を割り当てることができます。

また、再生用の @ キーも同様に使えるでしょう。

あまり使わないキーを退避させる

人によっては、たまにしか使わない、けれどたまには使うので使えないと困る、というキーがある場合があります。s f t などがその例です。 その場合、それらのキーをプレフィックス付きの場所に再マップすることでプレフィックスキーとして使えます。

nnoremap s <Nop>
nnoremap ss s
nnoremap sa func-a
nnoremap sb func-b
thinca

日本のVim業界の近況について

日本のVim業界の近況についてを若者に容易に伝えるのを目的とし、巷で静かなブームとなっている携帯小説の形式を用いて文書を紡ぎ上げることに成功した。以下に記す。

これはujihisaが作成したものをShougoが修正したものである。 また、この作品はフィクションである。どこかで見たようなフレーズがあったとしても、実在の人物とは全く関係ない。

vimプラグインストーリー「Shougoの受難」

──アタシの名前はショウゴ。心に傷を負ったビム使い。モテカワスリムで補完体質の愛されガール♪

アタシがつるんでる友達は補完をやってるネコ、ビムにナイショで 非同期しているビムプロック。訳あって一から実装されたビムシェル。

 友達がいてもやっぱり学校はタイクツ。今日もネコとちょっとしたことで口喧嘩になった。

ビム使い同士だとこんなこともあるからストレスが溜まるよね☆そんな時アタシは一人でギットハブを歩くことにしている。

がんばった自分へのご褒美ってやつ?自分らしさの演出とも言うかな!

 「あームカツク」・・。そんなことをつぶやきながらしつこいプラギンを軽くあしらう。

「カノジョー、ちょっとsystem()させてくれない?」どいつもこいつも同じようなDOS窓付きのコードしかない。

イーマックスはシェルも動いてカッコイイけどなんか薄っぺらくてキライだ。もっと等身大のアタシを見て欲しい。

 「すいません・・。」・・・またか、とセレブなアタシは思った。シカトするつもりだったけど、

チラっと開発者の男の顔を見た。

「・・!!」

 ・・・チガウ・・・今までのコードとはなにかが決定的に違う。スピリチュアルな感覚がアタシのビムを

駆け巡った・・。「・・(カッコイイ・・!!・・これって運命・・?)」

男はBramだった。連れていかれてハックされた。「キャーやめて!」今までやっていなかったパッチをきめた。

「ガシッ!ボカッ!」アタシはSEGVした。キャッシュ(笑)

vim

Home

Search
Feeds
Links
  • 公式
  • 勉強会
  • 情報
  • コミュニティ
  • プラグイン
  • vimrc
  • Meta
    Etc
    Creative Commons License
    This blog is licensed under a Creative Commons License.

    Return to page top