operator-sequence.vim ってのを作ってみた

operator、使ってますか? motion や textobj と組み合わせてあれこれできるアレです。標準だと対して数は多くないけど、operator-user を使えば簡単に定義できるし、この辺りを探せばいくつか公開されているものもあります。
ところで、複数の operator を一度に適用したいと思ったこと、ありません? ない? まあ、普通はないよね。と言うのも、operator って種類が少なすぎるから…もっとあってもいいのに。
で、ですね。先日 operator-camelize を使ってみて、decamelize してから大文字にしたい!って思ったわけです。つまり、

TheSomeVariable
↓
THE_SOME_VARIABLE

にしたい、と。decamelize しただけだと小文字なので、そこから更に gU すれば可能です。でも毎回やるの面倒。textobj を 2 回入力しないといけないし。連続して適用する operator が欲しい!ってわけで、複数の operator を連続して適用する operator を生成する、operator-sequence.vim ってのを作ってみた。

https://github.com/thinca/vim-operator-sequence

使い方

以下のようにします。

noremap <expr> <Leader>U operator#sequence#map("\<Plug>(operator-decamelize)", 'gU')

これで <Leader>U と言う operator が定義されて、<Leader>Uiw とかすればカーソル位置の単語を decamelize してから大文字にできる。
別の例。

noremap <expr> <Leader>y operator#sequence#map('g?', 'y', ['u'])

文字列を配列に包んで渡すと、そこは operator ではなく普通の入力になる。見た目重視でこの仕様にした。
この例では、対象を Rot13 したものを yank する。誰得。*1
他の operator みたいに <Leader>y<Leader>y で現在行を対象にできたり、これに count を付けて行数を指定したりもできる。もちろんビジュアルモードも利用可能。
指定したキーシーケンスは <Plug> が使えるのを見てわかるように、map は展開される。組み込みの operator を置き換える方法は直接はサポートしてないけど、以下のようにすればできる。

noremap <Plug>(builtin-y) y
noremap <expr> y operator#sequence#map('g?', "\<Plug>(builtin-y)", ['u'])

これで y を上書きして、普通に yank するだけで Rot13 された結果が yank されます。この設定質の悪いいたずらにしか見えない…。



使い道があまり思い付かないけど、ひょっとしたら使えることがあるかもしれないので、もし便利な設定があったら教えてください!

*1:Rot13 だと誰得だけど、URL Encode とかだとまだ使えるかもしれない。operator 作らないとないけど。