Linux --- vim 常用操作

1、vim 的三種模式

vim(visual interface improve) 是 vi 的升級版本,也是 linux 中最常見的一種交互式文本編輯器。

三種模式之間的切換如下圖所示:

image

2、vim 的常用操作

下面分別介紹一下vim各個(gè)模式的常見操作:

2.1、一般模式(normal mode)

當(dāng)使用 vim /path/file_name 打開一個(gè)文件后,首先見到的就是一般模式(normal),在這個(gè)模式下,可以進(jìn)行文本的復(fù)制,粘貼,刪除等操作。

在一般模式下,可以使用鍵盤來控制光標(biāo)的移動(dòng),下面是我在工作中常用的一些按鍵,掌握了這些,可以大大加快你使用 vim 編輯的速度。

表1:光標(biāo)移動(dòng)

按鍵 說明
k(↑)、j(↓)、h(←)、k(→) 光標(biāo)以字符為單位,上下左右移動(dòng)
w 光標(biāo)以單詞為單位,移動(dòng)到下一個(gè)單詞的詞首
0 光標(biāo)以行為單位,移動(dòng)到光標(biāo)所在行的行首
$ 光標(biāo)以行為單位,移動(dòng)到光標(biāo)所在行的行尾
ctrl+f 光標(biāo)以屏幕為單位,向下翻一屏
ctrl+b 光標(biāo)以屏幕為單位,向上翻一屏
gg 或 1G 光標(biāo)以文檔為單位,移動(dòng)到文檔開頭
光標(biāo)以文檔為單位,移動(dòng)到文檔結(jié)尾 G

在一般模式下可以對文件進(jìn)行復(fù)制、粘貼、刪除操作。

表2:編輯操作

按鍵 說明
y 復(fù)制光標(biāo)選中的內(nèi)容
p(大P正好是相反,在光標(biāo)所在行的上面粘貼) 在光標(biāo)所在行的下一行,粘貼所選擇的內(nèi)容
x(大X的使用效果與backspace相同) 以字符為單位,刪除光標(biāo)所在處的一個(gè)字符
d 刪除光標(biāo)選中的內(nèi)容

當(dāng)你在 windows 上面,習(xí)慣了使用鼠標(biāo)進(jìn)行選中時(shí),一下子使用 vim 可能會有不習(xí)慣的地方。其實(shí)在 vim 中也有類似鼠標(biāo)選擇的功能,而且相較于 windows 上面常見的選擇功能可能更加強(qiáng)大。

表3:選中

按鍵 說明
v 以字符為單位,光標(biāo)經(jīng)過的地方都會被選中
shift+v 以行為單位,光標(biāo)經(jīng)過的地方都會被選中
ctrl+v 以列為單位,光標(biāo)經(jīng)過的地方都會被選中

在 vim 中也有類似 word 中的撤消,恢復(fù)等功能

表4:撤消、恢復(fù)、重復(fù)

按鍵 說明
u 撤消上一個(gè)動(dòng)作
ctrl+r 恢復(fù)上一個(gè)動(dòng)作
. 重復(fù)上一個(gè)動(dòng)作
2.2、編輯模式

那當(dāng)我需要添加一些內(nèi)容的時(shí)候呢,這個(gè)時(shí)候要以通過以下方式,進(jìn)入編輯模式。編輯模式有兩種一種是插入模式(insert),別一種是改寫模式(replace)。改寫模式我除了做實(shí)驗(yàn),在生產(chǎn)中從來就沒有用過,這邊就暫時(shí)不列出來了。

表5:進(jìn)入或退出編輯模式

按鍵 說明
i(insert) 以字符為單位,在當(dāng)前光標(biāo)所在處進(jìn)行輸入
a(append) 以字符為單位,在當(dāng)前光標(biāo)處退后一個(gè)字符輸入
I 以行為單位,在當(dāng)前光標(biāo)所在行的行首輸入
A 以行為單位,在當(dāng)前光標(biāo)所在行的行尾輸入
o(open) 在當(dāng)前光標(biāo)所在行的下一行,打開一個(gè)新行輸入
O 在當(dāng)前光標(biāo)所在行的上一行,打開一個(gè)新行輸入
Esc鍵 返回編輯模式
2.3 命令模式

當(dāng)我要對文檔內(nèi)容進(jìn)行一些查找,替換,保存,退出或臨時(shí)更改 vim 的屬性時(shí),就要使用命令模式,它通常使用 :(冒號)/(斜線)?(問號) 三種方式進(jìn)入,而使用 Esc 鍵返回編輯模式。

下面就介紹一些命令行模式下常用的操作:

注:

以下內(nèi)容中,如果是用:(冒號)進(jìn)入的命令模式,那介紹時(shí)冒號我就省略了。

表6:查找與替換

