2021-05-12 14:32:11
Vim高階操作快速入門
導讀 此文收集了一些簡單的 VIM 操作,這些操作要麼其它普通文字編輯器不能完成,要麼完成起來很慢。通過本文的介紹,可以堅定初學者學習 VIM 的決心與信心。如果你有什麼好的易於演示的簡易技巧,歡迎留言。另外,如果沒有明確說明,本文中的提到的按鍵均是大小寫敏感的。例如,文中提到“按下 G”時,你按的鍵應該是“Shift + G”。
1. 準備工作
首先,我們開啟 VIM,輸入一段文字,用於今天的演示:
this is a test
2. 查詢替換
按幾下ESC進入 Normal 模式,輸入以下命令::%s/ /r/g 。回車後得到的效果如下:
this
is
atest
解說:這條命令的作用是,將文章中所有的空格替換為回車。幾乎所有的編輯器都支援查詢替換,但並不是所有的編輯器都支援把空格替換為回車,因此這個功能在許多別的編輯器裡做起來是比較繁瑣的。
3. 行的拼接
剛才我們把一行文字打碎為 4 行了,那如何再把它們拼接起來呢?當然,我們可以通過前面說的查詢替換的方式,將回車再替換為空格,實現行的拼接。但是,這裡我們用的是另一種方式。
按幾下 ESC進入 Normal 模式,然後輸入這段命令:ggVG。gg 表示跳到文字開頭,V 表示進入行選擇模式,G 表示選擇到文章末尾。通過這 3 條命令,總共 4 個按鍵,我們選中了整篇文章。
然後,按下冒號 : 進入命令模式,狀態列上出現::'< ,'>字樣,在它後面輸入j,然後回車,可以看到,整篇文章又被拼接起來了,整個操作包括迴車只按了 7 次鍵:
this is a test
4. 複製貼上與重複動作
按幾下ESC確認當前處在 Normal 模式下,然後按yy,即可將當前行複製到預設暫存器中(相當於剪貼簿)。然後按下12p,VIM 將執行貼上動作 12 次,螢幕上出現了 13 行這樣的字元:
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test
解說:在 VIM 中,複製和貼上操作相當快捷。另外,VIM 中大部分命令都可以通過在命令前加數位重複若干遍。
5. 列操作
接下來我們把每一行的開頭第一個字母改為大寫。
按幾下 ESC確認當前處在 Normal 模式下,然後按gg跳到第一行,按下 Ctrl + v進入列選擇模式,然後按G,跳到文章最後一行,此時你應該看到,文字的第一列被選中了,而且只選中了第一列。按下 U 鍵,可以看到,每行的第一個字母都變為大寫了。提示:選中文字後按 u 可以將文字變為小寫,選中文字後按 ~ 可以翻轉原有的大小寫。
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
This is a test
然後,我們在每行的前面加上一個星號。按下gg跳到第一行,按 Ctrl + v進入列選擇模式,再按 G,選中全文的第一列,然後按I,進入列插入狀態,輸入星號*,再按下ESC,你會看到,所有行之前都出現了一個星號:(這個操作我用rehat7沒成功,可以使用這個替代:%s/^/*)
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
*This is a test
解說:對於編寫程式的人來說,把一段程式碼批次注釋掉是一個很常見的操作,使用列插入可以很容易地做到這一點。另外,列選擇後按 x 刪除被選中的塊,可以批次地解除注釋。
6. 宏的錄製
接下來,我們要將文字的偶數行修改為:This is another test。由於所有的偶數行都要進行同樣的操作,因此我們把這個操作錄製下來,然後重複播放若干遍,就能很快地完成這項工作了。
首先,按幾下 ESC確認處在 Normal 模式下,再按下 gg跳到第一行,準備開始操作。我們首先按下 q 鍵,然後再按一個其它字母,將這個宏錄製到該字母對應的暫存器下。例如我們這裡使用 m 暫存器,則按qm。此時 VIM 狀態列出現“recording”字樣,表明已經進入了錄制狀態。
然後,我們把第二行的 a 修改為another。首先按j進入第二行,然後按 $ 跳到行末,再按兩下 b往前跳兩個單詞,此時游標停在字母 a 上。然後我們按下cw鍵刪除 a 並進入插入狀態,然後輸入another ,按 ESC回到 Normal 狀態,按j進入下一行,整個操作步驟就完成了。最後,我們再按一下 q,結束該宏的錄製。
接下來我們播放這個宏,完成整個操作步驟。在鍵盤上輸入 1000@m,表示將 m 暫存器裡的宏播放 1000 次,馬上可以看到,文章中所有偶數行的 a 都變成了 another。
*This is a test
*This is another test
*This is a test
*This is another test
*This is a test
*This is another test
*This is a test
*This is another test
*This is a test
*This is another test
*This is a test
*This is another test
*This is a test
解說:雖然我們指定播放 1000 次,但事實上,執行到第 6 次的時候,游標挪到了螢幕最下方,於是執行過程就自動停止了。因此,在批次操作的時候,我們可以指定足夠大的數位,而不用擔心出現問題。
另外,修改 a 的時候,我們跳到行末後再使用 b 命令以單詞為單位跳轉,而沒使用 h 一個字母一個字母往回挪,我們使用cw 修改整個單詞,而不使用 s 命令刪除單個字母並進入 Insert模式。這些細節可以保證錄製得到的宏更具有一般性。
7. 行尾塊操作
註:本章由 Jason Han 網友貢獻,感謝他來信指出滇狐原先對於行尾塊操作理解的錯誤。
下面,我們要在每行的尾部都新增一個感嘆號。之前我們在每行頭部新增一個星號的時候,用的是Ctrl-V列操作。現在要在行尾新增,能不能繼續用列操作呢?直觀上似乎是不行的,每行的長度不一樣,行尾位置參差不齊,如何使用列模式往行尾新增東西呢?
事實上,Vim 提供了一種特殊的列模式,叫做行尾塊模式,也就是說,我們是可以通過 Ctrl-V模式來選中長度不同的行的行尾,然後對行尾作統一操作的,操作步驟如下:
按下gg 跳到第一行,按Ctrl-V進入列選擇模式,再按G,選中全文的第一列,然後按下$,進入行尾塊模式,按下A,進入塊插入狀態,輸入星號 !,再按下 ESC,你會看到,所有行尾部都出現了一個感嘆號:
*This is a test!
*This is another test!
*This is a test!
*This is another test!
*This is a test!
*This is another test!
*This is a test!
*This is another test!
*This is a test!
*This is another test!
*This is a test!
*This is another test!
*This is a test!
8. 點命令
接下來,我們在每行的末尾加上一個小於號 < 。每行下面插入一個新行,寫上一個大於號 >。
由於我們需要在每行後面新增新行,因此我們無法使用塊選擇方式批次新增小於大於號。使用宏錄製的方式是可以做到這點的,但操作稍嫌繁瑣了一些。使用點命令,可以非常方便地做到這一點。
先按幾下ESC 確認當前出於 Normal 模式,然後使用gg跳到第一行,按 A進行行尾插入,輸入< ,然後按下回車,輸入>,最後 ESC回到 Normal 狀態,第一行修改就完成了。
然後,我們按j進入下一行,也就是第三行,再按.,可以看到,第三行尾部也出現了小於號,並且自動新增了第四行的大於號。反復按j.j.j. ,直到每一行都完成了這個編輯動作為止。
*This is a test!<>
*This is another test!<>
*This is a test!<>
*This is another test!<>
*This is a test!<>
*This is another test!<>
*This is a test!<>
*This is another test!<>
*This is a test!<>
*This is another test!<>
*This is a test!<>
*This is another test!<>
*This is a test!<>
解說:點命令的作用是,重複最近一次所做的編輯操作。由於在第一行裡做的操作是行尾新增並插入新行,因此在第三行(原先的第二行)重複這個動作的時候,也會在行尾新增同樣的字元。點命令功能不如宏強大,但它使用起來比宏簡便,因此也有著廣泛的用途。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址:https://www.linuxidc.com/Linux/2018-09/154039.htm
相關文章