✌️

Vimの検索の正規表現モードを切り替える

2022/12/12に公開

https://zenn.dev/vim_jp/articles/2022-12-12-vim-plugin-thanks#11.-monaqa%2Fmodesearch.vim

↑ こちらのmonaqaさんの記事で紹介されていたmodesearch.vimのアイデアに感銘を受け、いまならsetcmdline()を使えるのではないかと思い、作ってみました。

function! s:toggle_magic_search() abort
  if getcmdtype() !~ '[/?]'
    return ''
  endif

  let query = getcmdline()
  let pos = getcmdpos()

  if query[:1] ==# '\v'
    " \v -> \V
    let query = '\V' .. query[2:]
  elseif query[:1] ==# '\V'
    " \V -> \v
    let query = '\v' .. query[2:]
  else
    " add \v
    let query = '\v' .. query
    let pos += 2
  endif
  call setcmdline(query, pos)

  " to update search, type space and remove it
  return " \<bs>"
endfunction

cnoremap <expr> <C-x> <sid>toggle_magic_search()

検索欄の入力状態に応じ、\v\Vをトグル(何もついていない場合は\vを追加)します。
なお、setcmdline()でコマンドラインを更新するだけでは画面のincsearchの状態が更新されなかったので、" \<bs>"でキー入力を発生させ、画面を更新しています。


正規表現検索かどうかで.のマッチ範囲が切り替わる


[追記] プラグイン化しました

https://zenn.dev/kawarimidoll/articles/4d31576fb9f67b

Discussion