總有人問我 Vim 中能不能尋找,當然能!而且是超級強的尋找! 這篇文章來詳細介紹 Vim 中尋找相關的設定和使用方法。 包括尋找與替換、尋找游標所在詞、高亮前景/背景色、切換高亮狀態、大小寫敏感尋找等。
尋找
在normal模式下按下/即可進入尋找模式,輸入要尋找的字串並按下斷行符號。 Vim會跳轉到第一個匹配。按下n尋找下一個,按下N尋找上一個。
Vim尋找支援Regex,例如/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均可被匹配到。
尋找與替換
:s(substitute)命令用來尋找和替換字串。文法如下:
:{作用範圍}s/{目標}/{替換}/{替換標誌}
例如:%s/foo/bar/g會在全域範圍(%)尋找foo並替換為bar,所有出現都會被替換(g)。
作用範圍
作用範圍分為當前行、全文、選區等等。
當前行:
:s/foo/bar/g
全文:
:%s/foo/bar/g
選區,在Visual模式下選擇地區後輸入:,Vim即可自動補全為 :'<,'>。
:'<,'>s/foo/bar/g
2-11行:
:5,12s/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
c表示需要確認,例如全域尋找"foo"替換為"bar"並且需要確認:
:%s/foo/bar/gc
斷行符號後Vim會將游標移動到每一次"foo"出現的位置,並提示
replace with bar (y/n/a/q/l/^E/^Y)?
按下y表示替換,n表示不替換,a表示替換所有,q表示退出尋找模式, l表示替換當前位置並退出。^E與^Y是游標移動快速鍵,參考: Vim中如何快速進行游標移動。
高亮設定
醒目提示設定
如果你像我一樣覺得高亮的顏色不太舒服,也可以進行設定:
highlight Search ctermbg=grey ctermfg=black
將上述配置粘貼到~/.vimrc,重新開啟vim即可生效。
上述配置指定Search結果的前景色彩(foreground)為黑色,背景色(background)為灰色。 禁用/啟用高亮
有木有覺得每次尋找替換後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即可生效。
刪除文本中的^M
問題描述:對於換行,window下用斷行符號換行(0A0D)來表示,linux下是斷行符號(0A)來表示。這樣,將window上的檔案拷到unix上用時,總會有個^M.請寫個用在unix下的過濾windows檔案的分行符號(0D)的shell或c程式。
。 使用命令:cat filename1 | tr -d “^V^M” > newfile;
。 使用命令:sed -e “s/^V^M//” filename > outputfilename.需要注意的是在1、2兩種方法中,^V和^M指的是Ctrl+V和Ctrl+M.你必須要手工進行輸入,而不是粘貼。
。 在vi中處理:首先使用vi開啟檔案,然後按ESC鍵,接著輸入命令:%s/^V^M//.
。 :%s/^M$//g
如果上述方法無用,則正確的解決辦法是: [Page]
。 tr -d \"\\r\" < src >dest
。 tr -d \"\\015\" dest
。 strings A>B
6. 替換確認
我們有很多時候會需要某個字元(串)在文章中某些位置出現時被替換,而其它位置不被替換的有選擇的操作,這就需要使用者來進行確認,vi的尋找替換同樣支援
例如
:s/vivian/sky/g 替換當前行所有 vivian 為 sky
在命令後面加上一個字母c就可以實現,即:s/vivian/sky/gc
顧名思意,c是confirm的縮寫
7. 其它
利用 :s 命令可以實現字串的替換。具體的用法包括:
:s/str1/str2/ 用字串 str2 替換行中首次出現的字串 str1
:s/str1/str2/g 用字串 str2 替換行中所有出現的字串 str1
:。,$ s/str1/str2/g 用字串 str2 替換本文當前行到末尾所有出現的字串 str1
:1,$ s/str1/str2/g 用字串 str2 替換本文中所有出現的字串 str1
:g/str1/s//str2/g 功能同上
從上述替換命令可以看到:g 放在命令末尾,表示對搜尋字串的每次出現進行替換;不加 g,表示只對搜尋
字串的首次出現進行替換;g 放在命令開頭,表示對本文中所有包含搜尋字串的行進行替換操作