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

註:SaveRegRestoreReg 是用來備份 register 的自訂函數,此處不重要,就不寫了。