每天一個 Linux 命令:vim 命令

1. 簡介

vim 是 Linux 操作系統中最通用的全屏幕文本編輯器,是 vi 的增強版(vi iMproved),與 vi 完全兼容,且擴充了很多功能。

vim 編輯器支持編輯模式和命令模式,編輯模式下可以完成文本的編輯功能,命令模式下可以完成對文件的操作命令,要正確使用 vim 編輯器就必須熟練掌握這兩種模式的切換。默認情況下,打開 vim 後自動進入命令模式。從編輯模式切換到命令模式使用 ESC 鍵,從命令模式切換到編輯模式使用 A、a、O、o、I、i 鍵。

2. 命令格式

vim [OPTIONS] [FILE...]
vim [OPTIONS] -
vim [OPTIONS] -t TAG
vim [OPTIONS] -q [ERRORFILE]

[FILE...]表示一系列使用 vim 編輯的文件,使用:next命令可以向前切換所編輯的文件,使用--可以向後切換。這是 vim 常用啓動格式;

-:表示待編輯的文件從標準輸入讀取;

-t TAG:要編輯的文件和光標的初始位置取決於一個標籤,一種 goto 標籤。標籤在標籤文件中查找,與標籤關聯的文件成爲當前文件並執行關聯的命令。主要用於 C 程序,在這種情況下 TAG 可以是函數名,其結果是包含該函數的文件成爲當前文件,並且光標位於函數的開頭。參見::help tag-commands

-q [ERRORFILE]:使用 quickFix 模式啓動 vim,文件 ERRORFILE 將被讀取並顯示第一個錯誤。如果 ERRORFILE 省略,則默認爲 AztecC.Err(Amiga 系統)或 errors.err(其它系統)。關於 quickFix 模式說明,可以使用:help quickfix查看。

3. 選項說明

+NUM
 打開文件時光標跳轉到由 NUM 指定的行首
+/PAT
 打開文件時光標跳轉到匹配的模式字符串 PAT
+, -c CMD
 在完成對第一個文件的讀取後,執行給出的指令
-b
 以二進制模式打開文件,用於編輯二進制文件和可執行文件
-C
 以兼容模式運行 vim,使 vim 的表現更像 vi,即使存在 .vimrc 文件
-d
 以 diff 模式打開文件,當多個文件編輯時,顯示文件差異部分
-e
 進入 Ex 模式,即進入冒號開頭的末行模式。ex是Unix編輯器
-E
 進入增強 Ex 模式,就像執行命令 exim
-l
 使用 lisp 模式,打開 lisp 和 showmatch
-m
 取消寫文件功能,重設 write 選項。你仍然可以修改緩衝內容,但是不可以寫入文件
-M
 關閉修改功能
-N
 非兼容模式運行 vim,這會使 vim 表現的更好,但是可能會存在與 vi 不兼容的情況,即使存在 .vimrc 文件
-n
 不使用 swap file,這可能會導致在 vim 意外崩潰的情況下無法恢復未保存的內容
-o [N]
 以上下排列方式同時打開 N 個 vim 窗口,如果未指定 N ,則爲每一個文件單獨打開一個窗口
-O [N]
 以左右下排列方式同時打開 N 個 vim 窗口,如果未指定 N ,則爲每一個文件單獨打開一個窗口
-R
 以只讀方式打開文件
-r
 列出 swap file
-r FILE
 以指定的交換文件來恢復崩潰的編輯會話。交換文件名後綴爲.swp
-s
 安靜模式,與 -e 選項結合使用
-u VIMRC
 使用指定的 vimrc 文件中的命令來初始化 vim,所有其它的初始化操作將被跳過。可以給定“NONE”來跳過所有的初始化
-U GVIMRC
 使用指定的 gvimrc 文件中的命令來初始化 GUI,所有其它的 GUI 初始化操作將被跳過。可以給定 “NONE” 來跳過所有的 GUI 初始化
-V [N]
 以冗餘模式執行 vim,打印 vim 讀取了哪些配置文件 vimrc。可選的數字 N 表示冗餘級別,數值越大級別越高,取值範圍是 0~10,默認是 10
-x
 寫文件時進行加密,會提示輸入加密密鑰
-h, --help
 顯示幫助信息並退出
--version
 顯示版本信息並退出

4. 內置命令說明

vim 提供了豐富的內置命令,有些內置命令使用鍵盤組合鍵即可完成,有些內置命令則需要以冒號 : 開頭輸入。常用內置命令如下:

