它是一個(gè)老式的文字處理工具,但是功能很齊全,不僅是文本處理工具,還是一個(gè)程序編輯工具,就連官方網(wǎng)站也說vim是一個(gè)程序開發(fā)工具而不是文字處理軟件,因?yàn)樗撕芏囝~外的功能,如:多文件編輯,區(qū)塊復(fù)制等,這些功能讓我們在進(jìn)行配置文件修改的時(shí)候會(huì)更方便。今天就來一起學(xué)習(xí)一下vi和vim。
什么是 vim?
Vim 是從 vi 發(fā)展出來的一個(gè)文本編輯器。代碼補(bǔ)全、編譯及錯(cuò)誤跳轉(zhuǎn)等方便編程的功能特別豐富,在程序員中被廣泛使用。
簡單來說, vi 是老式的文字處理器,不過功能已經(jīng)很齊全了,但是還是有可以進(jìn)步的地方。 vim 則可以說是程序開發(fā)者的一項(xiàng)很好用的工具。

vi和vim的小差別
Linux 系統(tǒng)會(huì)內(nèi)置 vi 文本編輯器。
Vim 具有程序編輯的能力,可以看做是 vi 的增強(qiáng)版本,主動(dòng)的以字體顏色辨別語法的正確性,方便程序設(shè)計(jì);代碼補(bǔ)全,編譯及錯(cuò)誤跳轉(zhuǎn)等方便編程的功能豐富,在程序員中被廣泛地使用。
由于個(gè)別版本的linux默認(rèn)只安裝vi,所以你需要額外安裝vim的軟件包,另外vim在字符界面下不能輸入中文,而在圖形界面下能否輸入中文則取決于系統(tǒng)中是否安裝了中文輸入法。
為什么要使用vim?
雖然在linux下的文本編輯器眾多,這些工具都有各自的優(yōu)點(diǎn),但是有幾點(diǎn)是其它編輯工具所不能比擬的
- 所有的類Unix系統(tǒng)都內(nèi)建vi,其它的編輯工具則不一定,而vim相當(dāng)于是vi的升級版
- 很多軟件的編輯界面都會(huì)調(diào)用vi,如后面提到的crontab、edquota等
- vim具有程序編輯能力,可以主動(dòng)以字體顏色標(biāo)識(shí)語法的正確性,方便代碼編寫
- 程序簡單,編輯速度非???/li>
三種模式
由于vi/vim是一個(gè)全屏幕的文本編輯器,它工作在三種模式下:分別是命令模式、輸入模式和末行模式。
可以分別從命令模式切換到輸入模式和末行模式,也可以從末行模式或輸入模式切換到命令模式,但是輸入模式與末行模式之間不能互相切換。

