# VIM 學習筆記
整理:Jims of [肥肥世家](http://www.ringkee.com)
[jims.yang@gmail.com](mailto:jims.yang@gmail.com)
Copyright ? 2005,2006 本文遵從GNU 的自由文檔許可證(Free Document License)的條款,歡迎轉載、修改、散布。
發布時間:2005年07月18日
更新時間:2006年05月22日
**Abstract**
VI編輯器是類UNIX系統中最常用到的編輯器,VIM是VI編輯器的改良版本。本筆記是我在使用vim時記錄下來的備忘錄,內容不是很全面,詳細介紹可參考[http://vimdoc.sourceforge.net/](http://vimdoc.sourceforge.net/)網站。
**Table of Contents**
+ [1\. 普通模式](#id2875106)
+ [1.1\. 編輯](#id2811719)
+ [1.2\. 光標移動](#id2810258)
+ [2\. 編輯模式](#id2810380)
+ [3\. 命令模式](#id2810410)
+ [4\. vimrc配置](#id2861464)
## 1\. 普通模式
在shell中直接打vim filename就會進入普通模式。在這個狀態,我們可以通過不同的按鍵對文件進行操作和切換到其它模式。按“:”可切換到命令模式,按i,o,a可進入編輯模。
### 1.1\. 編輯
`i`
進入編輯模式。
`o`
在當前位置下插入一空行,進入編輯模式,光標位于空行的最開頭。
`a`
光標后移一個字符,進入編輯模式。
`v`
這入可視模式,可用高亮的色塊選擇內容。
`x or DEL鍵`
刪除當前字符,刪除內容保存在緩沖區。
`xp`
左右字符互換。
`dd`
刪除當前行,刪除內容保存在緩沖區。
`ddp`
上下兩行的內容互換。
`d$`
刪除當前光標至行尾的所有內容。
`dG`
刪除從當前行至文件未尾的所有行。
`u`
undo。
`v`
進地visual模式,移動光標可選擇文本。
`y`
把當前行復制到緩沖區中。
`p`
把緩沖區中的文本插入到當前位置。
`"ay`
把當前行復制到a緩沖區。可用26個字母命名多個緩沖區。
`"ap`
把a緩沖區中的文本插入當前位置。
`J`
上下兩行合并成一行。
`.`
英文句點的作用是重復執行上次執行的命令,如你按了"ap插入a緩沖區的內容,那你就可按"."來重復這個操作。
### 1.2\. 光標移動
`h,j,k,l`
在vim中,除了可使用光標鍵在移動光標外,還有一種更方便的光標移動方式。就是使用h,j,k,l這四個鍵來移動光標。h控制光標左移,j控制光標下移,k控制光標上移,l控制光標右移。通過使用這四個字母鍵就可使我們的手不用移動即可控制光標的移動。剛開始使用可能會有些不習慣,但熟練使用后你會發覺你的輸入速度提高不少,強烈建議喜歡vim的朋友使用。
`$`
光標移動到行尾。
`G`
光標移動到文檔末尾。
`H,L`
H控制光標移動到當前屏幕頭,L控制光標移動到當前屏幕尾。
`{,}`
{控制光標上移一個段落,}控制光標下移一個段落
## 2\. 編輯模式
`ESC`
退出編輯狀態。
## 3\. 命令模式
在普通模式上按“:”就可進入命令模式,在左下屏幕我們輸入一些操作指令。
`:q!`
不保存退出vim。
`:w`
保存文檔,但不退出vim。
`:x`
保存退出vim。
`:! command`
運行shell命令。
`:e filename`
編輯/打開一個文件
`:s/emacs/vim`
在當前行中把第一個emacs替換成vim。
`:s/emacs/vim/g`
把當前行中所有的emacs替換成vim。
`:%s/emacs/vim/g`
在全局范圍內把emacs替換成vim。
`:reg`
列出緩沖區內容。
`:set all`
列出所有參數的配置情況。
`:tabe`
新建一個標簽頁。
`:tabn or :tabp`
切換到下一個\上一個標簽頁。
`:close`
關閉當前標簽頁。
`:qa`
關閉所有標簽頁退出。
## 4\. vimrc配置
在命令模式下用set命令設置的東西是不能保存的,下次打開vim時又要重新設置。所以vim提供了一個配置文件叫vimrc,可以保存你的配置信息。該文件在Debian系統中位于/etc/vim/目錄下。在該文件中,以雙引號開頭的是注釋。
* `set autoindent`
自動縮排,如當前行是從第3個字符的位置開始編輯的,按回車后光標會自動定位在下一行第三3個字符的位置。
* `set paste`
置粘貼模式,這樣粘貼過來的程序代碼就不會錯位了。
* 打開文件時自動回到上次編輯位置。
```
if has("autocmd")
autocmd BufRead *.txt set tw=78
autocmd BufReadPost *
\ if line("'\"") > 0 && line ("'\"") <= line("$") |
\ exe "normal g'\"" |
\ endif
endif
```