vim-sandwich で関数を消す
Vim の話です。
vim-sandwich というプラグインを以前書きまして、これを更新したよ、というのがこの記事の内容です。
これは何?
ざっくりといえば、vim-surround クローンであり、おおよそ対応する機能を持っています。つまり、テキストオブジェクトを括弧やクオーテーションなどで囲んだり、これらを削除・置換したりするためのプラグインです。
- 囲む
foo → (foo)
- 削除
(foo) → foo
- 置換
(foo) → [foo]
vim-surround よりも拡張性に主眼を置いており、複雑な動作をユーザーが定義できるようになっています。
何が変わったのか?
vim-sandwich の機能の一つに関数囲みの削除があります。(参考) 関数名まで含めて括弧を消す、というわけです。
func(foo) → foo
しかし、言語によっては関数名の記述はちょっと違ったりしますね。例を上げれば、Vim script を書くときには頻繁に s:func()
という感じの関数名を書きます。このようなかんじで関数名のパターンもカスタムしたい、という要望がきたのでできるようにしました。
Allow user to customize function name to delete · Issue #71 · machakann/vim-sandwich · GitHub
以下のような変数を定義することでグローバルなルールを定義できます。foo::bar.baz()
のようなものを関数として認識したい場合は次のような設定を vimrc などに書きます。
let g:sandwich#magicchar#f#patterns = [ \ { \ 'header' : '\<\h\k*::\h\k*\.\h\k*', \ 'bra' : '(', \ 'ket' : ')', \ 'footer' : '', \ }, \ ]
あるいは、b:sandwich_magicchar_f_patterns
を使えばバッファローカルなルールを定義できます。これは主にファイルタイプに特有のパターンを記述するのに使われるでしょう。先の Vim script の例で言えば次のようになります。
augroup sandwich-filetype-vim autocmd Filetype vim let b:sandwich_magicchar_f_patterns = [ \ { \ 'header' : '\C\<\%(\h\|[sa]:\h\|g:[A-Z]\)\k*', \ 'bra' : '(', \ 'ket' : ')', \ 'footer' : '', \ }, \ ] augroup END
(ただし、上の設定は vim-sandwich が持つのでユーザーが自ら設定する必要はありません。)
リストの要素の辞書一つが、一種の関数のパターンに対応しており、四つのキー ('header', 'bra', 'ket', 'footer') を持っていなければいけません。'header' は関数名に一致する正規表現、'bra' は開き括弧、'ket' は閉じ括弧に一致する正規表現、'footer' は閉じ括弧に続くテキストに一致する正規表現を値に持ちます。
リストなので複数登録しておくことも可能です。これで関数囲みの削除が捗りますね!