命令模式:
用戶剛剛啟動(dòng) vi/vim,便進(jìn)入了命令模式。
此狀態(tài)下敲擊鍵盤動(dòng)作會(huì)被Vim識(shí)別為命令,而非輸入字符。比如我們此時(shí)按下i,并不會(huì)輸入一個(gè)字符,i被當(dāng)作了一個(gè)命令。
以下是常用的幾個(gè)命令:
i 切換到輸入模式,以輸入字符。
x 刪除當(dāng)前光標(biāo)所在處的字符。
: 切換到底線命令模式,以在最底一行輸入命令。
若想要編輯文本:啟動(dòng)Vim,進(jìn)入了命令模式,按下i,切換到輸入模式。
命令模式只有一些最基本的命令,因此仍要依靠底線命令模式輸入更多命令。
輸入模式
在命令模式下按下i就進(jìn)入了輸入模式。
在輸入模式中,可以使用以下按鍵:
字符按鍵以及Shift組合,輸入字符
ENTER,回車鍵,換行
BACK SPACE,退格鍵,刪除光標(biāo)前一個(gè)字符
DEL,刪除鍵,刪除光標(biāo)后一個(gè)字符
方向鍵,在文本中移動(dòng)光標(biāo)
HOME/END,移動(dòng)光標(biāo)到行首/行尾
Page Up/Page Down,上/下翻頁
Insert,切換光標(biāo)為輸入/替換模式,光標(biāo)將變成豎線/下劃線
ESC,退出輸入模式,切換到命令模式
底線命令模式
在命令模式下按下:(英文冒號)就進(jìn)入了底線命令模式。
底線命令模式可以輸入單個(gè)或多個(gè)字符的命令,可用的命令非常多。
在底線命令模式中,基本的命令有:
1、:w? ?保存文件但不退出vi?
2、:w file 將修改另外保存到file中,不退出vi?
3、:w!? 強(qiáng)制保存,不推出vi
4.、:wq 保存退出
5、:wq! 強(qiáng)制保存文件,并退出vi
6、:q 不保存文件,退出vi
7、:q!不保存文件,強(qiáng)制退出vi?
8、:e! 放棄所有修改,從上次保存文件開始再編輯
9、:wq? 保存文件并退出vi?
按ESC鍵可隨時(shí)退出底線命令模式。
常用命令
打開文件,修改文件,保存退出,另存為文件。
vi /root/file.txt 打開文件路徑
a 修改
Esc 冒號 w 保存 或者 ZZ 保存退出。
:wq!強(qiáng)行保存退出,只有文件所有者,或者是root用戶。
:w 【保存】
:w /root/service.bak 【另存為】
三種模式下切換
命令模式 :
插入模式 a 或者 i 或者 o
編輯模式 ESC
搜索關(guān)鍵字
Esc /關(guān)鍵字 回車
n下一個(gè)
shift+n 上一個(gè)
插入命令
a 【在光標(biāo)后附加文本】
A 【在本行行末附加文本】
i 【在光標(biāo)前插入文本】
I 【在本行開始插入文本】
o 【在光標(biāo)下插入新行】
O 【在光標(biāo)上插入新行】
定位命令
向左:
h或方向左鍵 【左移一個(gè)字符】
10h 向左移動(dòng)10個(gè)字符,到行首會(huì)停止
向下:
j或方向下 【下移一行】
5j 向下移動(dòng)5行,或者5下箭頭
向上:
k/方向上 【向上一行】
7k #向上移動(dòng)7行
向右:
l/方向右鍵 【右邊移一個(gè)字符】
6l #向右移動(dòng)6個(gè)字符,到行末會(huì)停止不會(huì)換行
$ 【移至行尾】
0(零) 【移至行首】
H 【移至屏幕上端】
M 【移至屏幕中央】
L 【移至屏幕中下端】
W或w 【定位到當(dāng)前句子的開始位置】
E或e 【定位到當(dāng)前這句話的最后位置】
:set nu 【設(shè)置行號】
:set nonu 【取消行號】
gg 【到第一行】
G 【到最后一行】
nG或4gg 【到第n行】到第四行
:n 【到第n行】
Ctrl+b 【在文件中向上移動(dòng)一頁(相當(dāng)于 PageUp 鍵)】
Ctrl+f 【在文件中向下移動(dòng)一頁(相當(dāng)于 PageDown 鍵)】
撤銷命令
這個(gè)命令很常用,要記?。?/p>
u 【撤銷上一步的操作】
Ctrl+r 【恢復(fù)上一步被撤銷的操作】
貼士:比如修改nginx的配置之后保存不退出 :w 再 ctrl+z將文檔放在后臺(tái),用nignx -t ,或者重啟nginx服務(wù)。如果有問題則快速回到文檔編輯頁面fg,再按u。保存
實(shí)例:
vi /etc/nginx/nginx.conf
i編輯
再 :w 保存
ctrl+z
[1]+ Stopped vi /etc/nginx/nginx.conf
# jobs
[1]+ Stopped vi /etc/nginx/nginx.conf
# nginx -t 測試nginx文檔是否有錯(cuò)誤。
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# fg 將后臺(tái)程序進(jìn)入前臺(tái)
刪除命令
x 【刪除光標(biāo)所在字符】
nx 【刪除光標(biāo)所在處后n個(gè)字符】
dd 【刪除光標(biāo)所在行,ndd刪除n行】
dG 【刪除光標(biāo)所在行到末尾的內(nèi)容】
D 【刪除從光標(biāo)所在處到行尾】
:n1,n2d 【刪除指定的行】
:10,20d 【刪除第十行到第20行的內(nèi)容】
光標(biāo)移到第一行,然后dG 【刪除所有內(nèi)容】
小貼士,一般在操作在本地編輯好的文檔,全部復(fù)制,然后將服務(wù)器文檔 dG全部刪除,在粘貼新的文檔。
復(fù)制剪切命令
yy、Y 【復(fù)制當(dāng)前行】
nyy、nY 【復(fù)制當(dāng)前行一下n行】
dd 【剪切當(dāng)前行】
ndd 【剪切當(dāng)前行一下n行】
p、P 【粘貼在當(dāng)前光標(biāo)所在行下活行上】
替換和取消命令
r 【取代光標(biāo)所在處字符】
R 【從光標(biāo)所在處開始替換字符,按Esc結(jié)束】
u 【取消上一步操作】
Ctrl+r 【恢復(fù)上一步被撤銷的操作】
搜索和替換命令
/string 【向前搜索指定字符,搜索時(shí)請忽略大小寫:set ic】
n 【搜索指定字符串的下一個(gè)出現(xiàn)位置】
:%s/old/new/g 【全文替換指定字符】
:%s/^#//g 【去掉以#注釋】
:%s/^/#/g 【在全文開頭添加#】
:n1,n2s/old/new/g 【在指定范圍內(nèi)替換指定字符串】
:n1,n2s/^/#/g
:s/str1/str2/ 【用字符串 str2 替換本行中首次出現(xiàn)的字符串 str1】
g是全局參數(shù),如果加上這個(gè),你文中有多少就替換多少,如果不加,就只能一個(gè)一個(gè)的替換!
fa(或fb) 【查詢這行a字母的的地方(或b字母)】
3fa 【在這行中查找a出現(xiàn)的第三個(gè)位置】
應(yīng)用實(shí)例
導(dǎo)入其他文件內(nèi)容
:r 文件名
在vi執(zhí)行命令
:! 命令
定義快捷鍵:
:map 快捷鍵 觸發(fā)命令
實(shí)例:
:map ^P I# <ESC> 【鍵盤按鍵實(shí)現(xiàn)^P:ctrl+v ctrl+p或者 ctrl+v+p 】
:map ^B 0x
連續(xù)注釋:
:n1,n2s/^/#/g
:n1,n2s/^/#//g
:n1,n2s/^////g
替換:
:ab sammail samlee@163.com
顯示行號
:set nu 顯示行號(注意前面輸入冒號進(jìn)入底行命令模式)
:set nonu 不顯示行號
環(huán)境變量與記錄
.viminfo:記錄用戶的行為,之前編輯過的文件光標(biāo)在什么位置,在這個(gè)文件中進(jìn)行過什么操作等,自動(dòng)建立
.vimrc:定義vim的默認(rèn)設(shè)置,如是否顯示行號等,需要手動(dòng)生成
命令 |
說明 |
:set nu /:set nonu |
就是設(shè)定與取消行號! |
:set hlsearch /:set nohlsearch |
搜索時(shí)是否高亮顯示。默認(rèn)值是 hlsearch |
:set autoindent :set noautoindent |
是否自動(dòng)縮排?autoindent 就是自動(dòng)縮排。 |
:set backup/:set nobackup |
是否自動(dòng)備份,一般是 nobackup 的, 如果設(shè)定 backup 的話,那么當(dāng)你更動(dòng)任何一個(gè)檔案時(shí),則源文件會(huì)被另存成一個(gè)檔名為 filename~ 的檔案。 |
:set ruler/:set noruler |
是否顯示右下角的一些狀態(tài)欄說明 |
:set showmode/:set noshowmode |
是否顯示左下角的狀態(tài)欄。 |
:set backspace=(012) |
一般來說, 如果我們按下 i 進(jìn)入編輯模式后,可以利用backspace來刪除任意字符的。 但是,某些版本則不許如此。這時(shí)就可以使用這個(gè)設(shè)置2 可以刪除任意;0 或 1 僅可刪除剛剛輸入內(nèi)容 |
:set all |
顯示目前所有的環(huán)境變量設(shè)定值。 |
:set |
顯示與系統(tǒng)默認(rèn)值不同的設(shè)置, 用戶修改過的 |
:syntax on :syntax off |
是否顯示顏色 |
:set bg=dark :set bg=light |
可用以顯示不同的顏色色調(diào),預(yù)設(shè)是『 light 』。如果你常常發(fā)現(xiàn)批注的字體深藍(lán)色實(shí)在很不容易看, 那么這里可以設(shè)定為 dark 喔!試看看,會(huì)有不同的樣式呢! |
密碼設(shè)置與取消
加密
vim filename
:X
Warning: Using a weak encryption method; see :help 'cm'
Enter encryption key:
輸入密碼
Enter encryption key: ******
Enter same key again: ******
保存(否則不加密)
# cat filename
VimCrypt~01!i
# vim filename (不能用vi)
Need encryption key for "filename"
Warning: Using a weak encryption method; see :help 'cm'
Enter encryption key:
取消密碼
vim filename--->輸入正確密碼--->:X--->空密碼--->保存
vim filename--->:set key= --->保存
注意:不要對系統(tǒng)文件進(jìn)行加密的操作
其他命令
J(大寫):將光標(biāo)所在行下一行合并到該行,中間有空格間隔,光標(biāo)移動(dòng)到該空格處,要想達(dá)到在寫字板中”[end]+[del]“的效果(即光標(biāo)移動(dòng)到行末,然后del使下一行提到該行),可以用Jx組合命令。
u(小寫):撤銷上一次所做的操作。多次使用 u 命令會(huì)一步一步依次撤銷之前做過的操作(在一次切換到文本輸入模式中輸入的所有文本算一次操作)。
U(大寫):一次性撤銷自上次移動(dòng)到當(dāng)前行以來做過的所有操作,再使用一次 U 命令則撤銷之前的 U 命令所做的操作,恢復(fù)被撤銷的內(nèi)容。所以U命令是不能一直撤銷的,相當(dāng)于只能撤銷一步,再使用就是恢復(fù)了。
[ctrl]+ r:按住ctrl鍵和r,類似快捷鍵的用法,是恢復(fù)操作,與命令u(小寫)對應(yīng),可以在多次使用u命令撤銷多步后,用該命令多次恢復(fù)至最新。
.(小數(shù)點(diǎn)):重復(fù)執(zhí)行上一次的命令,注意和恢復(fù)不一樣。例如重復(fù)粘貼,重復(fù)刪除。
字符差異
由于linux和windows的系統(tǒng)差異,它們針對于文件的中的一些特殊符號表示方式也是不同的,比如說用來表示換行的符號等,如
# cat -A hello-linux.txt
hello$
$
# cat -A hello-windows.txt
hello^M$
^M$
如果這種文件是從windows拷貝到linux的一本小說的話,基本沒什么問題,但是如果是一個(gè)我們需要執(zhí)行指定工作的shell腳本就會(huì)出現(xiàn)問題,因?yàn)閘inux不認(rèn)識(shí)這種符號的含義,就會(huì)導(dǎo)致shell腳本無法執(zhí)行(踩坑了很多次,都是在win編輯txt文本,再后綴名sh,導(dǎo)致莫名的報(bào)錯(cuò))。所以此時(shí)我們就要對這種文件進(jìn)行處理
# unix2dos [-kn] file [newfile]
選項(xiàng)與參數(shù):
-k :保留文件原本的 mtime 時(shí)間格式
-n :保留舊文件,將轉(zhuǎn)換后的內(nèi)容輸出到新文件,如: dos2unix -n old new
還有一種方式就是直接在linux下編輯文件,再下載到win系統(tǒng)下使用IDE編輯器編輯開發(fā),再回到linux全部粘貼。
總結(jié)
以上的常用命令和操作都是基于vim的基本原理形成的,vim的命令很強(qiáng)大,尤其底行命令模式甚至可以類似于一個(gè)小型的腳本語言。
如果有遺漏,歡迎留言告知,謝謝!
vim官網(wǎng)有一個(gè)經(jīng)典的全鍵位圖,如下

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至2705686032@qq.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。文章鏈接:http://m.z1146.cn/zx/yunwei/4238.html