Vimでユーザー定義コマンドを作る方法(:command)
よく使う長いコマンドや複雑な操作は、毎回タイプするより自分専用のExコマンドとして登録してしまったほうが速くなります。:commandを使えば、プラグインなしでも自作コマンドを定義できます。
目次(6項目)
| 書き方 | これだけ覚える |
|---|---|
command {名前} {実行内容} | コマンドを定義(名前は大文字始まり) |
command! {名前} {実行内容} | 既存定義を上書きして再定義 |
-nargs=1 など | 引数を受け取れるようにする |
delcommand {名前} | 定義したコマンドを削除 |
コマンドを定義する
command {コマンド名} {実行内容}
command! {コマンド名} {実行内容} " 既存定義を上書き
command AllCopy :normal ggyG
コマンド名は必ず大文字で始める必要があります。これはVim組み込みコマンドと名前が衝突しないようにするための決まりで、小文字始まりでは定義できません。
要点:コマンド名は大文字始まりが必須です。再定義したいときは
command!と!を付けます。引数を受け取る
デフォルトでは引数を取りません。引数を使いたい場合は-nargsで数を指定し、コマンド定義側で<args>を使って受け取ります。
command! -nargs=1 Ffind :!find / -name "<args>" -print
command! -nargs=+ Say :echo "<args>"
-nargsには次の値が指定できます。
| 指定 | 意味 |
|---|---|
-nargs=0 | 引数なし(省略時のデフォルト) |
-nargs=1 | 引数1個 |
-nargs=? | 引数なし、または1個 |
-nargs=* | 引数いくつでも |
-nargs=+ | 引数1個以上 |
実用的な設定例
OSコマンドの実行を短縮する使い方が特に定番です。
command! AptUpdate :!sudo apt update
command! AptUpgrade :!sudo apt upgrade -y
command! CheckScripts :put =execute('scriptnames')
Vim Script側の関数を呼び出すパターンもよく使われます。
command! AutoSaveToggle :call AutoSaveToggle()
コマンドを削除・確認する
delcommand {コマンド名} " 指定したコマンドを削除
comclear " すべてのユーザー定義コマンドを削除
command {コマンド名} " その名前で始まるコマンドの定義内容を一覧表示
キーマッピングと組み合わせる
定義したユーザーコマンドはキーにマッピングすると、さらに呼び出しが速くなります。
command! AllCopy :normal ggyG
nnoremap <leader>ya :AllCopy<CR>
ユーザー定義コマンドは省略入力もできますが、他のコマンドと区別がつかなくなる長さまで削ると曖昧エラーになります。スクリプト内で使うときは省略せずフルネームで書くのが安全です。
使ってみて
deploy用のシェルスクリプトをVimから直接呼び出したくて:command! -nargs=* Deploy :!./deploy.sh <args>のように登録しています。ターミナルに切り替えずに済むので、設定ファイルを直したらそのままデプロイまで一直線に進められ、作業が途切れません。
まとめ
頻繁に使うコマンドや長いOSコマンドは:commandで自作コマンド化しておくと入力が短縮でき、補完も効くようになります。キーマッピングと組み合わせれば、さらに呼び出しが速くなります。