Vimでユーザー定義コマンドを作る方法(:command)
よく使う長いコマンドや複雑な操作は、毎回タイプするより自分専用のExコマンドとして登録してしまったほうが速くなります。:commandを使えば、プラグインなしでも自作コマンドを定義できます。
| 書き方 | これだけ覚える |
|---|---|
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()
引数の補完を効かせる
引数を受け取るコマンドは、-completeを足しておくとTabで候補が出るようになります。ファイル名を渡すコマンドなら-complete=fileで、組み込みコマンドと同じ感覚で補完できます。
command! -nargs=1 -complete=file Open :edit <args>
指定できる種類はファイルのほかにバッファ・ディレクトリ・ヘルプ・オプション名など複数あり、:help :command-completeに一覧があります。設定した内容は:commandの一覧のComplete列に出るので、効いているかどうかはそこで確かめられます。
コマンドを削除・確認する
delcommand {コマンド名} " 指定したコマンドを削除
comclear " すべてのユーザー定義コマンドを削除
command {コマンド名} " その名前で始まるコマンドの定義内容を一覧表示
キーマッピングと組み合わせる
定義したユーザーコマンドはキーにマッピングすると、さらに呼び出しが速くなります。
command! AllCopy :normal ggyG
nnoremap <leader>ya :AllCopy<CR>
ユーザー定義コマンドは省略入力もできますが、他のコマンドと区別がつかなくなる長さまで削ると曖昧エラーになります。スクリプト内で使うときは省略せずフルネームで書くのが安全です。
deploy用のシェルスクリプトをVimから直接呼び出したくて:command! -nargs=* Deploy :!./deploy.sh <args>のように登録しています。ターミナルに切り替えずに済むので、設定ファイルを直したらそのままデプロイまで一直線に進められ、作業が途切れません。
まとめ
頻繁に使うコマンドや長いOSコマンドは:commandで自作コマンド化しておくと入力が短縮でき、補完も効くようになります。キーマッピングと組み合わせれば、さらに呼び出しが速くなります。定義したコマンドを<leader>付きのキーに割り当てる書き方はLeaderキーの記事に、例に出てきたscriptnamesの読み方は設定ファイルが読み込まれないときの調べ方にあります。なお小文字で始まる名前を定義しようとするとE183: User defined commands must start with an uppercase letterというエラーになります。定義できないと感じたときは、まず名前の先頭を確認してください。引数を付けずに:commandだけを実行すると、定義済みのコマンドが名前・引数・補完の設定とあわせて一覧表示されるので、自分が何を登録したか分からなくなったときはここを見るのが早いです。