按鍵 說明
/string 使用n(next)代表查找下一個(gè),N代表查找上一個(gè),下同。 以光標(biāo)所在處,向下查找字符串string
?string 以光標(biāo)所在處,向上查找字符串string
/pattern/ 使用正則表達(dá)式進(jìn)行模糊匹配
n1,n2s/pattern/string/g 如果不加g(global)那么默認(rèn)只會替換每行查找到的第一個(gè),符合pattern的內(nèi)容 在n1~n2行之間查找,符合模式pattern的內(nèi)容,并將其替換成字符串string
1,$s/pattern/string/g;%s/pattern/string/g 兩者是等效的,隨便用哪個(gè) 全文替換,有兩種表達(dá)方式
n1,n2s/pattern/string/gc;c(confirm) 在替換前進(jìn)行詢問確認(rèn)

表7:保存、退出等

按鍵 說明
w 對編輯的內(nèi)容進(jìn)行保存
w file_name 將當(dāng)前文檔另存為file_name
w! 強(qiáng)制保存,當(dāng)編輯一些只讀文件時(shí),需要用到這個(gè)
q 退出關(guān)閉vim
q! 放棄所有編輯,并強(qiáng)制退出
x 保存編輯并退出
!command 在vim中執(zhí)行bash命令
r file_name 在已經(jīng)打開一個(gè)文件后,還想在當(dāng)前vim中再打開其它文件,這個(gè)功能我很少用,我一般使用下面要介紹的多窗口編輯,兩種方式無優(yōu)劣之分,更多的是使用習(xí)慣上的區(qū)別。

命令模式中可以臨時(shí)設(shè)置 vim 的屬性,我常用的有以下幾個(gè),更多的內(nèi)容可以自行查看 vim 的 help 文件或 Google,如果不想每次都進(jìn)行更改,可以將其寫到 vim 的配置文件中。

注:

不推薦直接修改 vim 的默認(rèn)配置文件 /etc/vimrc 建議在用戶的家目錄新建 .vimrc 文件,將自己個(gè)性化配置記錄其中。

表8:臨時(shí)設(shè)置vim的屬性

按鍵 說明
set nu/nonu 顯示或關(guān)閉行號
set hlsearch/nohlsearch 打開或關(guān)閉搜索結(jié)果高亮顯示
set syntax on/off 打開或關(guān)閉語法著色
help 打開vim的幫助文件

到此 vim 一些常見的基礎(chǔ)操作就介紹完了,附錄為 vim 的多窗口操作。

而 vim 操作的一大特色就是可以進(jìn)行組合操作,比如說保存退出,可以這樣做 :wq ;再比如,我想把1到10行全部刪除,可以這樣做 :1,10d,更多的組合操作,就期待大家在實(shí)踐中慢慢發(fā)現(xiàn)了


附A:vim 的多窗口操作

表9:常用分屏操作

按鍵 說明
sp filename 用水平分屏的方式打開新文件
vsp filename 用垂直分屏的方式打開新文件
ctrl+w+[k(↑)/j(↓)/h(←)/k(→)] 光標(biāo)上下左右移動(dòng)

附B:vim使用環(huán)境配置

vim的編碼設(shè)置

vim的全局環(huán)境變量的配置文件是 /etc/vimrc,但一般不建議修改這個(gè)配置文件,而是在自己用戶家目錄,新建 .vimrc 文件,在該文件中定義自己個(gè)性化的需求。

當(dāng)我們需要在 windows 與 linux 之間來回復(fù)制文件時(shí),因?yàn)?windows 默認(rèn)使用的編碼規(guī)則是 cp936(基本等同于GBK),而 linux 通常使用的是 utf-8 進(jìn)行編碼。所以常常會出現(xiàn)亂碼的情況,為了盡量避免這種情況的發(fā)生,我們就需要對 vim 的默認(rèn)編碼環(huán)境進(jìn)行設(shè)置。

在 vim 中與字符編碼相關(guān)的有四個(gè)變量,與今天我們配置相關(guān)的,主要有兩個(gè):fileencodings 和 fileencoding

