vi/vim 吐血總結 | emacs evil 使用教程
使用 evil 之前,得了解 vi/vim 的一些基本常識。
命令模式下的遊標是一個方塊,它的當前位置是指塊的最左邊。下圖中當前遊標所在位置是兩個 e 的中間。
文章目錄
模式
命令模式(執行管理任務)
- 所輸入的內容被解釋成命令,功能包括
- 儲存檔案、執行命令
- 移動遊標、剪下、貼上多行或多個單詞、查詢、替換
- 所輸入的任何字元被解釋成命令
- 命令模式包含
末行模式
(last line mode / 指令列命令模式)
末行模式
末行模式在命令模式下輸入 :
進入。由於此時游標移動到最後一行,因此得名。
插入模式(向檔案中輸入文字)
鍵入所有內容被認為是文字輸入。
在命令模式下輸入以下命令將進入插入模式。沒有進入插入模式的會註明。
命令 | 結果 |
---|---|
i | 在當前遊標位置之前 插入文字 |
I | 在當前行的開始處 插入文字 (非空字元的行首) |
a | 在當前遊標位置之後 插入文字 |
A | 在當前行的結尾處 插入文字 |
o | 在當前行下面新建一行 |
O | 在當前行的上面新建一行 |
s | 刪除遊標後 的一個字元 |
S | 刪除遊標所在的行(刪除當前行) |
r | 替換 (覆蓋) 當前遊標位置之後的一個字元,然後進入命令模式 |
R | 替換 (覆蓋) 當前遊標位置及後面的若干文字(進入替換模式 ) |
cc | 刪除當前行內容 |
cw | 刪除遊標所在位置到單詞末尾 |
ch | 刪除遊標位置之前的一個字元 |
cl | 刪除遊標位置之後的一個字元 |
cj | 刪除當前行和下一行 |
ck | 刪除當前行和上一行 |
可視模式
這個一開始不必掌握。
在命令模式下輸入以下命令進入可視模式
命令 | 結果 |
---|---|
v | 逐個字元選擇文字 |
V | 逐行選擇文字 |
C-v | 按照塊的方式選擇文字(忽視行,可以理解為面向列) |
gv | 重選上次的高亮區域 |
高亮選區由兩個斷點確定:一個固定的端點,一個活動的端點。
字元 o
可以在不同的的端點之間來回的切換。
當我們選中了一片高亮區域後,可以使用如下命令對高亮區域進行操作:
命令 | 效果 |
---|---|
d | 剪下選中文字 |
c | 修改選中文字 |
r | 替換選中文字 |
I | 在選中文字前插入 |
A | 在選中文字後插入 |
gu | 選中區域轉為小寫 |
gU | 選中區域轉為大寫 |
g~ | 大小寫互調 |
> | 向右縮排一個單位 |
< | 向左縮排一個單位 |
模式間的切換
任何模式下使用 ESC
將退回到命令模式,實在不行摁兩下。
移動
操作單位 | 命令 | 效果 | 說明 |
---|---|---|---|
字元 | h l |
左移一個字元 右移一個字元 |
|
單詞 | w/W b/B e/E |
移到下一單詞的開頭 移到上一單詞的開頭 移到游標所在單詞末尾 |
W、B、E 命令操作的單詞是以空白字元(空格、Tab)分隔的字串 比如字串 “str1-str2 str3-str4” 對 W、B、E 命令來說是兩個單詞,而對 w、b、e 命令來說則是四個單詞。 |
行 | j k 0 ^ $ :n nG n+ n- |
下移一行 上移一行 移到當前行開頭 移到當前行的首個非空字元 移到當前行末尾 移動到第 n 行 移動到第 n 行 從游標當前行下移 n 行 從游標當前行上移 n 行 |
0 為數字零(zero) |
句子 | ) ( |
移動到當前句子的末尾 移動到當前句子的開頭 |
句子指以 ”.”、”?” 和 ”!” 結尾,後面至少有一個空格或換行符的字串 |
段落 | } { |
移動當前段落的末尾 移到當前段落的開頭 |
|
屏 | H M L |
移動到螢幕的第一行 移動到螢幕的中間一行 移動到螢幕的最後一行 |
|
頁 | C-f C-b C-u C-d |
向前滾動一頁 向後滾動一頁 向前滾動半頁 向後滾動半頁 |
|
檔案 | G gg :0 : $ |
移動到檔案末尾 移動到檔案開頭 移動到檔案第一行 移動到檔案最後一行 |
複製、貼上和刪除
以下命令都是在命令模式下進行,並且執行之後還在命令模式
複製
操作單位 | 命令 | 效果 |
---|---|---|
字元 | 沒意義。要實在像複製的話,可以進入可視模式實現。 | |
單詞 | yw | 複製當前單詞 |
行 | yy | 複製當前行 |
剪下
操作單位 | 命令 | 效果 |
---|---|---|
字元 | x X |
剪下遊標位置後一字元 (相當於 DELETE) 剪下遊標位置前一字元 (相當於 BACKESPACE) |
單詞 | dw | 剪切當前遊標位置至下一個單詞前的字元 |
行 | dd D d0 d$ |
剪下遊標所在的行 從遊標位置開始剪下到行尾 從遊標位置剪下至行首 從遊標位置剪下至行尾 |
用 v 進入可視模式後,選中文字之後可以按 y 進行復制,如果按 d 就表示剪下。
貼上
命令 | 說明 |
---|---|
p | 將複製的單詞粘到遊標後面 複製後的行粘到遊標所在行下面 |
P | 將複製的單詞貼上到遊標前面 複製後的行粘到遊標所在行上面 |
刪除
刪除後改變當前模式的命令可以參考 插入模式
小節
操作單位 | 命令 | 效果 |
---|---|---|
字元 | x X |
剪下遊標位置後一字元 (相當於 DELETE) 剪下遊標位置前一字元 (相當於 BACKESPACE) |
單詞 | dw | 剪切當前遊標位置至下一個單詞前的字元 |
行 | dd D d0 d$ J |
剪下遊標所在的行 從遊標位置開始剪下到行尾 從遊標位置剪下至行首 從遊標位置剪下至行尾 合併遊標所在行及下一行為一行 |
其他命令
功能 | 命令 | 效果 |
---|---|---|
重複操作 | . |
重複上次操作 |
交換相鄰字元或行 | xp ddp |
交換游標位置的字元和它右邊的字元 交換游標位置的行和它的下一行 |
大小寫轉換 | ~ guw gUw guu gUU g~~ |
將游標下的字母大小寫反向轉換 將游標所在的單詞變為小寫 將游標所在的單詞變為大寫 游標所在的行所有字元變為小寫 游標所在的行所有字元變為大寫 游標所在的行所有字元大小寫反向轉換 |
搜尋和替換
搜尋
下面的 前 是指 h 的方向
命令 | 說明 |
---|---|
/ | 從當前位置向後搜尋 |
? | 從當前位置向前搜尋 |
n | 搜尋下一個 |
N | 反向搜尋下一個 |
* | 在檔案中向後搜尋當前游標所在的單詞 |
# | 在檔案中向前搜尋當前游標所在的單詞 |
顯示搜尋歷史
q/
或 q?
替換
命令 | 說明 |
---|---|
:s / 被換單詞 / 新單詞 / | 替換游標所在行的第一個被換單詞 |
:s / 被換單詞 / 新單詞 / g | 替換游標所在行的全部被換單詞 |
:x,ys / 被換單詞 / 新單詞 / | 在 x 和 y 行之間替換每一行的第一個被換單詞 |
:x,ys / 被換單詞 / 新單詞 / g | 在 x 和 y 行之間替換全部被換單詞 |
:%s/被換單詞/新單詞/ 替換每一行的第一個被換單詞
:%s/被換單詞/新單詞/g 替換每一行中所有被換單詞
如果我們想要替換的字串中包含 / 怎麼辦呢?
此時我們可以使用分隔符 # 來代替 分隔符 /
:s#vivian/#sky/#
替換當前行第一個 vivian/ 為 sky/
:%s+/oradata/apras/+/user01/apras1+
(使用 + 來 替換 / )
將 /oradata/apras/ 替換成 /user01/apras1/
為了防止替換錯了,我們可以在替換前加個提醒
:1,$s/misspelled/spelled correctly/gc
:1,$s/misspelled/spelled correctly/c
c 確認後再替換
撤銷
命令模式下
u
撤銷上一次編輯U
當前行
恢復到原始狀態(撤銷對本行的所有操作)C-r
反反撤銷
重複命令
在命令模式輸入命令之前,可以先輸入一個數字,表示想要執行接下來輸入的命令的次數。
- 10j 下移 10 行
- 10l 右移 10 個字元
- 6h 左移 6 個字元
- 3dd 刪除三行
退出
命令 | 說明 |
---|---|
:q | 如果修改檔案,vi 詢問使用者是否儲存檔案,不儲存則退出 vi,否則不能退出。 |
:w | 儲存當前檔案。如果使用者對當前檔案沒有寫許可權,不能儲存檔案並收到一條錯誤訊息。 |
:wq | 儲存並退出,與: wq 相同 |
:q! :w! :wq! |
! 表示直接執行命令,不提供保護措施,不考慮命令是否執行成功。 |
ZZ | 儲存並退出,與: wq 相同 |
ZQ | 無條件退出,與: q! 相同 |
:x | 儲存並退出 |
:w filename | 將編輯內容另存到檔案 filename 中。啟動 vi 時未指定檔名,須用此命令儲存編輯內容到檔案中 |
:m,nw filename | 將 m 行到 n 行部分的內容儲存到檔案 filename 中 |
:m,nw >> filename | 將 m 行到 n 行的內容新增到檔案 filename 的末尾 |
:e! | 開啟檔案的上一次成功儲存的版本。 |
參考
https://www.ibm.com/developerworks/cn/linux/l-cn-tip-vim/index.html
https://blog.csdn.net/ii1245712564/article/details/46960387#commentBox
https://www.cnblogs.com/afant/archive/2009/03/11/1408745.html
https://blog.csdn.net/netdxy/article/details/50553543