# 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
```