vi是linux與unix下的經常使用文本編輯器,其運行穩定,使用方便,本文將分兩部分對其經常使用操做技巧和配置進行闡述,其中參考了網上的一些文章,對做者表示感謝php
PART1 操做技巧
說明:html
如下的例子中 xxx 表示在命令模式下輸入 xxx 並回車java
如下的例子中 :xxx 表示在擴展模式下輸入 xxx 並回車linux
()中的命令表示相關命令.[]表示命令等同正則表達式
在編輯模式或可視模式下輸入的命令會另外註明.vim
移動光標
在 vi 中, 移動光標和編輯是兩件事, 正由於區分開來, 因此能夠很方便的進行光標定windows
位和編輯. 所以能更快一點移動光標是頗有用的.tomcat
w 移動光標到下一個單詞開頭.app
e 移動光標到下一個單詞結尾編輯器
b 移動光標到上一個單詞.
0 移動光標到本行最開頭.
^ 移動光標到本行最開頭的字符處.
$ 移動光標到本行結尾處.
A 移動光標至行尾並處於「追加」狀態,直接編輯
H 移動光標到屏幕的首行.
M 移動光標到屏幕的中間一行.
L 移動光標到屏幕的尾行.
gg 移動光標到文檔首行.
G 移動光標到文檔尾行.
:n 跳至第n行
ctrl + f 向下翻頁 同 page down.
ctrl + b 向上翻頁 同 page up.
ctrl + d 向下翻半頁 此比較有用
ctrl + u 向上翻半頁 此比較有用
ctrl + e 向下翻一行
ctrl + y 向上一行
[[ 轉到上一個位於第一列的「{」
]] 轉到下一個位於第一列的「}」
{ 轉到上一個空行
} 轉到下一個空行
'' 兩個單引號 此命令至關有用, 它移動光標到上一個標記處, 好比用 gd, * 等查找到某個單詞後, 再輸入此命令則回到上次停留的位置.
'. 一單一點 此命令至關好使, 它移動光標到上一次的修改行.
`. 一倒引一點 此命令至關強大, 它移動光標到上一次的修改點.
查找
/xxx(?xxx) 表示在整篇文檔中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
向上查找.其中xxx能夠是正規表達式,關於正規式就很少說了.
通常來講是區分大小寫的, 要想不區分大小寫, 那得先輸入
:set ignorecase
查找到之後, 再輸入 n 查找下一個匹配處, 輸入 N 反方向查找.
*(#) 當光標停留在某個單詞上時, 輸入這條命令表示查找與該單詞匹配的
下(上)一個單詞. 一樣, 再輸入 n 查找下一個匹配處, 輸入 N 反方
向查找.
g*(g#) 此命令與上條命令類似, 只不過它不徹底匹配光標所在處的單詞, 而
是匹配包含該單詞的全部字符串.
gd 本命令查找與光標所在單詞相匹配的單詞, 並將光標停留在文檔的非
註釋段中第一次出現這個單詞的地方. 用於查找局部變量等
% 本命令查找與光標所在處相匹配的反括號, 包括 () [] { }
f(F)x 本命令表示在光標所在行進行查找, 查找光標右(左)方第一個x字符.
找到後:
輸入 ; 表示繼續往下找
輸入 , 表示反方向查找
替換
替換是 vi 的強項,使用「:s/模式/字符串/標誌」進行替換,其中的「模式」是一個正則表達式,能夠用來匹配字符串.如下提供幾個例子.
:s/aa/bb/g 將光標所在行出現的全部包含 aa 的字符串中的 aa 替換爲 bb
:s/\<aa\>/bb/g 將光標所在行出現的全部 aa 替換爲 bb, 僅替換 aa 這個單詞
:%s/aa/bb/g 將文檔中出現的全部包含 aa 的字符串中的 aa 替換爲 bb
:12,23s/aa/bb/g 將從12行到23行中出現的全部包含 aa 的字符串中的 aa 替換爲 bb
:12,23s/^/#/ 將從12行到23行的行首加入 # 字符
:%s= *$== 將全部行尾多餘的空格刪除
:%s/\s\+$// 將全部行尾多餘的空格刪除
:g/^\s*$/d 將全部不包含字符(空格也不包含)的空行刪除
:%s/\(\s*\n\)\+/\r/ 將全部不包含字符(空格也不包含)的空行刪除.
:%s!\s*//.*!! 去掉全部的「//」註釋
注:Vim 在搜索和替換時會對匹配成功的文本進行加亮,在已經完成搜索和替換任務後,這種加亮有時反而會妨礙顯示。Vim 專門提供一個命令取消這種加亮(直到用戶再一次使用搜索或替換命令):「:nohlsearch」。建議用戶建立一個鍵盤映射(key mapping)加入到
.vimrc中,如: nmap :nohlsearch
特殊編輯
ga 顯示光標所指字符的encoding 編碼,好比ASCII碼
guw 光標所在單詞光標後的字符小寫
gUw 光標所在單詞光標後的字符大寫
撤消
u
拷貝, 刪除與粘貼
在 vi 中 y 表示拷貝, d 表示刪除, p 表示粘貼. 其中拷貝與刪除是與光標移動命令
結合的, 看幾個例子就可以明白了.
yw 表示拷貝從當前光標到光標所在單詞結尾的內容.
dw 表示刪除從當前光標到光標所在單詞結尾的內容.
daw 表示刪除光標所在的單詞,無論光標在此單詞那一位置
y0 表示拷貝從當前光標到光標所在行首的內容.
d0 表示刪除從當前光標到光標所在行首的內容.
y$ 表示拷貝從當前光標到光標所在行尾的內容.
d$[D] 表示刪除從當前光標到光標所在行尾的內容.
特殊地:
yy 表示拷貝光標所在行.
dd 表示刪除光標所在行.
D 表示刪除從當前光標到光標所在行尾的內容.
xp 表示交換光標與其後的字符的位置
ddp 表示光標所在行與下一行交換
J 表示光標所在行與下一行合併
關於拷貝, 刪除和粘貼的複雜用法與寄存器有關, 能夠自行查詢.
VISUAL模式
Visual 模式用於選擇多行文本或文本塊,開頭結尾本身去定,象用鼠標選同樣。
v 選擇多行,頭尾自訂
ctrl + v 選擇矩形塊,有點像UE中的列模式,O,o能夠定位光標到四個端點
用visual選擇的塊能夠看做一個基本單位,刪除複製什麼的均可以直接使用
數字與命令
在 vi 中數字與命令結合每每表示重複進行此命令, 若在擴展模式的開頭出現則表示行
號定位. 如:
5yy[y5y] 表示拷貝光標如下 5 行.
5dd[d5d] 表示刪除光標如下 5 行.
:12,24y 表示拷貝第12行到第24行之間的內容.
:12,y 表示拷貝第12行到光標所在行之間的內容.
:,24y 表示拷貝光標所在行到第24行之間的內容. 刪除相似.
5fx 表示查找光標後第 5 個 x 字符.
5w(e) 移動光標到下五個單詞的頭部(尾部).
自動完成與路徑設定
在 vi 中, 不要求你輸入每個字符, 能夠有不少種方法快速輸入一些字符.
ctrl+p(ctrl + n) 在編輯模式中, 輸入幾個字符後再輸入此命令則 vi 開始向上(下)搜
索開頭與其匹配的單詞並補齊, 不斷輸入此命令則循環查找. 此命令
會在全部在這個 vim 程序中打開的全部文件中進行匹配.
ctrl + x + l 在編輯模式中, 整行補齊, 可是僅在本窗口中出現的文檔中進行匹配.
ctrl + x + f 在編輯模式中, 這個命令表示補齊文件名. 如輸入:
/usr/local/tom 後再輸入此命令則它會自動匹配出:
/usr/local/tomcat/
abbr 即縮寫. 這是一個宏操做, 能夠在編輯模式中用一個縮寫代替另外一個
字符串. 好比編寫java文件的經常輸入 System.out.println, 這很
是麻煩, 因此應該用縮寫來減小敲字. 能夠這麼作:
:abbr sprt System.out.println
之後在輸入sprt後再輸入其餘非字母符號, 它就會自動擴展爲System.
out.println
在做關鍵字匹配完成時,若是當前文件和其它打開的文件中沒有想要的結果,Vim
會自動到「#include」的文件中進行進一步的搜索(爲何是「#include」呢?請查閱
「:help 'include'」),搜尋的目錄則由選項 path 決定,其缺省值在 Unix(含
Linux)下爲「.,/usr/include,,」,表明搜索的目錄依次是文件所在目錄、/usr/include
和當前目錄。根據實際狀況,你可能須要在 .vimrc文件中設置該選項,加入項目相關的包含目錄,注意通常要保留最後的「,,」,除非你不須要在當前目錄下搜索。
設置了合適的path後,另外帶來的一個便利就是可使用「gf」命令方便地跳轉到光標下的文件名所表明的文件中。在上面的例子中,把光標移到「stdio.h」的任一字符上,鍵入
「gf」,則 Vim會自動打開 /usr/include/stdio.h文件。使用「Ctrl-O」(參見「:helpCTRL-O」)可返回到原先的文件中。
多文件編輯
在一個 vim 程序中打開不少文件進行編輯是挺方便的.
vi file1 file2 file3 ...
在完成一個文件的編輯並存盤後(:w),鍵入命令
:n就能夠進入下一個文件的編輯,
:N就進入上一個文件進行編輯
若是要指定編輯一個文件則用
:e 文件名 指定文件編輯
或者用:ls[:files] 由vi列出文件名,好比 在屏幕的最下方
會顯示出以下數據:
1 %a "usevim.html" 行 162
2 # "xxxxxx.html" 行 0
其中:
1 表示打開的文件序號, 這個序號頗有用處.
%a 表示文件代號, % 表示當前編輯的文件,
# 表示上次編輯的文件
"usevim.html" 表示文件名.
行 162 表示光標位置.
而後 :b序號,打開:ls命令中指定序號的文件,
這樣即可以在多個文件中進行復制粘貼了
其餘操做
:sp(:vsp) 文件名 vim 將分割出一個橫(縱)向窗口, 並在該窗口中打開新文件.
從 vim6.0 開始, 文件名能夠是一個目錄的名稱, 這樣, vim 會
把該目錄打開並顯示文件列表, 在文件名上按回車則在本窗口打
開該文件, 若輸入 O 則在新窗口中打開該文件, 輸入 ? 能夠看
到幫助信息.
ctrl +w +w vim 分割了好幾個窗口怎麼辦? 輸入此命令能夠將光標循環定位
到各個窗口之中.
:set diff 此命令用於比較兩個文件, 能夠用
:vsp filename
命令打開另外一個文件, 而後在每一個文件窗口中輸入此命令,就能看
到效果了.
TAB
TAB 就是製表符, 單獨拿出來作一節是由於這個東西確實頗有用.
<< 輸入此命令則光標所在行向左移動一個 tab.
>> 輸入此命令則光標所在行向右移動一個 tab.
5>> 輸入此命令則光標後 5 行向右移動一個 tab.
:12,24> 此命令將12行到14行的數據都向右移動一個 tab.
:12,24>> 此命令將12行到14行的數據都向右移動兩個 tab.
那麼如何定義 tab 的大小呢? 有人願意使用 8 個空格位, 有人用4個, 有的用2個.
有的人但願 tab 徹底用空格代替, 也有的人但願 tab 就是 tab. 不要緊, vim 能
幫助你.如下的設置通常也都先寫入配置文件中, 省得老敲.
:set shiftwidth=4 設置自動縮進 4 個空格, 固然要設自動縮進先.
:set sts=4 即設置 softtabstop 爲 4. 輸入 tab 後就跳了 4 格.
:set tabstop=4 實際的 tab 即爲 4 個空格, 而不是缺省的 8 個.
:set expandtab 在輸入 tab 後, vim 用恰當的空格來填充這個 tab.
文件跳轉與tags
文件跳轉要使用tags文件,生成方式爲 ctags -R *, ctags爲外部命令。
使用方法:
(1)把光標移到變量名或函數上,按
ctrl+ ] 跳轉到變量或函數定義的地方,按
ctrl+ t 返回到原文件
能夠屢次跳轉和屢次返回
(2)在vi中:ta[:tag]能夠直接跳轉到變量或函數定義的地方
(3)vi -t 變量或函數名,直接打開變量或函數定義的文件
其餘選項:
:tselect [關鍵字] 顯示與「關鍵字」匹配的標記列表,輸入數字跳轉到指定的標記
:tjump [關鍵字]
相似於「:tselect」,但當匹配項只有一個時直接跳轉至標記處而再也不顯示列表
:tn 跳轉到下一個匹配的標記處
:tp 跳轉到上一個匹配的標記處
Make 和 grep
Make [17] 和grep [18] 應當算是 Unix 世界裏無人不曉的基本工具了吧。很天然的,Vim
對它們有着特殊的支持。該支持主要經過訪問一個特殊的快速修訂窗口(quickfix
window)來實現。直接在 Vim 的命令模式裏輸入相應的 make 或 grep 命令(如「:grep
foo
*.c」)便可將命令的執行結果放入該窗口,同時根據返回的結果跳轉到第一個錯誤(make
的狀況;在使用 grep 時是匹配成功之處)。如下是經常使用的「快速修訂」命令:
:cn(顯示下一個錯誤)
:cp(顯示上一個錯誤)
:cl(列出全部的錯誤及其編號)
:cc(跳轉到指定編號的錯誤)
:copen(打開快速修訂窗口,在其中顯示全部錯誤,可在錯誤上雙擊鼠標或按回車鍵跳轉至
該錯誤;示例參見圖 4)
執行外部命令
在「:make」這樣的命令中,Vim會自動調用外部的程序。用戶固然也能夠本身執行外部的程序:估計不少的人都已經知道了用「:!命令」能夠在 Vim中執行一個外部命令。不過,估計大部分人都不知道,還有其它一些命令能夠執行外部命令,而且,即便「:!」命令裏面也有一些技巧可使用。最正規的執行外部命令的方法,如前所述,就是「:!」。好比,咱們想要顯示當前目錄下的全部文件,就能夠直接執行:「:!ls」。Vim會在一個終端窗口中進行文件列表,而後提示咱們按鍵返回 Vim中。
事實上,這種方式對於「cp」、「rm」這樣基本不須要輸出的命令比較實用,而對於「ls」這樣關注於輸出的命令並不太適用。若是想把外部命令執行的結果插入到當前編輯的緩衝區中,能夠考慮使用「:r!」。好比,咱們使用「:r!ls」,就能夠把「ls」命令的執行結果插入到緩衝區中光標所在行下面。在使用宏時,這可能會特別有用。
Vim的「:!」命令還有一個特別強大的技巧可使用。拿一個實際例子,咱們須要對在一個文件的每一行以前插入一個編號,該怎麼作呢?——用 Vim的宏或者腳本能夠完成這一工做,但這不是最高效、最靈活的工做方式。Linux下通常帶有的 GNU 的nl,能夠用很是靈活的方式來完成這一任務——要對全部的非空行進行編號,只須要「:%!nl」;要對包含空行的全部行進行編號?OK,「:%!nl -ba」。
稍做一點解釋。當使用可視模式選中文本行後而後鍵入「:!」(命令行上將出現「:'<,'>!
」,表示命令的範圍是選定的文本),或者使用「:%!」(表示命令的範圍是整個緩衝區中
的文本),Vim在執行後面的命令時,將把命令範圍裏的文本行做爲後面執行的命令標準輸入,並用命令執行後的標準輸出替換當前緩衝區中的這些文本行。這就是上面的命令行的工做原理。
##############################高級########################################### 宏替換
vi 不只能夠用 abbr 來替換文字, 也能夠進行命令的宏定義. 有些命令輸起來很費勁,
所以我把它們定義到 - 上, 這樣就很方便了.這些配置能夠預先寫到 ~/.vimrc
(windows 下爲 $VIM/_vimrc) 中, 寫進去的時候不用寫前面的冒號.
:nmap :nohls 取消被搜索字串的高亮
:nmap w 命令模式下轉移光標到不一樣窗口
:imap 輸入模式下運行
:nmap :%s= *$== 刪除全部行尾多餘的空格.
:imap 同上
autocmd
這個命令十分的強大, 能夠用這個命令實現對不一樣的文件格式應用不一樣的配置; 能夠
在新建文件時自動添加上版權聲明等等. 這些命令通常定義在 ~/.vimrc 這樣的配置文件
裏面. 因爲他很強大, 因此我不能給出很具體的說明, 只能舉幾個例子, 詳細的請看幫助.
:autocmd! 刪除全部以前的自動命令.
autocmd FileType java source ~/.vim/files/java.vim
autocmd FileType java source ~/.vim/files/jcommenter.vim
以上兩條命令讓我在打開 java 文件時才應用後面提到的兩個配置文件.
autocmd BufNewFile *.java 0r ~/.vim/files/skeletons/java.skel
以上這條命令讓我在新建 java 文件時自動加入 java.skel 文件的內容.
autocmd BufNewFile *.java normal gnp
以上這條命令讓我在新建 java 文件時自動運行 gnp 命令, 這個命令進行一些特殊化
處理, 好比將新 java 文件中的 __date__ 替換成今天的日期什麼的.
PARTII 配置文件
在啓動的時候vim會讀取 /etc/vimrc 和 ~/.vimrc (也就是說, 全局設置的vimrc 和用戶設置)。通常狀況下用戶設置本身home目錄的.vimrc就已足夠
「雙引號開始的行爲註釋行,下同
「去掉討厭的有關vi一致性模式,避免之前版本的一些bug和侷限
set nocompatible
「顯示行號
set nummber
「檢測文件的類型
filetype on
「記錄歷史的行數
"set history=1000
「背景使用黑色
set background=dark
"語法高亮度顯示
syntax on
「下面兩行在進行編寫代碼時,在格式對起上頗有用;
「第一行,vim使用自動對起,也就是把當前行的對起格式應用到下一行;
「第二行,依據上面的對起格式,智能的選擇對起方式,對於相似C語言編寫上頗有用
set autoindent
set smartindent
"C語言對齊方式,最好用它
set cindent
「第一行設置tab鍵爲4個空格,第二行設置當行之間交錯時使用4個空格
set tabstop=4
set shiftwidth=4
"以空格代替tab,注意make文件有時候必須用tab,而不能用空格代替
"set expandtab
「設置匹配模式,相似當輸入一個左括號時會匹配相應的那個右括號
set showmatch
「在編輯過程當中,在右下角顯示光標位置的狀態行
set ruler
「默認狀況下,尋找匹配是高亮度顯示的,該設置關閉高亮顯示,最好定義快捷鍵
"set nohls
"打開高亮
set hlsearch
「查詢時很是方便,如要查找book單詞,當輸入到/b時,會自動找到第一
「個b開頭的單詞,當輸入到/bo時,會自動找到第一個bo開頭的單詞,依
「次類推,進行查找時,使用此設置會快速找到答案,當你找要匹配的單詞
「時,別忘記回車
set incsearch
"設置退格鍵
set backspace=2
"set backspace =indent,eol,start
"不進行文件備份
set nobackup
"不要交換文件
set noswapfile
「去除vim的GUI版本中的toolbar
"set guioptions-=T
「當vim進行編輯時,若是命令錯誤,會發出一個響聲,該設置去掉響聲
"set vb t_vb=
"設定文件編碼類型,完全解決中文編碼問題
let &termencoding=&encoding
set fileencodings=utf-8,gbk,ucs-bom,cp936
set fenc=utf-8 " default fileencoding
set fencs=utf-8,gb18030,gbk,gb2312,cp936,ucs-bom,euc-jp
:set list 能夠用來顯示非可見字符
參考資料
一、vim的中文手冊在下面鏈接處能夠找到
http://vimcdoc.sourceforge.net/
能夠下栽其中的一個PDF版本,裏面介紹的很詳細,強烈推薦:)
二、CU的貼子
http://bbs.chinaunix.net/viewthread.php?tid=472608&extra=page%3D1
轉載:
http://blog.chinaunix.net/uid-209416-id-2410702.html