(本文僅記錄了Vim常用的按鍵功能和操作,用於備忘和查閱。若為Vim小白,建議先通過列出的參考資源獲得對Vim更全面的了解。Vi 是幾乎所有Linux發行版都支持的文字編輯工具,也是許多Linux下工具的默認文本編輯工具,而Vim則是其功能加強版。)
vim的模式
Vim一般分為三種不同的模式,普通模式( normal mode )、編輯模式和命令模式.
普通模式( normal mode )
使用vim打開文件則進入普通模式。在普通模式下可通過按鍵 h、j、k、l來控制光標的移動,通過 x、d(delete) 、 y(yank) 、p(put)等按鍵可對文本進行操作,在該模式下,鍵盤按鍵被視為類似 Word下的快捷鍵的功能,而不是被視為簡單的文本輸入。
編輯模式
在編輯模式下可對文件內容進行編輯。編輯模式下按鍵輸入均被視為文本輸入,而不再具備普通模式下的各種功能。用戶可以通過按鍵ESC從編輯模式返回普通模式。
命令模式
在普通模式下,鍵盤輸入 ' : '、 ' / '、 ' ? '則光標移動至界面最下行,並等待進一步輸入。之后Vim會根據用戶輸入執行相應的動作,如保存和退出、查找和替換、執行外部命令等。命令模式下同樣通過ESC鍵返回普通模式。
文件的打開與保存
用戶可通過命令行輸入 vim filename 的方式打開文件名指定的文件,通過在命令模式下輸入對應指令模式的方式進行文件的保存等操作。
vim filename //打開名為filename的文件 :w //保存修改至源文件 :wq //保存修改並退出 :q! //不保存修改,直接退出 :w filename //保存修改(選中的部分)至filename(其中filename為不存在重名的新文件)
在某些情況下,如當前用戶對該文件沒有修改權限時(但可以通過權限提升得到更大的權限時),需要在命令后面加入' ! ',表示強制的意思,但具體能否寫入還是由其最終的權限能否修改文件決定的。
這里可以看到,輸入' : '進入命令模式后,按鍵 w 即為保存命令,除了可進行文件整體保存外,還可以對特定選中的文本部分進行保存,如何進行文本選擇下有介紹。
文件編輯
在普通模式下,用戶可以借助諸多的功能按鍵對文件已有的內容進行修改和調整,但想要具體改變和輸入新的文本內容,則仍需要進入編輯模式,在編輯模式下除ESC外,其他的按鍵均被視為正常的按鍵輸入。進入編輯模式可以有多種不同的方式。
i //insert即插入模式,從光標所在位置開始插入,即插入的內容位於原光標所在位置字符之前
I //從光標所在行的行首開始插入 a //append即附加模式,從光標所在位置之后附加,即新增內容位於原光標所在位置字符之后 A //從光標所在行的行末開始附加 o //在光標所在行的下一行加入新一行 O //在光標所在行的上一行加入新一行
R //進入替換模式,屏幕下方會出現Replace提示,此時的輸入會直接替換光標所在位置的字符,與Windows下的 0 作用類似,同樣通過ESC鍵返回
用戶可以根據不同的需要將光標移動(見下)到合適的位置,再通過對應的功能鍵進入編輯模式進行文本編輯,編輯完成后,通過ESC鍵返回普通模式。
光標移動(一)
在普通模式(也就是 vim 打開文件后的默認模式)下,用戶可通過以下按鍵進行光標的移動。
k // h -光標左移 h l // l -光標右移 j // j -光標下移(形似向下的箭頭) // k -光標上移
光標移動(二)
普通模式下,vim 還支持以單詞和行為度量的移動方式。
w //移動至下一個單詞的第一個字符(該字符前一個字符為空白字符) e //移動至單詞的最后一個字符(即后一個字符為空白字符) $ //移動至行尾 0 //移動至行首
光標移動(三)
上述關於光標移動的按鍵可以與數字結合使用,解釋為重復操作若干次,格式為: 數字 + 移動方式。示例如下:
3j //下移三格 4h //左移4格 2w //移動至第二個單詞的詞首字符 3e //移動至第三個單詞的詞尾字符
通過上述的 h、j、k、l和 w、e、$、0以及上述操作與數字的結合,實現不借助鼠標的快速光標移動。
其他可用的光標移動
Ctrl+f //屏幕向下移動一頁,相當於PageDown Ctrl+b //屏幕向上移動一頁,相當於PageUp H //移動至屏幕中第一行的第一個字符 M //移動至屏幕中中間行的第一個字符 L //移動至屏幕中最低行的第一個字符
刪除操作
x //刪除光標所在處的字符(其大寫形式X為將光標之前的字符刪除,相當於Backspace) dd //刪除光標所在行的操作(常用)
d即為delete,除了dd外,d指令可與上述光標移動操作結合使用
dw //刪除一個單詞 d3w //刪除三個單詞 d$ //刪除光標所在處至行尾的字符 d4l //刪除光標所在處起的四個字符 d2j //刪除兩行
同樣的,如 2dd 指令則表示將dd指令重復兩次,即為刪除兩行操作,2d2w 則表示將 d2w 操作執行兩次,即刪除四個單詞。
復制與粘貼
復制和粘貼借助多個指令的協作完成。包括復制y(yank),粘貼p(put)和虛擬選擇v(visual selection).
p //put命令,將剪貼的內容(注意,既可以是復制的內容,也可以為之前刪除的內容)放置在光標后的位置,其大小字母P則表示放置在光標之前的位置 v //進入虛擬選擇模式(visual selection),被選擇的文本段被高亮顯示(v的選擇對象為字符,對應的大寫字母V則是以行為單位選擇)
Ctrl + v //以矩形框的形式進行內容選擇 y //復制通過 v 操作選擇的文本,或則其本身也可以與光標移動指令一同使用 //如y5w,則復制5個單詞(注意復制是從光標所在處開始的)
復制即通過 v 指令選定文本段,通過 y 指令復制內容,再通過 p 指令將文本放置在指定位置;
剪切即通過 v 指令選定文本段,通過 d (或 x )指令刪除內容,再通過 p 指令將文本放置在指定的位置;
p 指令除了用於復制內容的粘貼外,還可以將上一次刪除的內容粘貼在指定的位置,故而可以達到類似剪切的效果。對於 v 指令選中的文本,可以進行多種操作,包括復制(y)、刪除(x/d)、另存(:w filename)等,讀者完全可以自行進行組合嘗試。
指令y和d的指令形式有許多相同之處,除了均有yy和dd這種針對一行內容的處理指令外,指令y可以與光標移動指令相結合,得到更好的使用效果。
yy //復制光標所在行的內容 y0 //復制光標所在位置至行首的內容 y$ //復制光標所在位置至行尾的內容 yG //復制光標所在位置至文本結束的內容 ynG //復制指令與nG指令的結合
//以及諸如y3w、y3j等指令
行跳轉
通過與 g(goto) 相關的指令實現以行為單位的跳轉指令。
gg //跳轉至文件第一行 G //跳轉至文件最后行 nG //跳轉至文件第 n 行
另外,通過快捷鍵 Ctrl + o 可以返回之前光標所在的位置(是針對gg等行跳轉操作而言的上一個位置)。
撤銷操作
與u(undo)相關的指令實現指令撤銷
u //撤銷上一次操作 U //撤銷對光標所在行的所有操作 Ctrl+r //重做上一操作
替換和修改
文本的替換和修改主要使用替換r(replace)和修改c(change)指令完成。
rc //其中c為字符,則將光標所在處的字符替換為c
修改指令將指定的范圍內的內容刪除,並進入編輯模式,從而使得用戶可以修改某一部分的文本。指令c與光標移動指令結合使用。用戶修改完畢后,需使用ESC返回普通模式。
ce //刪除光標所在處至詞尾的所有內容,並進入編輯模式,供用戶修改 c3w //刪除光標所在處其的三個詞,並進入編輯模式 c$ //刪除光標所在處至行尾的所有字符,並進入編輯模式 c0 //刪除光標所在處至行首的所有字符,並進入編輯模式
查找
使用 / 與 ?進行不同方向的關鍵字查找,使用方式與Linux下的man page相似。
/keyword //按默認方向查找關鍵字 ?keyword //按與默認方向相反的方向查找關鍵字 n //按與之前相同的查找順序匹配下一個出現相同關鍵字的位置 N //按與之前相反的查找順序匹配下一個出現相同關鍵字的位置 //用戶也可以通過Ctrl + o 和 Ctrl + i 進行位置的切換
替換
替換指令可以視為是進入命令模式后借助s(substitute)指令完成。
:s/old/new //將光標所在行出現的第一個old替換為new(僅對該行的第一個old) :s/old/new/g // 將光標所在行出現的所有old替換為new :s/old/new/gc //同上,替換之前提示用戶確認是否替換 :n,ms/old/new/g //在n和m指定的行之間進行檢查和替換 :%s/old/new/g //針對整個文本進行替換
執行命令
普通模式下,通過鍵入' : ',使得光標移動至屏幕最下方的行,再鍵入有效指令,即可由Vim執行。之前介紹的文件的保存和退出、替換等都是這樣實現的。Vim還可以支持多樣的命令。
文件保存
之前介紹的文件保存的主要對象是完整的文件,實際上用戶也可以借助w(write)指令將部分文本進行保存。
(1)通過 :w filename 將整個文件保存至新建的filename文件中;
(2)使用虛擬選擇指令v ( V / Ctrl + v )等選中指定文本內容,再通過 :w filename 保存至新建的文件中,則只會保存選中的文本段。這種方式下,屏幕下方的提示符如圖所示
(3)通過 :n,m w filename 將文本的n到m行保存至新建文件 filename 中;
執行外部指令
:! command //離開Vim並在終端下執行command指令,結果會直接顯示,可通過ESC返回
文件內容導入
:r filename //將filename指定的文件內容插入至光標所在行的上一行
:r !command //將命令執行的結果插入文本
其他有用的快捷鍵
(1)通過 Ctrl + g 鍵可以獲得文件相關的信息,如文件名,光標所處的行列號等信息;
(2)Ctrl+f 屏幕向下移動一頁,相當於PageDown,Ctrl+b屏幕向上移動一頁,相當於PageUp按鍵;
(3)通過 % 鍵跳轉至與之匹配的括號處(包括 {}、[]、()等);
(4)通過 . 鍵重復之前一個動作;
(5)通過Ctrl + d 顯示可能匹配的命令,通過Tab 補全指令。命令模式下輸入 h ,使用Ctrl + d 鍵,即會顯示出所有的以 h 開頭的命令。同樣的,對於未完成的命令或文件名,使用Tab鍵,則Vim會嘗試完成輸入,當有多個正確的匹配時,按Tab鍵則會進行切換。
以上部分即為在常規使用 vim 的過程中所需的大多數功能按鍵和使用方法,文章的其余部分介紹更多關於 vim 的配置等相關的內容,有進一步個性化設置 vim 需求的可以做進一步的了解。
修改編輯選項
通過Vim的的set命令(命令模式下,需首先輸入 ' : ' )改變編輯器的默認選項。常用的一些選項見下,在對應選項前加入前綴 no 即為取消對應選項。當 ~/.vimrc文件存在時,set的設置則會修改該文件中配置信息,相應的,也可以通過直接修改該配置文件中的內容修改配置(見下)。
:set nu //顯示行號,相應的set nonu則為不顯示行號 :set ic //搜索忽略大小寫(ignore case),取消即為 set noic :set hlsearch //搜索時匹配的結果高亮顯示 :set incserch //設置搜索時的搜索順序 //可以看到,在對應的選項前面加入前綴no即表示取消取消對應的選項
:set ruler //右下角展示狀態欄
:set //顯示與系統默認設置不同的參數情況,即被修改過的參數情況
:set syntax on //設置Vim會根據語法以不同顏色顯示不同的內容
:set syntax off
通過命令模式下的set all 命令,可以查看當前所有的vim設置情況。通過命令 help set 也可以查閱一些關於Vim的設置幫助。
查看幫助
在命令模式下輸入 help ,則會打開一個新的幫助文件,可以通過:q來返回。通過加入參數來查詢對應的幫助.
:help //打開幫助文件 :help w //打開指令對應的幫助文件 :help user-manual
實際上,該命令是通過Vim打開了位於/usr/share/vim中的幫助文檔(筆者的機器的路徑為/usr/share/vim/vim74/doc),即相當於使用Vim進行多文件操作。簡單的返回方式即為在幫助文檔界面鍵入 :q即可。
相關文件
配置文件~/.vimrc
Vim作為一個強大的編輯工具,其本身具有眾多的環境參數選項,規定了編輯風格、界面顯示等眾多的內容。其環境參數的設置主要通過配置文件進行記錄。其中位於/etc目錄下的配置文件(筆者Ubuntu環境下為/etc/vim/vimrc)規定的是關於Vim的全局設置。而針對個人用戶的個性化設置則通過個人用戶目錄下的~/.vimrc文件完成(不存在時可自行新建)。該文件中 " 符號為注釋符號。
cp /etc/vim/vimrc ~/.vimrc //將源文件復制到用戶主目錄中
通過在.vim中添加配置信息或取消其中的注釋,即可進行vim的配置功能。如去除 syntax on 前的注釋從而打開語法高亮等。
在 NJU ICS Lab 中找到一些可用的 vim 設置選項如下,下列設置也包含了 vim 設置的基本用法和功能,用戶可以根據自己的需求添加,原網頁見這里.
setlocal noswapfile " 不要生成swap文件 set bufhidden=hide " 當buffer被丟棄的時候隱藏它 colorscheme evening " 設定配色方案 set number " 顯示行號 set cursorline " 突出顯示當前行 set ruler " 打開狀態欄標尺 set shiftwidth=4 " 設定 << 和 >> 命令移動時的寬度為 4 set softtabstop=4 " 使得按退格鍵時可以一次刪掉 4 個空格 set tabstop=4 " 設定 tab 長度為 4 set nobackup " 覆蓋文件時不備份 set autochdir " 自動切換當前目錄為當前文件所在的目錄 set backupcopy=yes " 設置備份時的行為為覆蓋 set hlsearch " 搜索時高亮顯示被找到的文本 set noerrorbells " 關閉錯誤信息響鈴 set novisualbell " 關閉使用可視響鈴代替呼叫 set t_vb= " 置空錯誤鈴聲的終端代碼 set matchtime=2 " 短暫跳轉到匹配括號的時間 set magic " 設置魔術 set smartindent " 開啟新行時使用智能自動縮進 set backspace=indent,eol,start " 不設定在插入狀態無法用退格鍵和 Delete 鍵刪除回車符 set cmdheight=1 " 設定命令行的行數為 1 set laststatus=2 " 顯示狀態欄 (默認值為 1, 無法顯示狀態欄) set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ Ln\ %l,\ Col\ %c/%L%) " 設置在狀態行顯示的信息 set foldenable " 開始折疊 set foldmethod=syntax " 設置語法折疊 set foldcolumn=0 " 設置折疊區域的寬度 setlocal foldlevel=1 " 設置折疊層數為 1 nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR> " 用空格鍵來開關折疊
記錄文件~/.viminfo
文件 ~/.viminfo 記錄了用戶使用Vim進行的操作情況,多用於類似於指令撤銷(u)和重做(r)的操作。
參考資源:
鳥叔的Linux私房菜 : 第十章.vim程序編輯器
Linux: 命令vimtutor