[Vim問題] 独自のExコマンドを設定するには?

この記事は約28分で読めます。

この記事では、Vim / neovim で「ユーザー定義コマンドを設定する」ためのExコマンドについて、ご紹介します。

[解答] :command

Vimでは、よく使うコマンドを任意の名前でExコマンドとして定義することができます。これをユーザー定義コマンドと呼びます。

これによって、自作のExコマンドを設定して、入力を省略することが可能になります。

ユーザー定義コマンドを定義する

(ノーマルモード)
:command {コマンド名} {実行コマンド}
:command! {コマンド名} {実行コマンド} (強制上書き)
:com {コマンド名} {実行コマンド} (省略系)

{コマンド名}は大文字で始める必要があります。

また、:command! で定義すると、以前定義されたコマンドは再定義できますが、Vim標準で予め定義されているExコマンドは上書きできないものもあります。

ユーザー定義コマンドを削除する

(ノーマルモード)
:delcommand {コマンド名} (指定したユーザー定義コマンドの削除)
:delc {コマンド名} (上の省略)
:comclear (すべてのユーザー定義コマンドを削除する)
:comc (上の省略)

ユーザー定義コマンドは適宜削除することが可能です。ただ、先ほどの通り、:command! で上書きするなら活躍機会がないという話もありますね。

ユーザー定義コマンドの一覧表示

:command {コマンド名}
:com {コマンド名}

{コマンド名}で始まるユーザー定義コマンドの定義内容を一覧表示します。

設定例

色んな設定パターンがあって、かなり便利です。

:command! AllCopy :normal ggyG
:command! AllCom :normal gg=G
:command! CheckScripts :put =execute('scriptnames')
:command! CheckVersion :put =execute('version')
:command! CheckSet :put =execute('set')

次のように、プラグインで設定されているケースもあります。

:command! Hexplore call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
:command! AutoSaveToggle :call AUtoSaveToggle()

また、OSコマンドを省略させるのも手です。実はこちらのパターンのほうが多いかも。

:command! Pddr :!python download_daily_report.py
:command! Pcdr :!python convert_daily_report.py
:command! -nargs=1 Ffind :!find / -name "<args>" -print
:command! AptUpdate :!sudo apt update
:command! AptUpgrade :!sudo apt upgrade -y

なんらかVim Script / プラグインの関数を呼び出すような設定の方が合っているかもしれません。

補足

ユーザー定義コマンドを作るメリットは、入力の短縮と応用範囲の広さにあります。

特に入力の短縮については、短いExコマンドで実行できるようになるだけでなく、補完が効くようになるのが大きいメリットです。そのため、少し長めのユーザー定義コマンドを作っても大丈夫です。

また、このユーザー定義コマンドを作ってキーをマップすれば、更に便利になるわけです。もちろん、作れば作るほど複雑になってしまうわけではあるのですが….

あと、ヘルプを見るとわかるのですが、このユーザー定義コマンドは他にもたくさん設定できる内容があります。

  • 引数の扱い方
  • 補完の動作
  • 適用範囲の指定 など

複雑な内容も設定できますが、まずは単純な動作をユーザー定後コマンドとして登録して、作業を楽にするところから始めましょう。

ヘルプ以外には、こちらを読むのが参考になるでしょう。

vim-jp » Hack #158: ユーザコマンドを定義する

このVimコマンドの補足情報

  • 利用頻度2.0
  • 便利さ5.0
  • 覚え易さ3.0

関連するVimヘルプ

Vim のヘルプでは下記のように解説されています。

4. ユーザー定義コマンド (User-defined command)          user-commands

ユーザー独自のExコマンドを定義することできます。ユーザー定義コマンドはビルトイ
ンコマンドと同様に振る舞うことができます(範囲指定や、引数を取ることができます。
引数の入力では、ファイル名、バッファ名などを補完できます)。違いは、コマンドが
実行されると、通常の Ex コマンドに変換してから実行されるということです。

まずはユーザーマニュアルの40.2を参照してください。

E183E841user-cmd-ambiguous
すべてのユーザー定義コマンドは大文字で開始する必要があります。これはビルトイン
コマンドと混同しないようにするためです。特例として次のようなビルトインコマンド
もありますが:
        :Next
        :X
これらの名前もユーザー定義コマンドには使えません。”:Print” コマンドも存在しま
すがこれは非推奨 (deprecated) になっており、上書きすることができます。