下面分別對這四個(gè)編碼變量做個(gè)簡單說明:

  • encoding: vim 的內(nèi)部使用的編碼規(guī)則,vim 內(nèi)部所有的 buffer,寄存器,腳本中的字符串等都會使用這個(gè)編碼。通常我們使用的是 utf-8,并且不建議去修改這個(gè)值。當(dāng)一個(gè)文件的編碼與 encoding 不一致時(shí),vim 會先將文件編碼轉(zhuǎn)換成內(nèi)部編碼,文件中含有沒有辦法轉(zhuǎn)換成內(nèi)部編碼的字符時(shí),這個(gè)字符就會丟失。

  • termencoding: 是 vim 用于屏幕顯示的編碼,在顯示的時(shí)候 vim 會把內(nèi)部編碼轉(zhuǎn)換成顯示編碼,如果內(nèi)部編碼含有無法轉(zhuǎn)換成屏幕編碼的字符時(shí),就會以 ? 號顯示。但不會出現(xiàn)字符丟失的情況。

  • fileencodings: 是一個(gè)以逗號分隔的列表,列表的每一項(xiàng)就是一種編碼的名稱。當(dāng) vim 打開一個(gè)文件時(shí),會依次用 fileencodings 中的編碼方式進(jìn)行解碼,如果解碼成功的話,就會用這種方式進(jìn)行解碼,并將 fileencoding 設(shè)置為這個(gè)值。如果不成功,就繼續(xù)試驗(yàn)下一個(gè)編碼方式。如果全不成功的話,默認(rèn)會用最后一種解碼方式對文件內(nèi)容進(jìn)行解碼。

注:

通常情況下,使用了錯(cuò)誤的解碼方式,就會造成亂碼,為了盡量的避免這種情況發(fā)生。
推薦值為:

set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
  • fileencoding: vim 在讀取文件時(shí),會對文件內(nèi)容的編碼規(guī)則進(jìn)行探測,當(dāng)現(xiàn)文件編碼規(guī)則與 encoding 不一致時(shí),就會調(diào)用 fileencodings 來嘗試解碼。當(dāng)解碼成功后,會設(shè)置 fileencoding 的值,這個(gè)值按我的理解就是一個(gè)標(biāo)識,用于文件編輯完成后存盤時(shí)使用。將內(nèi)部編碼轉(zhuǎn)換成 fileencoding 標(biāo)識的編碼后,進(jìn)行存盤。

vim 是調(diào)用外部命令,iconv 來實(shí)現(xiàn)編碼之間的轉(zhuǎn)換。如果你想手工轉(zhuǎn)換文件的默認(rèn)編碼方式,也可以通過 iconv 來進(jìn)行。具體的使用方法要以 man 一下。

注1:

只有在對文件正確解碼的前提之下,對文件轉(zhuǎn)碼才有意義。也就是說,當(dāng)你已經(jīng)打開了一個(gè)文件,發(fā)現(xiàn)文件內(nèi)容是亂碼,這個(gè)時(shí)候,你通過設(shè)置 fileencoding 這個(gè)值,是沒有辦法糾正亂碼的。

注2:

如果你不想每次手工設(shè)置 vim 環(huán)境變量的話,也可以將其寫入配置文件,永久保存。除了上面提供的,還有許多可定制的選項(xiàng),建議自行通過 help 文件,研究一下。

注3:

vim windows 版本初始化:

syntax on
set nobackup
colorscheme darkblue
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1

附C:vim 的臨文件

在使用 vim 編輯一個(gè)文件時(shí),vim 會在被編輯文件所在的目錄下面,新建一個(gè)名為 .file_name.swp 的文件。

有時(shí)候當(dāng)你打開一個(gè)文檔,發(fā)現(xiàn)會有如下提示時(shí)
這個(gè)提示分成三部分

  1. 提示發(fā)現(xiàn)一個(gè)臨時(shí)文件,以及對臨時(shí)文件基本情況的一個(gè)概述
  2. 介紹了出現(xiàn)這種情況的兩種原因
  3. 提供了一些處置選項(xiàng)
E325: ATTENTION
Found a swap fileby the name ".vimrc.swp"
owned by: root   dated: Sun Aug  3 19:04:49 2014
filename: ~root/.vimrc
modified: no
user name: root   host name: localhost.localdomain
process ID: 4344 (still running)
While opening file".vimrc"
dated: Sun Aug  3 12:41:39 2014
(1) Another program may be editing the same file.
If this is the case, be careful not to end up with two
different instances of the same filewhen making changes.
Quit, or continuewith caution.
(2) An edit session forthis filecrashed.
If this is the case, use ":recover"or "vim -r .vimrc"
to recover the changes (see ":help recovery").
If you did this already, delete the swap file".vimrc.swp"
to avoid this message.
Swap file".vimrc.swp"already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

兩種情況生成的處置項(xiàng)菜單也是有區(qū)別的,第二種情況會多一個(gè) delete 選項(xiàng)

  • 對于第一種情況,有其他人或程序也在編輯同一個(gè)文件,為保持?jǐn)?shù)據(jù)的一致性,最好是選擇以只讀方式打開,或者干脆就直接退出,等其他人使用完成后,再來編輯。
  • 對于第二種情況,由于編輯器崩潰引起,如果你想恢復(fù)到崩潰前的狀態(tài),可以選擇recover。如果你確定這個(gè)臨時(shí)文件已沒有用了,可以選擇delete。當(dāng)然你可以直接選擇edit。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容