vim的搜索與替換

在使用編輯器的過程當中,咱們會常常使用到搜索 / 替換,大部分編輯器能夠經過快捷鍵呼出搜索框來搜索 / 替換,經過選擇不一樣的選項能夠作到匹配大小寫,精準匹配,模糊匹配等等。那麼在vim中,這些操做該如何實現?本文將介紹在vim中經常使用的搜索文本,替換文本操做以及如何結合插件實現更強大的搜索。git

利用vim自帶搜索

對於搜索當前打開文件,vim自帶搜索功能足以應對,在Normal modal下鍵入/,便可進入搜索模式,此時輸入想要搜索的單詞而後回車,便可完成搜索,光標會跳到當前搜索到的第一個匹配的單詞。按下n,光標跳到下一個匹配的單詞,按下Nshift+n)光標會跳到上一個匹配的單詞。github

除了在Normal modal下能夠鍵入/開始搜索外,還能夠鍵入如下符號開始搜索:golang

  • ?:與/相反,鍵入該符號後反向向上搜索
  • *:搜索當前光標所在單詞,例如:若是當前光標所在單詞是set,則至關於鍵入/\<set\>
  • #:搜索當前光標所在單詞,至關於鍵入?\<set\>

其中\<是單詞界定符,表示只匹配單詞的開頭,/>表示只匹配單詞的末尾vim

此外vim搜索還支持正則,例如輸入/se$表示搜索以se結尾的單詞,輸入/^se表示搜索以se開頭的單詞編輯器

高亮搜索結果

默認狀況下,搜索的結果不會高亮,只是光標會跳到搜索到的單詞,若是想要高亮搜索結果,能夠在Normal modal下輸入:set hlsearch,或者在.vimrc文件中設置:函數

" search result heighligh, when enter `:noh` in command line , clean heightlight set hlsearch 複製代碼

這樣設置後,在搜索完成後,全部的匹配文本都會高亮,想要取消搜索結果的高亮能夠在Normal modal下輸入:nohlsearch或其簡寫:nohui

搜索大小寫敏感

在使用vim的搜索默認是大小寫不敏感的,若是想要讓vim搜索作到大小寫敏感,能夠在輸入想要搜索的單詞後面添加\C,對應的若是使用\c,則表示搜索大小寫不敏感。spa

或者直接在.vimrc中添加設置:插件

" 開啓大小寫不敏感(默認值) set ignorecase " 開啓智能推測
set smartcase
複製代碼

開啓智能推測後,若是輸入的文本帶有大寫字母,vim會認爲你當前搜索是區分大小寫的,不然不區分大小寫。即開啓後,若是輸入:Set,則只能搜索到Set,可是若是輸入:set,則能夠搜索到setSet命令行

vim中的替換

對於替換當前打開文件中的文本,vim提供以下語法:

:{做用範圍}s/{目標字符}/{替換的字符}/{替換標誌}
複製代碼

做用範圍:用於指定替換的範圍,1,3表示替換第一行至第三行,1,$表示替換第一行到最後一行,也能夠直接用%表示。 替換標誌(能夠組合使用):

  • c: confirm,每次替換前都會詢問
  • e:不顯示error
  • g: globe,不詢問,整個替換
  • i: ignore,即不區分大小寫

具體的用法能夠查看下圖(摘自Reddit):

  • :%s/remember/me/n命令不會替換任何東西。 只是告訴咱們若是咱們運行命令,受影響的行數。實際操做過程當中,在vim中運行該命令,顯示89 matches on 89 lines

  • :%s/remember/me/&命令沒看明白作什麼用

利用插件在vim中搜索

有時候須要在整個項目中搜索文件或者文本,這類操做藉助插件更方便一些。

提及vim中搜索文件,就必定會想到大名鼎鼎的ctrlp.vim,但該插件早已再也不維護(最近一次提交是在2015年11月30日),那是否還有其餘替代插件呢?答案是有的,可使用fzf.vim。fzf.vim支持文件搜索,全局文本搜索,buffer搜索,git log搜索等,這裏只介紹最經常使用的全局文本搜索和文件搜索。

首先使用vim-plug安裝插件:

Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
複製代碼

從以上安裝能夠看到要想使用fzf.vim,須要首先安裝fzf

fzf是一款golang編寫的命令行模糊查找器,支持文件,命令等的模糊搜索。強烈建議使用,對於常常使用終端的同窗來講太方便了。


備註:

若是要安裝fzf,在macOS直接:brew install fzf便可。若是經過brew安裝過fzf,則vim-plug的配置以下:

Plug '/usr/local/opt/fzf'
Plug 'junegunn/fzf.vim'
複製代碼

安裝完成後在.vimrc中添加以下配置:

" fzf " fzf use rg search config
let g:fzf_layout = { 'down': '~70%' }
command! -bang -nargs=* Rg
      \ call fzf#vim#grep(
      \   "rg --column --line-number --no-heading --color=always --smart-case "
      \   .(len(<q-args>) > 0 ? <q-args>: '""'),
      \   1,
      \   <bang>0 ? fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}, 'up:60%')
      \   : fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}, 'right:50%:hidden', '?'),
      \   <bang>0)
command! -bang -nargs=? -complete=dir Files
  \ call fzf#vim#files(<q-args>, fzf#vim#with_preview(), <bang>0)

" fzf vim nnoremap <silent> <Leader>rg :Rg<CR> nnoremap <leader>b :Buffers<CR> nnoremap <C-p> :Files<CR> 複製代碼

關於fzf.vim的配置有幾點說明:

  • fzf_layout用於設置調用fzf搜索的窗口位置以及大小,能夠設置leftrightdownup
  • fzf.vim內置fzf#vim#grep函數,支持調用第三方搜索,接收參數:fzf#vim#grep(command, [has_column bool], [spec dict], [fullscreen bool])
    • command:要運行的命令;
    • has_column:是否打印列號;
    • spec:展現預覽窗口;
    • fullscreen:是否全屏,<bang>0是vim script,在vim命令中若是輸入!<bang>0轉換成1,不然爲0;
  • 這裏使用了ripgrep(由於聽說vscode內的搜索就是基於這個作的,因此選擇這個)做爲fzf中默認的搜索。fzf#vim#with_preview用於配置展現預覽窗口。配置好後在vim中輸入:Rg就能夠啓動在整個項目搜索文本,:Files在整個項目中搜索文件。
  • 在使用fzf.vim搜索文本和文件的過程當中須要注意一點,搜索是基於你當前打開文件所在的文件夾去搜索。因此若是要在整個項目中搜索,就須要在項目根目錄下打開一個文件進行搜索。這也相似於在vscode中,若是想搜索項目中特定文件夾中的文本,須要選擇當前想要選擇的文件夾。

以上配置就能夠知足咱們平常開發中的搜索/替換文本,搜索文件等經常使用功能了。

相關文章
相關標籤/搜索