読者です 読者をやめる 読者になる 読者になる

コマンドラインからシームレスに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(短縮入力)機能によって、行頭でのsOverCommandLine<CR><C-u>%s/に置き換えているわけである。
その際、トリガーに使った<Space>は不要なのでgetchar(0)に食わせている。
<C-r>=get([], getchar(0), '')<CR>の部分はトリガーに使った文字の処分である。
別にトリガーは短縮入力を展開できる文字なら何でも良いので<Space>でなくて<CR>でも良い。