1. 程式人生 > >vi/vim 吐血總結 | emacs evil 使用教程

vi/vim 吐血總結 | emacs evil 使用教程

使用 evil 之前,得了解 vi/vim 的一些基本常識。
命令模式下的遊標是一個方塊,它的當前位置是指塊的最左邊。下圖中當前遊標所在位置是兩個 e 的中間。
在這裡插入圖片描述

文章目錄

模式

命令模式(執行管理任務)

  • 所輸入的內容被解釋成命令,功能包括
    1. 儲存檔案、執行命令
    2. 移動遊標、剪下、貼上多行或多個單詞、查詢、替換
  • 所輸入的任何字元被解釋成命令
  • 命令模式包含末行模式(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 確認後再替換

撤銷

命令模式下

  1. u 撤銷上一次編輯
  2. U 當前行恢復到原始狀態(撤銷對本行的所有操作)
  3. C-r 反反撤銷

重複命令

在命令模式輸入命令之前,可以先輸入一個數字,表示想要執行接下來輸入的命令的次數。

  1. 10j 下移 10 行
  2. 10l 右移 10 個字元
  3. 6h 左移 6 個字元
  4. 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