ユーザーコマンドの開始文字以外は、大文字であっても小文字であっても、数字であっ
てもかまいません。数字を使う場合、数字を引数に取る他のコマンドが曖昧になるかも
しれないので注意してください。例えば、”Cc2″ コマンドは “:Cc2” という引数なしの
ユーザーコマンドとしても、”2″ という引数を取った “:Cc” コマンドとしても解釈で
きます。これらの問題を避けるため、コマンド名と引数の間にスペースを挿入すること
を勧めます。

ユーザー定義コマンドを使うときに、コマンドの省略形を使うこともできます。しかし
ながら、その省略形が唯一でなければエラーが起きます。加えて、ビルトインコマンド
が常に優先されます。

例:
        :command Rename …
        :command Renumber …
        :Rena                           ” “Rename” を意味します
        :Renu                           ” “Renumber” を意味します
        :Ren                            ” エラー – 曖昧
        :command Paste …
        😛                              ” ビルトインコマンドの:Print です
スクリプトの中で使うときは、ユーザー定義コマンドの完全な名前を使うようにしま
しょう。

:com[mand]                                              :com:command
                        すべてのユーザー定義コマンドを一覧表示します。表示中の
                        行頭の文字は次の意味です:
                            !   -bang 属性を持つコマンド
                            ”   -register 属性を持つコマンド
                            |   -bar 属性を持つコマンド
                            b   カレントバッファのローカルコマンド
                        (属性に関する詳細は下記参照)
                        一覧は :filter を用いてコマンド名でフィルタできま
                        す。例えば名前に “Pyth” を含む全コマンドを一覧するなら
                        ば次のようにします:
                                filter Pyth command
:com[mand] {cmd}        {cmd} で始まるユーザー定義コマンドを一覧表示します。

:command-verbose
‘verbose’ がゼロ以外のときにコマンド一覧を表示すると、どこで定義されたのかも表
示されます。例:

    :verbose command TOhtml        Name        Args Range Complete  Definition
        TOhtml      0    %               :call Convert2HTML(<line1>, <line2>)
            Last set from /usr/share/vim/vim-7.0/plugin/tohtml.vim

詳しくは :verbose-cmd を参照してください。

E174E182
:com[mand][!] [{attr}…] {cmd} {rep}
                        ユーザー定義コマンドを定義します。コマンド名は {cmd}
                        でそれを置き換えるテキストが {rep} です。{attr} はコマ
                        ンド属性(下記参照)です。既にコマンドが存在している場合
                        はエラーになります。! を指定した場合は再定義されます。
                        1つ例外があります: スクリプトを再読み込みする場合、そ
                        のスクリプトで以前に定義されていたコマンドは、静かに置
                        き換えられます。

:delc[ommand] {cmd}                             :delc:delcommandE184
                        ユーザー定義コマンド {cmd} を削除します。

:comc[lear]                                             :comc:comclear
                        すべてのユーザー定義コマンドを削除します。

40.2  コマンドラインコマンドを定義する

Vim では新しいコマンドを定義することができます。定義したコマンドはコマンドライ
ンモードの他のコマンドと同じように使えます。
コマンドを定義するには “:command” コマンドを使います:

        :command DeleteFirst 1delete
“:DeleteFirst” コマンドを実行すると、”:1delete” が実行され、最初の行が削除され
ます。

        Note:
        ユーザー定義コマンドの名前は必ず大文字で開始する必要があります。”:X”、
        “:Next”、”:Print” を使うことはできません。アンダースコア (“_”) も使え
        ません。数字は使えますがお勧めしません。

ユーザー定義コマンドの一覧を見るには、次のコマンドを実行します:

        :command
組み込みコマンドと同じように、ユーザー定義コマンドも省略できます。他のコマンド
と区別するのに十分な長さの文字を入力するだけでコマンドを実行できます。コマンド
ライン補完を使って完全な名前を得ることもできます。

引数の数
——–

ユーザー定義コマンドは引数を取ることができます。引数の数は -nargs オプションで
指定する必要があります。例えば、上述の :DeleteFirst コマンドは引数を取らないの
で、次のように定義できます:

        :command -nargs=0 DeleteFirst 1delete
指定が無ければ 0 が使われるので、わざわざ “-nargs=0” を指定する必要はありませ
ん。-nargs には次の値を指定できます:

        -nargs=0        引数なし
        -nargs=1        引数 1 個
        -nargs=*        いくつでも
        -nargs=?        引数なし、もしくは 1 個
        -nargs=+        引数 1 個以上

引数の使い方
————

コマンド定義の中では、<args> キーワードを使って引数を表します。例:

        :command -nargs=+ Say :echo “<args>”
次のコマンドを実行すると:

        :Say Hello World
