この記事は Vim 8.0 Advent Calendar の 16 日目の記事です。
Vim 8.0 で利用できる新しい Ex コマンドのうち、まだ紹介していないものを紹介します。
:filter[!] {pat} {command}
{command}
の出力のうち、{pat}
で指定した正規表現にマッチする行だけを表示します。[!]
を指定すると、逆にマッチしない行だけを表示します。
{pat}
は /foo/
のように /
などの記号で囲われた形式です。ただし、パターンが記号などを含まない場合は /
は省略できます。
以下に使用例を挙げます。
" マークを記録してあるファイルのうち、.txt で終わるものを表示します。
filter /\.txt$/ oldfiles
" 読み込まれた Vim script のうち、パスに vimrc を含むものを表示します。
filter vimrc scriptnames
" 開かれているバッファのうち、.vim を含むものを表示します。
filter /\.vim/ buffers
" キーマッピングのどこかに <C-r> を含むものを表示します。
execute "filter /\<C-r>/ map"
" 現在のバッファから、foo を含む行を表示します。
filter foo %print
" ↑の例は :global でも実現できます。
global/foo/print
最後に注意点として、この Ex コマンドは全ての出力をフィルタするわけではありません。例えば、:echo
の結果はフィルタされません。
:keeppatterns {command}
検索履歴に手を加えずに {command}
を実行します。
:substitute
(:s///
) や :global
などの一部の Ex コマンドは、通常は Vim script 中で使った場合でもパターンが検索履歴に追加されてしまいます。これはプラグインの中などで使う場合に問題になります。
そこでこの :keeppatterns
Ex コマンドを使って :keeppatterns global/.../
などのようにすることで、検索履歴が変更されてしまうのを防ぐことができます。
これは {command}
の実行中はずっと手を加えないということではなく、直接指定した Ex コマンドが検索を使うものだった場合だけ有効です。つまり以下の場合は、検索履歴は変更されてしまいます。
" :execute を挟む
keeppatterns execute "s/\<CR>//ge"
" 関数経由
function! s:work() abort
s/\e//ge
endfunction
keeppatterns call s:work()
:noswapfile {command}
{command}
を実行します。このとき、新しいバッファが開かれた場合はスワップファイルを作成しません。
これはプラグインが仮想バッファを作成する際に便利です。
この Ex コマンドも :keeppatterns
Ex コマンドと同様、バッファを開くコマンドを {command}
に直接指定した場合のみ有効です。
ただし、:vertical
Ex コマンドや :leftabove
Ex コマンドなどの、ウィンドウを開く先を指定する修飾子コマンドは含まれていても問題ありません。
:clearjumps
現在のウィンドウのジャンプリストを空にします。
カーソルを大きく移動させるコマンドを実行したり、バッファを移動したりした場合、そのカーソルの移動はジャンプリストに記録され、あとから辿って移動することができます。
これは多くの場合便利ですが、例えばプラグインが仮想バッファを開いた際などに、戻れてしまうと不便な場合もあります。そういった場合にこの Ex コマンドが使えます。
:helpclose
現在のタブページにヘルプウィンドウがあれば、1 つだけ閉じます。
これは現在のウィンドウがヘルプウィンドウではない場合にも動作するので、離れた場所にあるヘルプウィンドウを閉じるのに便利です。
1 つもヘルプウィンドウがない場合は特にエラーにもならず、何も起きません。