コマンドラインからシームレスにover.vimの全体置き換えを使う
私は今まで:s
について以下の設定をしていた。
cnoreabb <expr>s getcmdtype()==':' && getcmdline()=~'^s' ? '%s/<C-r>=Eat_whitespace(''\s\\|;\\|:'')<CR>' : 's' function! Eat_whitespace(pat) "{{{ let c = nr2char(getchar(0)) if c=~a:pat return '' elseif c=~'\r' return '' end return c endfunction "}}}
こうしておくと、コマンドラインでs
と打ってから<Space>キーで %s/
という具合に展開されていたので、全体置き換えをするときに打ちにくい %
を打たなくて済むという利点があった。
そんな折、osyo-manga/vim-over がリリースされた。
結果をプレビューする機能はCoolだがぶっちゃけそんなに要らなかったが、置き換え実行後にカーソルが動くことがないというのに魅力を感じたので、上記の操作を over.vim で置き換えることにした。
以下のように設定することでコマンドラインで s
を打ってから<Space>を打つと、そのままover.vimで %s/
が入力された状態になる。
cnoreabb <silent><expr>s getcmdtype()==':' && getcmdline()=~'^s' ? 'OverCommandLine<CR><C-u>%s/<C-r>=get([], getchar(0), '')<CR>' : 's'
Vimのabbreviate(短縮入力)機能によって、行頭でのs
をOverCommandLine<CR><C-u>%s/
に置き換えているわけである。
その際、トリガーに使った<Space>は不要なのでgetchar(0)に食わせている。
<C-r>=get([], getchar(0), '')<CR>
の部分はトリガーに使った文字の処分である。
別にトリガーは短縮入力を展開できる文字なら何でも良いので<Space>でなくて<CR>でも良い。