✌️
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>"
でキー入力を発生させ、画面を更新しています。
正規表現検索かどうかで.
のマッチ範囲が切り替わる
[追記] プラグイン化しました
Discussion