一、VIM 的兩種狀態
VIM(vimsual)是 Linux/UNIX 系列 OS 中通用的全屏編輯器。vim 分為兩種狀態,即命令狀態和編輯狀態,在命令狀態下,所鍵入的字符系統均作命令來處理;而編輯狀態則是用來編輯文本資料(類似 word)。
當進入 vim 時,會首先進入命令狀態。在命令狀態下,輸入 i(插入)或 a(添加)可以進入編輯狀態(左下角有 - - INSERT - -,或者 - - 插入 - - 代表處于編輯狀態);在編輯狀態下,按 Esc 鍵進入命令狀態。
在命令狀態下,有如下一些常用命令:
-
新增:
a :從光標后面開始添加文本
A :從光標所在行的末尾開始添加文本 -
插入:
i :從光標前面開始插入文本
I :從光標所在行的開始處插入文本
注意
當需要編輯一個名為 file 的文件時,輸入 vim file 命令并進入編輯狀態時,出現 “- - 插入 - - W10:警告:正在修改一個只讀文件” ,該如何處理?
① 查看 file 文件的權限:ls -l ,發現沒有寫權限
② 進入 root 用戶,給 file 文件添加寫權限:su and chmod a+w file ,此時再執行 ls -l 命令,可以發現 file 文件有了寫權限
此時再 vim file 并編輯,就不會出現上述問題了。
二、VIM 的常用命令操作(類似快捷鍵)
以下操作均在 “命令狀態” 下進行
1. 刪除與修改
1)刪除
-
x :刪除光標處的字符
-
dd :刪除光標所在的整行
-
[n]dd :刪除光標所在行以及下面的 n-1 行(刪除 n 行)
-
D :刪除光標到行尾的文本,常用語刪除注釋語句(d$)
2)修改
-
yy :復制光標所在的整行
-
[n]yy :從光標開始往下復制 n 行,[n] 表示一個整數
-
p :將復制后的文本粘貼到光標所在的下一行
-
u :撤銷上次操作
-
Ctrl r :恢復上次操作
-
快捷修改單個字母: 先按 r 鍵,再輸入要替換的內容
2. 光標移動
-
^ :光標移動到行首
-
$ :光標移動到行尾
-
gg :光標定位到文檔頭
-
G :光標定位到文檔尾
-
[n]G :光標定位到第 n 行行首,[n] 表示一個整數,比如 20G
也可以通過冒號 + 數字來定位到第幾行,比如 :20
較不常用:
-
H :光標定位到當前頁首
-
L :光標定位到當前頁的最后一行的行首
-
w :光標往后移一個字 / 單詞
-
b :光標往前移一個字 / 單詞
3. 查找與替換
1)查找
/[str] :用來查找字符串 str ,[str] 表示要查找的字符串。回車后會加亮顯示所有找到的字符串,輸入 n 移動到下一個找到的字符串,輸入 Ctrl n(即 N)移動到上一個找到的字符串。
例如:vim ~/.bashrc ,然后輸入 /alias ,輸入 n 向下翻,輸入 N 向上翻。
2)替換
部分替換
: s/[src]/[dst](只能替換光標所在的行)
例如:若要將光標所在行的 hello little dog 替換成 hello little cat ,則輸入 : s/dog/cat
-
/i :忽略大小寫
-
/g :全部匹配
例如:若要將 1-6 行的 hello 或 Hello 替換成 good ,則輸入 :1,6 s/hello/good/ig
全部替換
:%s/[src]/[dst]/g :將文檔中所有 src 的字符串替換為 dst 字符串
例如:若要將文檔中所有的 hello 替換成 good ,則輸入 :%s/hello/good/g
:%s/^ //g :將文檔每一行的行首的空格去掉,想去掉幾個空格,就在 ^ 與 // 之間打幾個空格。
4. 塊操作
v :可視化塊選擇狀態,頁面底部會出現 “- - 可視 - -” 的字樣,選中塊之后,可以對塊進行刪除(d),復制(y),剪切(x)
Ctrl + v :豎向選擇模式,頁面底部會出現 “- - 可視 塊 - -” 的字樣
1)批量刪除
假設你想刪除多行文本開頭的字符,可以按以下步驟操作:
-
將光標放在要刪除的字符上,按下 Ctrl + v 進入塊模式。
-
移動光標選擇要操作的行。
-
按下 d 鍵刪除選中的字符
2)批量插入
如果你想在多行文本的開頭插入相同的內容,可以按以下步驟操作:
-
按下 Ctrl + v 進入塊模式,選擇要操作的行。
-
按下大寫 I 鍵(即 Shift + i),進入插入模式。
-
輸入你想要插入的內容,例如批量注釋代碼就輸入 “//” 。
-
按下 Esc 鍵退出插入模式,插入的內容會應用到所有選中的行
3)塊內替換
Vim 還支持在塊內進行替換操作。例如,你可以使用 %V 進行塊內替換:
-
按下 Ctrl + v 選擇要替換的塊。
-
按下 : 進入命令模式。
-
輸入 s/%V[舊文本]/[新文本]/g,然后按下回車鍵
4)塊復制和粘貼
你可以使用塊模式復制和粘貼文本:
-
按下 Ctrl + v 選擇要復制的塊。
-
按下 y 鍵復制選中的內容。
-
移動光標到目標位置,按下 p 鍵粘貼內容
5)塊刪除和剪切
塊刪除和剪切操作類似:
-
按下 Ctrl + v 選擇要刪除或剪切的塊。
-
按下 d 鍵刪除選中的內容,或按下 x 鍵剪切選中的內容
6)塊覆蓋
塊覆蓋指的是在一個地方通過塊復制或塊剪切方式得到塊的副本,然后在另一個地方再次塊選擇一個塊的方位,按下 p 鍵,即可實現用塊內容覆蓋目標塊。
5. 文檔保存及退出
結束編輯,按 Esc 鍵進入命令狀態。
-
:q :在未修改文檔的情況下退出
-
:q! :放棄文檔的修改,強行退出
-
:w :文檔存盤
-
:wq or :x :文檔存盤退出
需要注意:此時的鍵盤需要是英文的,冒號和感嘆號必須是英文冒號和感嘆號。
6. vim 的配置
放置 .vimrc 到 ~ 目錄下:vim ~/.vimrc ,然后將下列指令放置在文件內:
set nu
set cursorline
set hlsearch
set tabstop=4
set fileencodings=utf-8,gbk,gb2312
-
set nu :顯示行號
-
set cursorline :加一條橫線
-
set hlsearch :搜索時高亮
-
set tabstop=4 :Tab 鍵是 4 個空格
-
set fileencodings=utf-8,gbk,gb2312 :設置編碼
注意:用 vim 編輯文件時,使用的注釋符號是一個雙引號 " 。
7. 其他
1)Ctrl+s
如果在編輯過程中不小心按了 Ctrl+s ,vim 會處于僵死狀態(被凍結),此時按 Ctrl+q 可以恢復。
2)Ctrl+z
在命令狀態時,按了 Ctrl+z ,此時會出現如下所示的情況:
輸入查看系統內所有進程的命令:ps -elf ,可以發現該進程雖然已經暫停,但仍占據內存空間
輸入殺死進程的命令:kill -9 2823 ,然后再查看系統內所有進程:ps -elf ,可以發現進程已被殺死
若此時再輸入命令:vim file1 ,會出現下圖所示的情況:
可以選擇恢復:按下 R 鍵,如果不想下次打開仍出現上述情況,則按下 D 鍵刪除交換文件。
3)了解
-
在命令模式中輸入 :help :查看該命令的幫助提示(不常用,通過 :q 進行退出)
-
在命令模式中輸入 :%!xxd :進入十六進制模式
-
在命令模式中輸入 :%!xxd -r :返回文本模式
-
在命令模式中輸入 gg=G 可以自動對齊,可以通過輸入 gg=10gg 只自動對齊第一行到第十行
-
增加一個橫向的 vim :在命令模式下執行 :sp or :new [文件名] ;增加一個縱向的 vim :在命令模式下執行 :vsp or :vnew [文件名](按 Ctrl+w 切換光標的區域,按 :q 退出)
-
定位到 file 的第 3 行:執行 vim +3 file
-
定位到第一個 hello 處:執行 vim +/hello file
三、VIM 外使用到的命令
1. 管道查找替換程序 sed
舉例:
1)將家目錄下所有的 py 文件中的 function 替換成 case :find . -name “*.py” | xargs sed -i ‘s/function/case/g’
利用 find . -name “*.py” | xargs grep case 可以看出已經修改成功。
2)將 hello.py 中的 function 替換成 case 并重定向輸出到 hello_new.py 中:sed ‘s/function/case/g’ hello.py > hello_new.py
2. vimdiff 命令
vimdiff 命令是 Vim 編輯器 的 diff 模式,用于比較和合并文件。它等同于 vim -d 命令,可以同時打開多個文件,并高亮顯示文件中內容的差異部分。
1)啟動 vimdiff
vimdiff hello.py hello_new.py or vim -d hello.py hello_new.py
這會在 Vim 編輯器中垂直分割窗口,分別顯示兩個文件,并用不同的背景色高亮顯示差異部分。
2)光標移動
在 vimdiff 模式下,可以使用以下快捷鍵在差異點之間移動光標:
-
]c :跳轉到下一個差異點
-
[c :跳轉到上一個差異點
-
要在兩個窗口之間切換光標,可以使用以下按鍵:
Ctrl-w l :切換到右側窗口
Ctrl-w h :切換到左側窗口
Ctrl-w w :在兩個窗口間切換
3)內容合并
vimdiff 提供了方便的命令來合并文件內容:
-
dp(diff put):將當前差異點的內容覆蓋到另一文件中的對應位置
-
do(diff obtain):將另一窗口中差異點的內容拉取到當前位置并進行替換
4)同時操作兩個文件
在 vimdiff 模式下,可以使用 Vim 編輯器的命令和快捷鍵來操作文件:
-
:qa :退出所有文件
-
:wa :保存所有文件
-
:wqa :保存并退出所有文件
-
:qa! :強制退出(不保存)所有文件