“Hello World” と表示されます。引数に引用符 (“) が使われると、これはうまく動き
ません。例:

        :Say he said “hello”
特殊な文字が含まれているときにそれを適切にエスケープして文字列として使えるよう
にするには “<q-args>” を使います:

        :command -nargs=+ Say :echo <q-args>
上記の “:Say” コマンドを実行すると、次のコマンドが実行されます:

        :echo “he said \”hello\””
<f-args> キーワードを使うと、引数が関数呼び出しに適した形に展開されます。例:

        :command -nargs=* DoIt :call AFunction(<f-args>)
        :DoIt a b c
次のコマンドが実行されます:

        :call AFunction(“a”, “b”, “c”)

範囲指定
——–

いくつかのコマンドは範囲指定を受け付けますが、そのようなコマンドを定義したい場
合は -range オプションを使います。このオプションには次の値を指定できます:

        -range          範囲指定を許可。省略時は現在行が選択される。
        -range=%        範囲指定を許可。省略時はファイル全体が選択される。
        -range={count}  範囲指定を許可。範囲指定の最後の数値だけを使う。省略時
                        は {count} が使われる。

範囲指定を使う場合は、<line1> キーワードと <line2> キーワードを使って範囲の最
初と最後の行を取得できます。例えば、次のコマンドは、指定された範囲のテキストを
“save_file” に保存するコマンドを定義しています:

        :command -range=% SaveIt :<line1>,<line2>write! save_file

他のオプション
————–

使用できるオプションやキーワードは他にもあります:

        -count={number}         カウント指定を受け付ける。省略時は {number}。
                                カウント指定は <count> キーワードで取得できま
                                す。
        -bang                   ! の指定を受け付ける。! が使われた場合は
                                <bang> キーワードが ! に置き換わります。
        -register               レジスタの指定を受け付ける。(省略時は無名レジ
                                スタ。)
                                指定されたレジスタは <reg> (または <register>)
                                で取得できます。
        -complete={type}        コマンドライン補完の種類を指定する。使用できる
                                補完の種類は :command-completion を参照。
        -bar                    コマンドの後ろに | を使って他のコマンド (ある
                                いはコメント) を続けて書くことを許可する。
        -buffer                 カレントバッファでのみ使用できるコマンドを定義
                                する。

最後に <lt> キーワードを説明します。これは文字 “<” を意味します。<> 表記をエス
ケープして、特殊な意味を消すために使います。

再定義と削除
————

同じ名前のコマンドを再定義したい場合は ! を使います:

        :command -nargs=+ Say :echo “<args>”
        :command! -nargs=+ Say :echo <q-args>
コマンドを削除したい場合は “:delcommand” を使います。削除したいコマンドの名前
を引数に指定してください。例:

        :delcommand SaveIt
次のコマンドですべてのユーザー定義コマンドを削除できます:

        :comclear
コマンドの削除はアンドゥできないので注意してください。

ユーザー定義コマンドについての詳細はリファレンスマニュアルを参照してください。
user-commands

こちらは、Vim上では下記のコマンドでヘルプを確認できます。

:help com
:help command
:help 40.2

ヘルプで検索するときは、通常は大文字小文字は識別されませんので、どちらでも構いません。

参考書籍

こちらの書籍が参考になります。


Vim/neovim関連の書籍で、もっとも評判が良くてバイブルと呼んでる人もいる一冊です。Vim/neovimのバージョンに依存しない沢山のTips形式で、その表題通りに「思考のスピードで編集」できるようになるノウハウが詰まっています。その高い評価は Amazon のレビューからも分かる通りです。Vimmer なら必ず一度は読んでおいて間違いありません。


こちらもVim関連の書籍で評価が高い書籍の一冊です。vim-jpで見かける上級Vimmer(Vimサポーターズ)の皆様による、Vimを実践で使ったノウハウからプラグイン関連の情報が詰まっています。日本の Vim界隈を知る上でも是非一読しておきたい一冊です。

Vim/neovim の設定ファイルやプラグインなど、Vim script に関するノウハウがいくつも詰まった一冊です。日本で Vim Script をここまで深く解説している唯一の書籍と言えます。Vim力を伸ばしたいと考えるなら、絶対に避けては通れない書籍でしょう。

プロフィール
管理人
Vim太郎

Vim力アップして、そろそろ上級 Vimmer の仲間入りしたいIT系エンジニアの端くれです。読んでくる訪問者の皆様と一緒に、Vim力を上げていくことができる記事が書ければと考えています。

\フォローする/
Vim設定
\ シェアする /
\フォローする/
関連記事
Vim入門
タイトルとURLをコピーしました