Visual mode * 尋找多行文字
PTT Editor 板看到的問題:如何搜尋多行文字? 能不能 Visual 選起來搜尋?
以前從 kana 的 vimrc 看到一個自訂函數 search_the_selected_text_literaly('n')
,這個設計是在 Visual mode 打 * 便能尋找選取的文字。
剛剛發現,處理一下換行字元就能支援多行 pattern 了,具體為
substitute(pattern, '\V\n', '\\n', 'g')
。
成品
" Ref: kana - https://github.com/kana/config vnoremap * :<C-U>set hlsearch<CR>:call <SID>search_selected_text_literaly('n')<CR> vnoremap # :<C-U>set hlsearch<CR>:call <SID>search_selected_text_literaly('N')<CR> function! s:search_selected_text_literaly(search_command) call SaveReg('0') call SaveReg('"') normal! gvy let pattern = escape(@0, '\') let pattern = substitute(pattern, '\V\n', '\\n', 'g') let @/ = pattern call histadd('/', '\V' . pattern) execute 'normal!' a:search_command let v:searchforward = a:search_command ==# 'n' call RestoreReg('0') call RestoreReg('"') endfunction
註:SaveReg
和 RestoreReg
是用來備份 register 的自訂函數,此處不重要,就不寫了。
有 5 個意見
不用那麼麻煩吧。
我的解法:
vnoremap / /\%V
vnoremap ? /\%V/
不解,尤其 /\%V/,這要怎麼用啊?
目的是在visual mode時(已經選取某個區段),
按下搜尋"/",這時候會出現 /%V
後面接著要搜尋的目標字串就可以了。
你會發現選取區段之外的目標字串不會被highlight。
喔,留言會把標籤拿掉,
應該是vnoremap / [ESC]/\%V
把 ] 還有 [ 替換成 大於還有小於符號 就可以了。
喔,那跟這篇的問題不太一樣吔,
你是在 Visual 範圍內搜尋 pattern,
這篇是把 Visual 範圍的內容當成 pattern 再搜尋(如同 * 的功能)。
☂