這篇文章來詳細介紹 Vim 中查找相關的設置和使用方法。 包括
- 查找與替換
- 大小寫敏感查找
- 查找光標所在詞
- 高亮前景/背景
- 切換高亮狀
查找
在normal模式下按下/
即可進入查找模式,輸入要查找的字符串並按下回車。 Vim會跳轉到第一個匹配。按下n
查找下一個,按下N
查找上一個。
Vim查找支持正則表達式,例如/vim$
匹配行尾的"vim"
。 需要查找特殊字符需要轉義,例如/vim\$
匹配"vim$"
。
注意查找回車應當用\n
,而替換為回車應當用\r
(相當於<CR>
)。
大小寫敏感查找
在查找模式中加入\c
表示大小寫不敏感查找,\C
表示大小寫敏感查找。例如:
/foo\c
將會查找所有的"foo"
,"FOO"
,"Foo"
等字符串。
大小寫敏感配置
Vim 默認采用大小寫敏感的查找,為了方便我們常常將其配置為大小寫不敏感:
" 設置默認進行大小寫不敏感查找
set ignorecase
" 如果有一個大寫字母,則切換到大小寫敏感查找
set smartcase
將上述設置粘貼到你的~/.vimrc
,重新打開Vim即可生效。
查找當前單詞
在normal模式下按下*
即可查找光標所在單詞(word), 要求每次出現的前后為空白字符或標點符號。例如當前為foo
, 可以匹配foo bar
中的foo
,但不可匹配foobar
中的foo
。 這在查找函數名、變量名時非常有用。
按下g*
即可查找光標所在單詞的字符序列,每次出現前后字符無要求。 即foo bar和foobar中的foo均可被匹配到。
其他設置
:set incsearch
可以在敲鍵的同時搜索,按下回車把移動光標移動到匹配的詞; 按下 Esc 取消搜索。
:set wrapscan
用來設置到文件尾部后是否重新從文件頭開始搜索。
查找與替換
:s
(substitute)命令用來查找和替換字符串。語法如下:
:{作用范圍}s/{目標}/{替換}/{替換標志}
例如:%s/foo/bar/g
會在 全局范圍(global) 查找foo
並替換為bar
,所有出現都會被替換。
作用范圍
作用范圍分為當前行、全文、選區等等。
1. 當前行:
:s/foo/bar/g
后面的g
表示把當前行所有的foo
替換成bar
,反之如果沒有這個則只替換第一個foo
2. 全文:
:%s/foo/bar/g
和上面命令的區別就在於多了一個%
3. 選區模式:即在Visual模式下選擇區域后做替換。步驟如下:
- ctrl+v進入visual模式
- 輸入
:
,Vim下面的命令會自動變成:'<,'>
, - 之后你只需要輸入前面的命令即可例如
:'<,'>s/foo/bar/g
之后就會把你選中區域內的foo
替換成bar
4. 指定行數
例子一:2-11行:
:2,11s/foo/bar/g
例子二:當前行.
與接下來兩行+2
:
:.,+2s/foo/bar/g
替換標志
上文中命令結尾的g
即是替換標志之一,表示全局global替換(即替換目標的所有出現)。 還有很多其他有用的替換標志:
空替換標志表示只替換從光標位置開始,目標的第一次出現:
:%s/foo/bar
i表示大小寫不敏感查找,I表示大小寫敏感:
:%s/foo/bar/i
# 等效於模式中的\c(不敏感)或\C(敏感)
:%s/foo\c/bar
逐個替換確認
有時候我們可能不想全局替換某個變量,而且又並不知道要替換的變量的位置,所以我們可以想使用ctrl+f
一樣一個個的先查找,然后再手動決定是否需要替換,具體方法如下:
例如全局查找"foo
"替換為"bar
"並且需要確認:
:%s/foo/bar/gc
c
表示需要確認,回車后Vim會將光標移動到每一次"foo"出現的位置,並提示
replace with bar (y/n/a/q/l/^E/^Y)?
按下y
表示替換,n
表示不替換,a
表示替換所有,q
表示退出查找模式, l
表示替換當前位置並退出。^E
與^Y
是光標移動快捷鍵,參考: Vim中如何快速進行光標移動。
高亮設置
高亮顏色設置
如果你像我一樣覺得高亮的顏色不太舒服,可以在 ~/.vimrc 中進行設置:
highlight Search ctermbg=yellow ctermfg=black
highlight IncSearch ctermbg=black ctermfg=yellow
highlight MatchParen cterm=underline ctermbg=NONE ctermfg=NONE
上述配置指定 Search 結果的前景色(foreground)為黑色,背景色(background)為灰色; 漸進搜索的前景色為黑色,背景色為黃色;光標處的字符加下划線。
更多的CTERM顏色可以查閱:http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim
禁用/啟用高亮
有木有覺得每次查找替換后 Vim 仍然高亮着搜索結果? 可以手動讓它停止高亮,在normal模式下輸入:
:nohighlight
" 等效於
:nohl
其實上述命令禁用了所有高亮,只禁用搜索高亮的命令是:set nohlsearch
。 下次搜索時需要:set hlsearch
再次啟動搜索高亮。
延時禁用
怎么能夠讓Vim查找/替換后一段時間自動取消高亮,發生查找時自動開啟呢?
" 當光標一段時間保持不動了,就禁用高亮
autocmd cursorhold * set nohlsearch
" 當輸入查找命令時,再啟用高亮
noremap n :set hlsearch<cr>n
noremap N :set hlsearch<cr>N
noremap / :set hlsearch<cr>/
noremap ? :set hlsearch<cr>?
noremap * *:set hlsearch<cr>
將上述配置粘貼到~/.vimrc
,重新打開vim即可生效。
一鍵禁用
如果延時禁用搜索高亮仍然不夠舒服,可以設置快捷鍵來一鍵禁用/開啟搜索高亮:
noremap n :set hlsearch<cr>n
noremap N :set hlsearch<cr>N
noremap / :set hlsearch<cr>/
noremap ? :set hlsearch<cr>?
noremap * *:set hlsearch<cr>
nnoremap <c-h> :call DisableHighlight()<cr>
function! DisableHighlight()
set nohlsearch
endfunc
希望關閉高亮時只需要按下 Ctrl+H
,當發生下次搜索時又會自動啟用。