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' は閉じ括弧に続くテキストに一致する正規表現を値に持ちます。

リストなので複数登録しておくことも可能です。これで関数囲みの削除が捗りますね!