Ctrl+u:向下滾動半屏
Ctrl+d:向上滾動半屏
Ctrl+f:向下滾動一屏
Ctrl+b:向上滾動一屏
Ctrl+e:向下滾動一行
Ctrl+y:向上滾動一行
Enter:回車向下滾動一行
Esc:從編輯模式切換到命令模式
ZZ:命令模式下保存當前文件所做的修改後退出 vim
:[行號]:光標跳轉到指定行的行首
:$:光標跳轉到最後一行的行首
gg:跳轉到首行;
G:跳轉到尾行
Ctrl+g:顯示總行數
x, X:刪除一個字符或選中的內容。當刪除一個字符時,x 刪除光標後的,X 刪除光標前的。刪除即剪切
d:刪除選中的文本,刪除即剪切
D:刪除從當前光標到光標所在行尾的全部字符。刪除即剪切
dd:刪除光標所在行的整行內容。刪除即剪切
ndd:刪除當前行及其後n-1行,n爲一個數字。刪除即剪切
y:複製選中的文本
y0:複製光標前一個字符到行首的內容
y$:複製光標後一個字符到行尾的內容
yh:複製光標前的1個字符
yl:複製光標後的1個字符
nyh:複製光標前的n個字符,比如4yh複製光標前的4個字符
nyl:複製光標後的n個字符,比如4yl複製光標後的4個字符
yy:複製光標所在的當前行
nyy:複製當前行以及其後n-1行,n爲一個數字;
p:小寫p,粘貼文本操作,用於將緩存區的內容粘貼到當前光標所在位置的下方
P:大寫P,粘貼文本操作,用於將緩存區的內容粘貼到當前光標所在位置的上方;
/[字符串]:向後搜索,支持正則表達式。用於從當前光標所在位置開始向文件尾部查找指定字符串的內容,查找的字符串會被加亮顯示。鍵入字符 n 跳轉到下一個,N 跳轉到前一個
?[字符串]:向前搜索,支持正則表達式。用於從當前光標所在位置開始向文件頭部查找指定字符串的內容,查找的字符串會被加亮顯示。鍵入字符 n 跳轉到下一個,N 跳轉到前一個
:a,bs/F/T:替換文本操作,將a到b行之間第一個F換成T字符串。其中,":s/"表示進行替換操作。不指定a和b,則默認爲當前行;如果b爲$,表示替換到末行;如果是a,b爲%,即:%s/F/T,表示從第一行替換至末行
:a,bs/F/T/g:替換文本操作,替換第a行到b行,每一行所有F爲T。a,b的取值規則同上一條;
a:在當前字符後添加文本
A:在當前行末添加文本
i:在當前字符前插入文本
I:在當前行首插入文本
no:在當前行後面插入n個空行,n爲具體的數值
nO:在當前行前面插入n個空行,n爲具體的數值
:wq:執行存盤退出操作
:w:執行存盤操作
:w!:執行強制存盤操作
:q:執行退出操作
:q!:執行強制退出操作
:e [文件名]:打開並編輯指定名稱的文件
:n:如果同時打開多個文件,則繼續編輯下一個文件
:f:顯示當前的文件名、文件總行數、光標所在行號佔總行數的比例
:set number:在最左端顯示行號
:set nonumber:在最左端不顯示行號
jkhl或方向鍵:光標移動快捷鍵,分別爲上下左右
u:撤銷
ctrl+r:反向撤銷
v+移動光標:使用v進行選擇模式,移動光標可選擇文本
w:word,右移一個單詞,光標停留在單詞首部
e:end,右移一個單詞,光標停留單詞的尾部
b:back,左移一個單詞,光標停留在單詞首部
^ 或 (:移至行頭
$ 或 ):移至行尾
gd:高亮顯示光標所在的單詞

5.vim 需知

5.1 vim 的四大模式

衆所周知,vim 裏面最具特色的東西就是它可以切換模式,那什麼是模式呢?可以簡單的理解爲在不同的模式下面按相同的鍵而得到不同的效果。比如 vim 在插入模式下面連按兩次 d,那麼就會在光標位置插入兩個字母 d,如果在正常模式下面連按兩次 d,那麼光標所在當前行將會被刪除。

既然說是 vim 的四大模式,那麼 vim 到底有那四大模式呢?

用戶可以通過按 ESC 在各個模式之間進行切換。關於 vim 的模式說明,可以打開 vim 後鍵入 :help mode 來查看。

不管用戶處於何種模式,只要按一下 ESC 鍵,即可進入正常模式。啓動 vim 命令默認情況下進入正常模式。

