AIでVim Scriptを学んだ
私はVimを使っています。以前は、「Vimがよくわからない。VimScriptよくわからない。」と思ってました。でもAIに聞きつつわかったことがたくさんあります。そのメモを共有します。
Vimは2種類の設定がある
Vimの設定ファイルには、上から順に実行される指定と、イベント駆動の指定があります。
- 上から順に実行される指定
- setやキーマップの指定がこれに対応します。
- Vimの起動時に一回だけ実行されます。
- イベントに対する指定
- autocmdがこれに対応します
- ファイルを開いたとき、保存したとき、など特定のタイミングで実行される指定です。
この二つがあることを理解しておくのが大切で、基本的には、set で全体の設定を整えて、autocmd でファイルタイプや操作ごとの挙動を差し込む、という構造のようです。
そもそも、Vimは起動時に .vimrc を読み込みます。 .vimrcは設定ファイルと呼ばれていますが、実態は、Vim Scriptで書かれたプログラムです。Vimにおいて、設定ファイルとプログラムは同じ言語です。
イベントに対する処理
VimScriptで、特定のイベントに対する処理を記述するには autocmd を使います。
以下が例です。
autocmd FileType python call s:configure_lsp()
- autocmd
- 特定のイベントが起きたら自動実行する処理を示します。
- FileType
- イベントの種類を示します。FileTypeは「ファイルタイプが判定されたとき」です
- python
- FileTypeに対する引数です。対象のファイルタイプがPythonであるときに動きます
- call
- 条件に一致したとき、関数を呼び出すことを示します。
- 他にも
setlocalで直接コマンドを読んだり、executeでExコマンドを実行することもできます。
s:configure_lsp()- callで、呼ぶ関数名を示します。
- s: はこのスクリプト内のローカル関数という意味です。
関数を書く
Vim Scriptで関数を書くには次のようにします。
function! MyFunc(arg1, arg2)
" 処理
return result
endfunction
- function!
- 関数の定義を開始します。
!は同名関数の上書き許可します。ないと再読み込み時にエラーになります。
MyFunc- 関数名を示します。
s:MyFuncのようにs:をつけると、そのファイル内でのみ有効になります。
- arg1, arg2
- 引数を示します。
- 関数内で引数を参照するときは a: をつける
実際に使用例は以下です。
function! s:greet(name)
echo 'Hello, ' . a:name
endfunction
call s:greet('mtb')
" => Hello, mtb
キーマップを設定する
Vimでは特定のキーを押すと特定の処理を実行する、という設定ができます。キーマップです。
その設定例も紹介します。
以下が一つの例です。これを解説します。
nnoremap <buffer> gQ :<C-u>LspDocumentFormat<CR>
これは 「バッファの中では、gQ を押すと、LSPにフォーマットを依頼する」 という設定です。
nnoremap- ノーマルモードのキーマッピングを定義します。
- キーを押すと別のキーに連鎖させたい場合は、
nmapが使えます。 <buffer>- 今開いているバッファだけに有効であることを示します。
- 例えば、FitleType pythonで呼ばれると、Pythonファイルだけに適用される、など
- gQ
- このキーを押したら…、の指定です。
:<C-u>LspDocumentFormat<CR>:でコマンドラインモードに入ります<C-u>で入力済みの範囲指定(数字とか)をクリアします。LspDocumentFormatというコマンドを実行します。<CR>は、Enterを押すことを示し、実行を確定します。
まとめ
色々と説明しましたが、今ではClaudeCodeに設定ファイルを渡せばいい感じに読み込んでくれますし、色々教えてくれます。
過去に個人でVimScriptを学んだ際はなかなか理解できなくて辛かったのですが、AIを使えば簡単に学べて嬉しかったので、記事にしておきました。この活動が誰かの参考になれば幸いです。