文章目錄
- S06L22 Search, Find, and Replace - Part One
- 1 從光標位置起,正向定位到當前行的首個字符 b
- 2 從光標位置起,反向查找某個字符
- 3 重復上一次字符查找操作
- 4 定位到目標字符的前一個字符
- 5 單字符查找與 Vim 命令的組合
- 6 跨行查找某字符串
- 7 Vim 的增量查找
- 8 Vim 搜索的高亮顯示
- 9 全局搜索與替換的快速交替操作
- 10 反向全局搜索
- 11 查找光標所在的下一個單詞
- 12 查找光標所在的上一個單詞
- 13 全局搜索 motion 與 D 命令的組合應用
- 14 全局搜索 motion 與 Y 命令及寄存器的組合應用
寫在前面
開年這幾天利用假期和難得的空閑時間,突擊翻完了李笑來的《自學是門手藝》,收獲很大。書中最后也提到了Vim
的學習,覺得很有必要把這個專欄筆記整理完,爭取在春節前順利收官。本篇為第 6 章第 22 課的自學筆記,也是全套課程最為核心的幾節操作課,主要介紹文本的檢索、單詞單字的匹配以及常用的替換技巧,因時長限制,Jason 講師特地分為兩部分介紹。本課為第一部分,第 23 課為第二部分。知識點不僅密集而且應用靈活性極強,需要結合示例文件用心體會、反復練習,形成肌肉記憶。如果Vim
真的有捷徑,那必定是大量實踐、反復琢磨這條路。
S06L22 Search, Find, and Replace - Part One
1 從光標位置起,正向定位到當前行的首個字符 b
按 FB(即 F + {char}
)
查找該行首個大寫字母 A
:按 F + ShiftA
注意:f
鍵查找是 區分大小寫 的。
2 從光標位置起,反向查找某個字符
反向查找:ShiftF + {char}
。例如,反向定位到光標左邊最近一個 z
,按:ShiftF + Z。
正向查找:forward search
反向查找:backward search / reverse search
3 重復上一次字符查找操作
正向重復查找,按 ;
反向重復查找,按 ,
4 定位到目標字符的前一個字符
正向:按 T + {char}
反向:按 ShiftT + {char}
例如,正向定位下一個 i
左邊(前一個)的字符:TI
再如,反向定位上一個 i
右邊(即反向的前一個)的字符:ShiftT + I
同理,可使用 ; 和 , 分別重復定位到下一個 {char}
、且在它前面(正向為左邊,反向為右邊)的那個字符。
注意,無論是 f
查找還是 t
查找,; 始終與上一次查找的方向保持一致;而 , 始終與上一次的方向相反。
此外,這兩類查找也支持數量詞 {count}
。例如,從當前位置開始,正向查找當前行的第 2 個空格字符,需鍵入:2FSpace
【復習】
重復上一次
Vim
命令,用的是 .;而這里的f
查找和t
查找對應的是動作motion
,并且可能存在多個匹配項,所以只能按 ; 或 , 進行正反向瀏覽。與此同時,也正因為這些查找屬于
motion
動作,而非command
命令,它們也可以和前面學過的其它command
命令組合使用(如c
/d
/y
命令等)
5 單字符查找與 Vim 命令的組合
對于下列文本內容:
Delete THIS<<--- word.
按 F + ShiftT 將光標定位到大寫字母 T
后,需要刪除字符 T
(包含)到字符 w
(不包含)之間的內容,至少有三種解決方案:
- 用 D + TW
- 用 D + FSpace
- 還可以用前面介紹的 D + ShiftW
6 跨行查找某字符串
使用 / + {target_string}
例如:正向跨行查找字符串 and
:/ + and
正向快速匹配下一個目標,按:N
反向快速匹配,則按:ShiftN
一直按 N 匹配到當前文件的最后一個目標字符串后,再次按 N,Vim
會提示 search HIT BOTTOM, continuing at TOP
,并將光標定位到文件第一處匹配項(反之亦然):
【圖 22-1 跨行查找到最后一處關鍵字后,Vim 提示繼續查找將從文件開頭重新開始】
想要重新檢索其他字符串,鍵入 / + {new_string}
即可。
7 Vim 的增量查找
增量查找(incsearch,即 incremental search) 是 Vim
中的一個配置項,啟用該配置項后,Vim
會在輸入搜索關鍵字的過程中,實時顯示最新的匹配結果。也就是說,可以看到搜索結果的 即時反饋,而不必等到輸完搜索字符串后再進行查找。
相關操作 | 增量搜索命令 |
---|---|
查看 | :set is? / :set incsearch? |
開啟 | :set is / :set incsearch |
關閉 | :set nois / :set noincsearch |
切換 | :set is! / :set incsearch! |
8 Vim 搜索的高亮顯示
搜索高亮顯示(hls,全稱 hlsearch,即 highlight search),默認關閉。開啟后,當前文件所有的匹配項都將高亮顯示,直到換成其他關鍵詞或者關閉高亮。相關配置命令如下:
相關操作 | 高亮顯示命令 |
---|---|
查看 | :set hls? / :set hlsearch? |
開啟 | :set hls / :set hlsearch |
關閉 | :set nohls / :set nohlsearch |
切換 | :set hls! / :set hlsearch! |
臨時關閉 | :nohls / :nohlsearch |
注意:臨時關閉只對當前匹配結果生效;只要用 / 重新檢索,Vim
就會重新恢復高亮顯示。
關于 Vim
偏好的具體配置,后續還會重點介紹,這里暫不展開。
9 全局搜索與替換的快速交替操作
先用 /{keyword}
搜索,然后用 cw
等命令替換為其他關鍵詞;后續再通過 N 和 . 快速定位、快速替換,實現快速交替操作。
例如:全文檢索 and
后,替換為 &
,并利用 N 和 . 實現快速交替執行。
10 反向全局搜索
反向搜索(backward search,或者 reverse search),使用:? + {keyword}
。
例如,從當前光標位置開始,反向檢索關鍵詞 is
:? + is
同理,重復下一個匹配項(即向上查找),使用 N;逆向操作使用 ShiftN(即向下查找)。
11 查找光標所在的下一個單詞
使用星號鍵 *。
例如:光標定位到單詞 is
的任一字符上,鍵入 * 可以全局匹配到下一個單詞 is
,繼續按 * 或者 N 可匹配下一處;上一處用 ShiftN。
注意
* 只能匹配單詞
is
,無法匹配像episode
、sister
這樣關鍵詞出現在中間的情況,因為 * 表示匹配完整單詞(matching an entire word)。
12 查找光標所在的上一個單詞
使用 $,重復該操作,使用 $ 或 N;逆向操作仍然使用 ShiftN。
13 全局搜索 motion 與 D 命令的組合應用
全局搜索本質上也屬于 motion
操作,因此同樣可以與 command
命令組合使用。例如,刪除當前光標到下一處 This
(不含)之間的文本內容:
【圖 2:全局搜索與命令的組合示例:刪除當前光標到 This 間的內容(操作前)】
鍵入 D/ + This
+ Enter,得到如下結果:
【圖 3:執行 D/This + Enter 后的最終結果】
14 全局搜索 motion 與 Y 命令及寄存器的組合應用
此外,也可以將組合操作的內容放入某個寄存器。
例如:將文件初始位置到下一個 z
之間的內容,存入寄存器 "a
。
操作前(光標位于起初位置):
【圖 4:Y 命令 + 全局搜索 + 寄存器操作示例(操作前)】
依次鍵入 "AY/ + z
+ Enter,并查看寄存器 "a
的內容,得到如下結果:
【圖 5:執行 "ay/z + Enter 操作后,查看寄存器 a 中的內容(操作成功)】
后記
Vim
的使用我覺得是計算機領域少有的 “先易后難” 技能,為了今后的流暢體驗,現在苦一點累一點是非常值得的。能否熟練使用Vim
也是評價一個人計算機綜合素養的重要指標之一。
(第一部分完)