在正常模式下,用戶可以輸入各種合法的 vim 命令,用於管理自己的文檔。此時從鍵盤上輸入的任何字符都被當做編輯命令來解釋,若輸入的字符是合法的 vim 命令,則 vim 在接受用戶命令之後完成相應的動作。但需注意的是,所輸入的命令並不在屏幕上顯示出來。若輸入的字符不是 vim 的合法命令,vim 會響鈴報警。

可視模式簡單來說就是選中一塊編輯區域,然後在上面執行一些操作,比如刪除,替換,改變大小寫等。

在正常模式按下 v(逐個字符選擇文本)、 V(逐行選擇文本)、Ctrl+v(按照塊的方式選擇文本),可以進入可視模式。可視模式中的操作有點像拿鼠標進行操作,選擇文本的時候有一種鼠標選擇的即視感,有時候會很方便。

在正常模式下輸入插入命令 i(insert)、附加命令 a (append)、打開命令 o(open)、修改命令 c(change)、取代命令 r(replace)或替換命令 s(substitute)都可以進入插入模式。在該模式下,用戶輸入的任何字符都被 Vi 當做文件內容保存起來,並將其顯示在屏幕上。在文本輸入過程中,若想回到命令模式下,鍵入 ESC 鍵即可。

命令行模式又稱爲 ex 模式。ex 是 EXtended 的簡稱,是 Unix 系統上的純文本編輯器。ex 命令可啓動 vim,執行 ex 命令,並鍵入 visual 就可以進入 vim 的正常模式。

vim 和 ex 編輯器的功能是相同的,二者主要區別是用戶界面。在 vim 中,命令通常是單個鍵,例如 i、a、o 等;而在 ex 中,命令是以按回車鍵結束的行。在正常模式下,用戶按冒號即可進入命令行模式,此時 vim 會在顯示窗口的最後一行顯示一個冒號作爲命令行模式的提示符,等待用戶輸入命令。多數文件管理命令都是在此模式下執行的(如把編輯緩衝區的內容寫到文件中等)。命令執行完後,vim 自動回到正常模式。

5.2 vim 相關編碼選項

文件的編碼和顯示是一個令人頭痛的東西,真希望這個世界上只存在 utf-8 編碼,那就沒那麼痛苦了。vim 編碼配置涉及 4 個選項,分別是 encoding 、fileencoding、fileencodings 和 termencoding,四者對應的簡寫分別爲 enc、fenc、fencs 和 tenc。

(1)encoding encoding 是 vim 內部使用編碼。vim 運行時,其菜單、標籤、以及各個緩衝區統一使用 encoding 作爲字符編碼。

(2)fileencoding fileencoding 爲文件採用的編碼方式。使用 vim 打開文件後,可以使用末行命令:set fenc=utf-8將文件編碼方式更改爲 UTF-8,注意,前提是 vim 打開文件時已經正確識別出文件編碼,即未出現亂碼。

(3)fileencodings fileencodings 用於 vim 在打開文件的時候進行解碼的猜測列表。文件編碼沒有百分百正確的判斷方法,所以 vim 只能猜測文件編碼。~/.vimrc 裏面 fileencodings 的設置一般爲

set fileencodings=utf-8,gb18030,latin1

(4)termencoding 終端所使用的文本編碼。這個選項的值用於告訴 VIM 終端使用了哪種文本編碼用於文本輸入和顯示。如果該值爲空,那麼它被設置爲 encoding 的值。

5.3 vim 讀寫文件時編碼轉換過程

(1)讀文件

vim 打開文件時,需要將磁盤文件內容載入緩存,並將緩存中的字符轉爲換終端編碼,通過網絡傳輸的方式,傳輸到終端進行顯示。兩個轉換環節,有一個出錯都會出現亂碼。

fileencoding -> encoding -> termencoding

(2)寫文件

通過終端編輯文件時,字符編碼轉換過程是 vim 讀文件的逆過程。

termencoding -> encoding  -> fileencoding

注意:使用 vim 讀寫文件時爲避免出現亂碼,至關重要的一點就是終端,比如 SecureCRT 或 XShell 的編碼設置要與 vim 的 termencoding 設置相同,如果不同還是還是會出現亂碼,儘管 vim 已經採用正確的編碼格式解析了文件。比如將 XShell 設置爲 UTF-8。

6.vim 常見用法

(1)vim 查看文件編碼

:set fileencoding
或者簡寫
:set fenc

可顯示文件編碼格式。這個命令有致命的缺點。原因是隻有正常顯示文件內容時,該命令顯示的文件編碼格式纔是文件本身的編碼格式。因爲該命令顯示的編碼格式並不是文件本身的編碼格式,而是當前打開該文件所使用的編碼格式。因此,這個命令在網上的說明大都是不準確的,特此說明。

(2)修改編碼類型

