VIM入门必读(转)
——整理自互聯網
Vi IMproved (VIM) 是 Bram Moolenaar 開發的與 UNIX 下的通用文本編輯器 vi 兼容并且更加強大的文本編輯器。它支持語法變色、正規表達式匹配與替換、插入補全、自定義鍵等等功能,為編輯文本尤其是編寫程序提供了極大方便。VIM 可以運行在“任何”操作系統上,包括我們常用的 Windows 和 UNIX/Linux。一旦掌握了 VIM,你就掌握了一項跨平臺的利器。
盡管 VIM 功能十分強大,但對于剛接觸它的人尤其是用慣類似 Windows 的 notepad 的人來說,VIM 并不十分易于掌握,畢竟它兼容的是 vi 而不是 notepad。本文旨在介紹 VIM 中我所了解的用法,希望有更多的人喜歡 VIM。應該指出的是,VIM 中有太多的功能和命令,有許多你并不用的著,因此沒有記的必要,有些我也不知道,這要靠你來發現,關鍵是多看 :help ,多試。另外,取決于你的 VIM 的版本以及編譯安裝時的設置,文中講述的某些功能或命令在你的 VIM 中也許并不存在,如有需要請調整。
1. vim 的基本用法
vim 的屏幕區域分為兩個部分:最下面一行是命令行,一般用于提示信息或命令行輸入;除此之外為正文顯示區域。跟 notepad 不同的是,vim 中存在兩種模式:普通(Normal)模式和插入(Insert)模式。
進入 vim 后默認即為普通模式。新手一般初次進入 vim 后就想輸入一串字符,結果發現 vim 一連串莫名其妙的反應。其實,在 vim 的普通模式下,任何按鍵包括普通字符都表示某個命令,并不表示在當前光標處插入字符。常用的命令有:(注意區分大小寫)
: 進入命令行
i 或 a 進入插入模式。區別是:i 進入插入模式后,光標在當前字符前面; a 進入插入模式后,光標在當前字符后面
h j k l 分別是光標左移、下移、上移、右移(一般來說你不會用到它們來移動光標,按方向鍵就可以了)
x 刪除一個字符
dd 刪除一行
J 刪除本行的回車符,把下一行并入本行末尾
r字符 替換光標所在字符為新字符
^ $ 分別是光標移到行首和行末
數字G 移動光標到第若干行,如果直接按 G 則移動到最后一行
在普通模式中,命令以按鍵形式輸入。而在命令行中,命令以字符串形式輸入。下面是常用的命令行:
:q 退出! (更確切的說應該是關閉當前文件)
:w 文件名 存盤。如果還是保存為當前文件,不必寫文件名
:wq 存盤退出
:new 文件名 打開或新建文件(同時關閉當前文件)。如果不指定文件名或者文件名不存在則是新建文件
:help 幫助! 看完后用 :q 關掉窗口。可以在 help 后面加某個幫助主題的名稱,如 :help dd 或 :help help
還有一點是,如果某個命令得到警告(拒絕執行),則要在命令的命令詞后加嘆號表示強制執行。比如你修改過文件,但又想放棄存盤并退出,如果輸入 :q, vim 會告訴你文件已修改,這時,你只能輸入 :q! 退出。又如用 :w! a.txt 表示把當前文件存為 a.txt 而不管 a.txt 是否已經存在。
插入模式就不用多說了,添加你的新內容吧。不過,你也許會發現 BackSpace 鍵和 Delete 鍵的運用很受限制,也不能像 notepad 那樣選擇、復制和粘貼。這些都是由于這是 vim 的標準,后面我們將看到 VIM 擴展的功能可以解決這些問題。記住按 ESC 退出插入模式,回到普通模式。
2. 復制和粘貼
為了便于選取文本,VIM 引入了可視(Visual)模式。要選取一段文本,首先將光標移到段首,在普通模式下按 v 進入可視模式,然后把光標移到段末。需要注意,光標所在字符是包含在選區中的。這時可以對所選的文本進行一些操作,常用的(可視模式)命令有:
x 或 d 剪切(即刪除,同時所選的文本進入剪貼板)
y 復制
r字符 所有字符替換為新字符
u U ~ 分別是所有字母變小寫、變大寫、反轉大小寫
> < 分別是縮進和反縮進
當輸入了命令以后,VIM 將回到普通模式,這時可以按 p 或 P 進行粘貼。普通模式下有關復制和粘貼的命令:
v 進入可視模式
p 或 P 在當前位置粘貼剪貼板的內容,p 粘在光標所在字符后面,P 粘在前面
不得不承認,雖然引入了可視模式,復制和粘貼在 VIM 中仍然是比較麻煩的操作,這也許是 VIM 唯一的缺點。:-) 此外,VIM 還引入了選擇 (Select)模式,跟可視模式類似。結合一些鍵的定義和選項設置,可以實現跟 notepad 相同的復制和粘貼的使用習慣。限于篇幅和水平,在此不提。
3. VIM 的定制
VIM 在 vi 的基礎上擴展了許多功能和命令,提供了許多選項。但是有些功能默認是關閉的,有些選項可能也不符合個人的使用習慣。為此,我們需要編寫一個 vimrc 文件。在 DOS/Windows 版本的 VIM 中,這個文件應放在 VIM 的目錄下,文件名為“_vimrc”。在 UNIX 版本 的 VIM 中,這個文件一般可以放在用戶的個人主目錄下,文件名為“.vimrc”。VIM 啟動時將會把 vimrc 文件中的每一行作為命令行依次執行,我們可以在該文件中加入若干命令,使 VIM 啟動時自動開啟一些有用的功能,定義一些常用的快捷鍵等。
下面是一個 vimrc 文件的示例:(請注意區分瀏覽器的換行與實際的換行。)
" 設置 Backspace 和 Delete 的靈活程度,backspace=2 則沒有任何限制
set backspace=2
" 設置在哪些模式下使用鼠標功能,mouse=a 表示所有模式
set mouse=a
" 設置路徑,在 f 等命令中涉及此參數
" 對于 Windows 編程,path 可設為如
" set path=.,"C:\Program Files\Microsoft Visual Studio\vc98\Include",,
" 對于 UNIX 編程,path 可設為如下
set path=.,/usr/include,/usr/include/qt,,
" 打開光標的行列位置顯示功能
set ruler
" 設置跳格距離
set tabstop=4
" 設置自動縮進格數
set shiftwidth=4
" 打開自動縮進功能
set autoindent
" 設置哪些鍵可以行間繞轉,如下設置則 Backspace 和方向鍵等均可行間繞轉
set whichwrap=b,s,h,l,<,>,[,]
" 根據當前文件語法自動變色。VIM 識別上百種文本文件的語法,如 html、c++、java 等
syntax on
" 以下是個人習慣,定義 等鍵,便于插入模式和可視模式之間的切換
" (1) 使 x d y 自動返回插入模式
vnoremap y "ryi
vnoremap x "rxi
vnoremap d di
" (2) 普通模式和插入模式下均可按 粘貼
imap :if col(".")!=1 exe 'normal "rp'elseexe 'normal "rP'endif`[i
nmap "rP
" (3) 普通模式和插入模式下均可按 進入可視模式
imap :if col(".")!=1 exe 'normal lv'elseexe 'normal v'endif
nmap v
下面給出我常用的 vimrc 文件。另外,你的 VIM 安裝目錄下很可能也帶有一個默認的 vimrc 文件,你都可以參考。如果遇到沒有見過的命令或者參數,可以自己看看 :help 。
* vimrc
4. VIM 的其它命令
要真正使用 VIM,光靠 vi 的基本命令當然不行,下面就來介紹更多的命令。以下的命令,有些是 VIM 特有的,有些在 vi 中也存在,我就不加區分了。其中,以“:”開頭表示該命令在命令行輸入,以“i”開頭表示這是插入模式下的命令,其它則是普通模式下的命令。 表示按 Ctrl+X。
4.1 使用幫助
在 :help 中,遇到超連接可以按 Ctrl+] 跳轉
在 :help 中,按 Ctrl+T 往回跳轉
4.2 打開多個文件
:split 文件名 切分出一個新窗口,打開指定文件。如果省略文件名,則仍顯示當前文件,可用于同時觀察文件的不同部分。(注意跟 :new 的區別)
f 切分顯示光標所指的文件名,VIM 會在 path 中搜索該文件名,比如常用它打開 #include 語句中的文件
當同時打開幾個文件時,按 在各窗口之間切換
_ 當同時打開幾個文件時,按 _ 使當前窗口最大化
:set scrollbind 設置卷動綁定屬性。所有設置了卷動綁定屬性的窗口將一起卷動。可以用 :set noscrollbind 解除綁定
4.3 撤銷和恢復
編輯過程中出現錯誤在所難免,不過沒有關系,VIM 允許無限次的撤銷。只要你沒有關閉文件,你甚至可以一直撤銷下去,回到幾個小時以前剛打開這個文件開始工作時的狀態。
u 撤銷(Undo)上次所做的修改
ctr+r 恢復(Redo)上次撤銷的內容
4.4 字符串搜索替換
/字符串 向下搜索字符串
?字符串 向上搜索字符串
* # 分別是向下和向上搜索光標所指的詞
n 重復上一次搜索
:起始行,結束行s/搜索串/替換串/g 從起始行到結束行,把所有的搜索串替換為替換串
:set ignorecase 設置忽略字母大小寫。可以用 :set noignorecase 取消忽略字母大小寫
例如 /hello 從當前光標位置開始向下搜索 hello,不帶字符串的命令 / 可重復上一次搜索,相當于 n。又如 :1,$ s/hello/hi/g 把全文中的 hello 改為 hi,其中 $ 表示最后一行。另外,你還可以先進入可視模式選擇一段文本,按:進入命令行并輸入 s/hello/hi/g ,VIM 將在選區中進行替換操作。
搜索字符串用的是正規表達式(Regular expression),其中許多字符都有特殊含義:
\ 取消后面所跟字符的特殊含義。比如 \[vim\] 匹配字符串“[vim]”
[] 匹配其中之一。比如 [vim] 匹配字母“v”、“i”或者“m”,[a-zA-Z] 匹配任意字母
[^] 匹配非其中之一。比如 [^vim] 匹配除字母“v”、“i”和“m”之外的所有字符
. 匹配任意字符
* 匹配前一字符大于等于零遍。比如 vi*m 匹配“vm”、“vim”、“viim”……
\+ 匹配前一字符大于等于一遍。比如 vi\+m 匹配“vim”、“viim”、“viiim”……
\? 匹配前一字符零遍或者一遍。比如 vi\?m 匹配“vm”或者“vim”
^ 匹配行首。例如 /^hello 查找出現在行首的單詞 hello
$ 匹配行末。例如 /hello$ 查找出現在行末的單詞 hello
\(\) 括住某段正規表達式
\數字 重復匹配前面某段括住的表達式。例如 \(hello\).*\1 匹配一個開始和末尾都是“hello”,中間是任意字符串的字符串
對于替換字符串,可以用“&”代表整個搜索字符串,或者用“\數字”代表搜索字符串中的某段括住的表達式。
舉一個復雜的例子,把文中的所有字符串“abc……xyz”替換為“xyz……abc”可以有下列寫法:
:%s/abc\(.*\)xyz/xyz\1abc/g
:%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
其它關于正規表達式搜索替換的更詳細準確的說明請看 :help pattern 。
4.5 插入補全
在插入模式下,為了減少重復的擊鍵輸入,VIM 提供了若干快捷鍵,當你要輸入某個上下文曾經輸入過的字符串時,你只要輸入開頭若干字符,使用快捷鍵, VIM 將搜索上下文,找到匹配字符串,把剩下的字符補全,你就不必敲了。這樣,編程序時你起多長的變量名都沒關系了,:-) 而且還可以減少輸入錯誤。我認為,插入補全是 VIM 最為突出的一項功能。
i 向上搜索,補全一個詞。例如,上文中出現過 filename 這個詞,當你想再輸入 filename 時,只要按 f 即可。假如 VIM 向上搜索,找到以 f 開頭的第一個匹配不是 filename,你可以繼續按 搜索下一個匹配進行補全。當然,如果你想一次 就成功,你可以多輸入幾個字符比如 filen 再按 補全
i 向下搜索,補全一個詞
i 補全一行。比如你寫過一行 for (int i = 0; i <> 即可。如果補全出來的不是你想要的那一行,你可以按 或 選擇上一個或下一個匹配行
i 在文件系統中搜索,補全一個文件名
如果按 或 補全一個詞,在當前文件中沒有找到匹配,VIM 將搜索 #include 語句中的文件,而文件的位置將在 path 中搜索。
4.6 鍵的定義
在 VIM 中你可以定義一個鍵,按了這個鍵等于按了某一串預定的鍵。比如
:map! ddi
表示如果你在插入模式下按 就相當于連續按了 ddi,這將會使 VIM 退回到普通模式,刪除一行,再進入插入模式。
map 命令有許多變化形式,每種變化形式所定義的鍵只在某些模式下有效,而在其它模式下無效。你需要根據情況使用正確的變化形式:
:nmap 鍵只對普通模式有效
:imap 鍵只對插入模式有效
:vmap 鍵只對可視模式有效
:cmap 鍵只在命令行下有效
:map 鍵在普通模式和可視模式都有效
:map! 鍵在插入模式和命令行下都有效
還要注意,如果你定義 :map d di 這將引起循環定義錯誤。這時,你需要使用 :noremap d di 來定義。同樣,noremap 也有對不同模式的變化形式。
比如,你想在文件的每一行的倒數第二個字符處插入字符串“abc”,你可以定義
:nmap $hiabcj
在普通模式下按一次 將會:光標移到行末,光標左移一格,進入插入模式,輸入“abc”,退回到普通模式,光標下移一行。不停地按 將解決問題。這是我臨時處理多行重復操作的常用手段,當然,這是一種笨辦法。:-) 而上文寫到的對 的定義則是 map 更復雜的用法。你還可以定義
:map :w:!gcc -o %< -I/usr/include/qt -lqt %
:map :!./%<
實現按 編譯當前文件,按 執行。
在插入補全當中提到的補全一行需要按 ,如果你覺得麻煩,你可以定義
:inoremap
減少擊鍵次數。同樣,對 也可以作類似定義。
4.7 其它命令
:!命令行 執行一條外部命令
. 在光標當前位置處重復上一次操作
i后續字符 輸入特殊的 ASCII 字符或鍵。除了插入模式外,也適用于命令行。后續字符可以是鍵盤上的任意鍵,也可以是三位的十進制數字表示字符的 ASCII 碼
i命令 執行一個普通模式的命令,執行完畢后回到插入模式
i 跳轉到光標所指標識符的定義行。比如你在編程時遇到一個函數 CreateWindow,想看它的定義語句,你就可以在它上面按 i,VIM 將打開新窗口,把光標移到它定義的地方。當然,前提是在當前文件或它的 #include 文件中存在 CreateWindow 的定義。這也牽涉到 path 的設置。不過,VIM 找得不一定很準
K 看光標所指標識符的 man 幫助頁
i 把上一行對應列的字符抄下來
i 把下一行對應列的字符抄上來(寫這一行時我就用了 )
光標所指整數加一
光標所指整數減一
光標返回到以前的位置。相當于光標移動的“撤銷”
光標返回到后來的位置。相當于光標移動的“恢復”
進入可視模式,選取一個矩形區域。該命令通常用于對多行進行列操作。接著按 I 可以在塊前的每一行同時插入字符;按 A 可以在塊后的每一行同時插入字符;按 x、d 或 y 可以剪切或復制;等等
:X 對當前文件加密
5. VIM 6.0 的一些新特性
2001 年 9 月 26 日發布的 VIM 6.0 增加了一些以往沒有的新特性。下面僅僅是一些簡單的介紹,更詳細的描述請自己看 :help 。
* 打開目錄
在 VIM 6.0 中,:new 和 :split 等命令不但可以打開普通文件,還可以打開目錄。一個目錄打開以后將列出里面的文件信息,可以按回車繼續打開相應的文件或者子目錄,也可以按 ? 得到其它目錄操作(修改文件名,刪除文件等)的幫助。
* 折疊
當一個文本太長而你又對其中很長一大段內容不關心的話,可以把你不關心的那些行折疊起來,讓它們從你的視線中消失。被折疊的行將以一行顯示代替,例如:
+--217 行:2. VIM 的定制---------------------
折疊可以有多種方式控制,可以通過設置 foldmethod 選項的值來改變。默認情況下 foldmethod=manual 為手工折疊。下面介紹幾個使用折疊的最簡單的命令:
(可視模式下) zf 手工創建折疊。在可視模式下選擇一段文本,然后按 zf 可以手工創建一個折疊
方向鍵左或右 打開折疊。普通或插入模式下,在折疊行上橫向移動光標將打開被折疊的行
zc 關閉折疊
* 垂直切分窗口
:vsplit 文件名 垂直切分窗口。跟 :split 命令相似,但新窗口與原窗口左右并列。
* 更多的正則表達式
VIM 6.0 比以前增加了許多新的正則表達式,其中我認為最有用的是換行匹配符 \n。以前的版本中,正規表達式只能在同一行上匹配。現在,只要顯式地給出 \n,正規表達式可以跨多行。
* diff 模式
專門用于比較編輯兩個或多個內容相近的文件的模式。一般來說,比如你要比較編輯 A 跟 B 兩個文件,你可以命令行啟動 vim - d A B 或者這樣:先打開文件 A,然后 :vsplit 打開文件 B,對文件 A 和 B 都輸入命令 :diffthis。這時 VIM 將非常清晰的對比顯示出兩個文件的不同之處,編輯起來十分方便。
仔細一看,這個 diff 模式動用了 VIM 許許多多的特性,包括卷動綁定,折疊和語法變色等等。好高級啊!
我所熟悉的 VIM 的功能已經介紹得差不多,剩下的要靠你自己來學習了。其實,VIM 的功能還有很多很多。還是那句話,多看 :help ,多試。 VIM 的幫助還是挺容易看的,相信你看了以后會有更多的驚喜。
轉載于:https://www.cnblogs.com/xuangong/archive/2011/07/30/2121994.html
總結
以上是生活随笔為你收集整理的VIM入门必读(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超实用:IIS 7.5修改WEB.CON
- 下一篇: 有关 Session 操作的几个误区