使用 vim 修改:

:set fileencoding=gbk
#或者
:set fenc=gbk

使用 iconv 來修改文件編碼:

iconv -f encoding -t encoding inputfile#比如將一個GBK編碼的文件轉換成UTF-8編碼iconv -f GBK -t UTF-8 file1 -o file2UTF-8

iconv 的參數說明:

-f, --from-code=名稱,原始文本編碼-t, --to-code=名稱,輸出編碼-l, --list 列舉所有已知的字符集-c 從輸出中忽略無效的字符-o, --output=FILE,輸出文件-s, --silent,關閉警告--verbose,打印進度信息

(3)vim 指定編碼類型瀏覽文件

如果知道了文件的編碼類型,可顯示指定編碼類型來解析文件,而不用 vim 去猜測文件的編碼類型,事實上猜測的往往是錯誤。命令如下:

vim file_name -c "e ++enc=utf-8"

或者在使用 vim 打開文件之後,在末行模式使用如下命令:

:e ++enc=utf-8

(4)vim 新增空白行

新增一行空白,在命令行模式下輸入 o。如果想添加三行的話,鍵入 3o ,如果想添加 n 行則鍵入 n 個 o。如果鍵入 3o 後立即退出插入模式的話,就可以添加三個空白行。如果輸入一些內容再退出,可以添加三行相同的內容。

如果想在每一行執行相同的命令,在 vim 裏可以用 :g 實現。一般的語法是:

:g/pattern/cmd

它表示在匹配 /pattern/ 這個正則表達式的行上執行 cmd 命令(也稱冒號命令)。而 /^/ 這個表達式,用於匹配行首。因爲任何一行都有行首,你的要求就很容易實現了:

:g/^/norm 3o

norm 這個命令的意思是,把後面的參數看成是在普通模式下的按鍵,即命令模式下的按鍵。

(5)vim 高亮顯示選中的單詞

將光標移到需要高亮顯示的單詞上,在命令模式下輸入 gd,那麼就可以將當前的單詞在當前文本中全部高亮顯示,如下圖所示,高亮顯示 dwBeInvitedUinLen。

(6)vim 輸入特殊字符

有三種方法,第一種是使用字符編碼,第二種是使用二合字母(digraph),三是使用快捷鍵(Ctrl + 字母)。

使用字符編碼:

vim 可以用字符編碼插入任意字符,使用此功能可以方便地輸入鍵盤上找不到的字符。使用步驟如下:

(1)編輯模式下按下 Ctrl+v;

(2)如果是 ASCII 字符,則輸入三位十進制 ASCII 碼值,不足三位,前補 0。比如輸入大寫字母 A,則輸入 065;如果是 Unicode 字符,則輸入 “u + 四位十六進制碼值”。比如輸入大寫字母 A,則輸入 u0041。

更多詳情內容可參見 vim 的幫助文檔,末行模式輸入:h i_ctrl-v_digit

使用二合字母(digraph):

二合字母顧名思義,使用兩個字母的組合來標識特殊字符。使用步驟如下:

(1)編輯模式下按下 Ctrl+k;

(2)輸入特殊字符對應的二合字母。可以使用:dig:h digraph-table查看對應二合字母。比如回車符(Carriage Return) 的二合字母是 CR。

Ctrl + 字母:

在 vim 中,使用:set list顯示所有字符時,經常會看到有^I、^M等符號,代表的字符可以使用:h digraph-table查看,特殊字符列表如下:

在 vim 的編輯模式下,可使用 “Ctrl + 字母” 進行輸入,例如使用 "Ctrl+i" 或 "Ctrl+I" 可以輸入字符^I(Tab),使用 "Ctrl+m" 或 "Ctrl+M" 可以輸入字符^M(回車)。

(7)vim 其它常見操作

#顯示行號
:set number

#取消行號
:set nonu

#取消高亮顯示查找後的字符串
:nohl

#顯示換行符
:set list

#不顯示換行符 
:set nolist

7. 小結

vim 仍有很多未知的東西等待我們去發現,如果 vim 使用過程中有問題,歡迎留言,一同探討解決進步。

參考文獻

[1] vim(1) manual

[2] Linux 命令大全. vi 命令

[3] VIM 亂碼原因與解決方案

[4] Vim 如何插入特殊字符

[5] 讓 VIM 徹底告別亂碼

[6] vim 複製字符

[7] CSDN.Vim 技巧之四大模式_普通模式

[8] freecodecamp.Vim Editor Modes Explained

轉自:戀貓大鯉魚

https://dablelv.blog.csdn.net/article/details/78667783

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/RNe-HxoLOMMyg1yt2R-mJw