vim
                                 ===

Author:
Date: 2012-12-05 23:08:46 中国标准时间


Table of Contents
=================
1 基本操作
    1.1 编辑模式
    1.2 定位=移动+搜索
    1.3 编辑
    1.4 表示范围
    1.5 文本对象
    1.6 定制
        1.6.1 .vimrc设置
        1.6.2 设置语法高亮
    1.7 帮助
    1.8 文件操作
    1.9 窗口操作
        1.9.1 C-w 为前缀的命令表示对窗口进行操作的命令
    1.10 启动参数
    1.11 缓冲区操作
2 技巧
    2.1 移动
    2.2 编辑
    2.3 窗口操作
        2.3.1 C-w 为前缀的命令表示对窗口进行操作的命令
    2.4 启动参数
    2.5
3 技巧
    3.1 移动
    3.2 编辑
    3.3 设置
4 注意
    4.1 移动
    4.2 编辑
5 专题应用
    5.1 C编程
        5.1.1 跳转到函数
        5.1.2 在程序中移动
        5.1.3 编辑程序
        5.1.4 编译程序
    5.2 fileExplorer


1 基本操作
-----------

1.1 编辑模式
=============
1) 操作命令+位移命令
2) 操作命令+visual模式下选择的块
3) 操作命令+文本对象

1.2 定位=移动+搜索
===================
1) */#     :以光标所在位置的单词作为关键字向后/向前进行单词查找(类似于/\<xxxx\>)
2) fx/Fx   :在当前行范围内,往后/往前查找x字符
3) e/ge    :往后/往前移动到单词的最后一个字符的地方
4) E/gE    :往后/往前移动到以空格分隔的单词的最后一个字符的地方
5) tx/Tx   :在当前行内往后/往前查找x字符,光标停在字符的前一个字符上
6) ;/,     :重复/反向重复fx/Fx/tx/Tx的命令
7) n%      :移动到整篇文件的百分之n处
8) n|      :跳到第n列
9) C-F/C-B :向前/向后翻屏
10) End/C-End/Home/C-Home :转到行末,文件尾,行首,文件头
11) zz/zt/zb:把当前行放在屏幕中间/首段/尾端
12) :set ignorecase|noignorecase :设置搜索时忽略/不忽略大小写
13) /<UP>|<DOWN>:来复用之前的搜索字符串
14) :set incsearch  :开启增量搜索
15) ・・     :在两个跳转点之间切换(处jk之外的,一个命令使得光标定位于其他行,都叫做一个跳转)
16) ・x     :跳转到名为x的标记,该标记用mx的方式标记
17) 'x     :跳转到名为x的标记的行首
18) C-O/C-I:跳转到上一个/下一个跳转点(C-I和按下<TAB>一样)(可以在不同文件之间跳转!!)
19) mx设置标记,`x跳回标记
20) :marks 标记  :现在标记所在位置

1.3 编辑
=========
1. X       :删除左边的字符=dh
2. D       :删除到行尾的内容=d$
3. C       :修改到行尾的内容=c$
4. S       :修改一整行=cc
5. .       :重复前一个编辑命令,除了u撤销命令、C-R重做命令和:开头的ex命令
6. C-N     :自动补全功能
7. v/V/C-V :进入visual模式,并按字、行、矩阵块的方式选择要操作的块。在visual模式下按o命令可以在设置块头和设置块尾之间却换。当进行矩阵文本块内容的选择时,有4个角可以改变。o只会带你到对角的位置,O可以让你在一行的左右角之间切换
8. ~       :切换大小写
9. 命令记录与回放步骤:
  1) 使用q{register}命令开始,后续的动作将被记录进名为{register}的寄存器中,名字为a-z
  2) 执行你要执行的操作
  3) 按下q以结束对命令的记录(注意仅仅是q一个字符,不要键入多余的字符)
  4) 通过@{register}命令来执行宏
  5) 通过@@可以重复执行上一次执行过的宏
10. 宏命令起始就是存储在寄存器中的一系列字符,可以通过"np将寄存器n中的内容倒出来进行编辑,然后通过"nyy将修改后的宏命令存回到寄存器n中,就能用@n命令执行新的宏命令了
11. 当寄存器为大写字母的时候,表示内容添加在寄存器之后,而不是覆盖
12. :[范围]s/xxx/yyy/[g/p/c]  :在范围内替换xxx为yyy,后面g,p,c的意义为
  1) g 表示改变一行中所有符合的目标字符串
  2) p 表示显示出所有被改变的行
  3) c 对每个改变进行确认操作
  4) e 告诉:s命令,就算没有找到一个匹配的目标,也不要报错
13. 全局命令:global(简写为:g)命令
  1) :g命令是vim最强大的功能之一,它允许你找到符合某个匹配模式的行,然后将命令作用其上。
  2) :g命令的形式为:[范围]g/正则表达式/命令 。这里的命令指的是:开始的命令行命令,而不是normal模式下的命令
  3) 例如:g/^#/s/foobar/barfoo/g 。对以#开头的行进行替换操作,将foobar替换为barfoo
14. 按C-V可以进入Visual block模式,在此模式下可以选择一个矩形的文本块。vim提供了一些特别的命令操纵这个文本块
  1) 在Visual block模式下"$"命令会让每一行的被选择区域扩展到该行的末尾, 不管这些行的长短是否参差不齐. 这种选择状态持续到你发出下一个改变水平选择域的命令. 所以使用命令"j"会保持这种状态,而"h"命令则会停止它.
  2) 命令"Istring<Esc>"会在每行中插入相同的文本, 插入位置在被选择块的左边.如果你插入的过程中进行了换行, 那么"I"命令将会象Normal模式下一样, 只影响文本块的第一行.
  3) "A"命令类似于"I", 只不过它是在文本块的最右边追加文本.
  4) >,<可以移动矩阵块
15. read命令可以接受一个行范围,被读入的文件被放在这个范围的最后一行上。如果要把文件放到第一行,使用特殊行号0
16. 在normal模式下使用gq{范围},来格式化范围内的文字,这里可以用hjklGgg之类的光标移动命令表示范围
17. 类似gq,可以用gU/gu/g~{范围}来最大化/最小化/大小写切换范围内的文字
18. 在normal模式下,!{motion}{外部程序},将motion代表的文本送到外部程序作为输入,用其输出代替motion指定的文本块.!!命令过滤当前行的内容。{motion}指通过移动命令指定的文本块
19. :m/:move 行号  将当前行放到指定行号之后,若要放到第一行,则用行号为0
20. gC-g               :显示从开头到当前位置的行数及字符数,若是在visual模式下,则显示选择的区域内有多少行,及字数
21. :history           :列出所有:命令的历史记录
22. 在normal模式下运行q:可以打开命令窗口,可以浏览整个历史记录
23. 自动补全:在insert模式下
    1) C-P/C-p :vim会搜索以之前输入过的,以光标前开头的所有word,然后补全这个变量名的剩余部分
    2) C-N/C-n :vim搜索以之后输入国的,以光标前开头的所有word,然后补全这个变量名的剩余部分
    3) 因为查找达到文件头尾时会绕过去循环进行,所有C-n和C-p会找到相同的word来补全,只不过查找的顺序相反。
    4) 查找时会隐含地使用ignorecase选项,忽略大小写的不同
24. UNIX环境下的特殊命令
    1. 重复录入:如果按下C-a,编辑器会插入你上一次在insert模式下录入的内容
    2. 从其他行赋值:按下C-y,编辑器会插入你上一行中相同位置的字符。
    3. 插入寄存器内容:按下C-r 寄存器名称,编辑器从寄存器中复制文本
    4.
25. :ab 缩写 扩咱  :定义缩写,用unab 缩写名来删除缩写,:abclear 清除所有的缩写定义
26. 你也可以使用CTRL-V {digits}来插入一个由{digits}指定其ASCII码的字符.
27. 在insert模式下执行一句normal的命令,可以用C-o 命令来执行
28. 格式化文本的命令
    1) 重新排列文本:gq操作符,可以用三种方法来制定它的作用对象,visual模式,使用移动光标的命令和文本对象。一般与移动命令}作用,表示移动到这一段的末尾。或ap文本对象连用
    2) 对齐文本::{range}center|right|left [width].width在center和right中的作用表示行的长度,而在left中表示左边留白的宽度
    3) 增加缩进:在normal模型下的>>命令或ex命令:>都会增加本行的缩进,每次缩进的字符宽度为set shiftwidth选项指定的量
29. 对多个文件同时进行编辑
    1) 同时修改所有待编辑的文件:使用:argdo ex命令.可以对所有打开的待编辑文件执行ex命令
    2) windo命令对所有窗口执行同样的操作
    3) bufdo对所有缓冲区执行同样的操作
30.

1.4 表示范围
=============
1. . 表示当前行
2. 表示范围时,%=1,$
3. 可以用搜索命令/和?来表示范围,例如:?^Chapter?,/^Chapter/s=grey=gray=g,这里用了两个搜索模式. 第一个"?^Chapter?" 向后查找,"/^Chapter/"向前. 为了避免眼花liao乱的斜杠/, ":s"命令使用"="字符作为分隔符.
4. 可以对范围通过+-指定一个位移作为微调
  1) -n表示上调n行
  2) +n表示下调n行
5. 可以使用标记来限定范围,如通过ma,mb设定了两个标记,则:'a,'b表示两个标记间的范围
6. '<和'>实际上也是标记,分别表示visual选择区域的开始和结束,退出visual模式后,标记仍然保持
7.

1.5 文本对象
=============
1) aw=a word
2) is=inner sentence,不包括句子后面的空格
3) as=a sentence,包括了句子后面的空格
4) ap=a paragraph

1.6 定制
=========
1) 键映射
   1. 可以在不同的模式下定义不同德键映射
      :map Normal, Visual and Operator-pending
      :vmap Visual
      :nmap Normal
      :omap Operator-pending
      :map! Insert and Command-line
      :imap Insert
      :cmap Command-line
   2. map 映射键序列1 被映射键序列2:映射一个键序列2为键序列1,当键序列1为多个键时,需要快速输入键序列,才能使vim把他们看成是一个整体
   3. 可以用<xxx>的方式来代替特殊键,如<ESC> <CR>等
   4. 若要取消迭代映射,则用noremap 映射键序列1 被映射键序列2命令:
      :noremap Normal, Visual and Operator-pending
      :vnoremap Visual
      :nnoremap Normal
      :onoremap Operator-pending
      :noremap! Insert and Command-line
      :inoremap Insert
      :cnoremap Command-line
   5. 使用unmap系列命令取消映射:
      :unmap Normal, Visual and Operator-pending
      :vunmap Visual
      :nunmap Normal
      :ounmap Operator-pending
      :unmap! Insert and Command-line
      :iunmap Insert
      :cunmap Command-line
   6. 特殊字符替代
      "|"用于命令之间分隔,所以键序列中不能出现 |,否则vim会以为命令已经结束,可以用<Bar>代替
      空格可以用<Space>代替
      <Nop>表示什么也不做
2) 自定义冒号命令:
   1. :command 自定义冒号命令 实际要执行的命令
   2. 用户自定义冒号命令可以跟一系列的参数,参数个数用 :command -nargs={xxx} 自定义冒号命令 实际执行的命令 来指定
      -nargs=0 没有参数
      -nargs=1 1个参数
      -nargs=* 任意个数的参数
      -nargs=? 0个或1个参数
      -nargs=+ 1个或多个参数
   3. 在实际执行的命令中,用关键字<args>来代表用户可能输入的参数
   4. 如果用户输入的参数可能包括特殊字符,可以用<q-args>来代表用户输入的参数
   5. <f-args>关键字包含的内容与<args>一样,不过它适用于把这些参数传递给一个函数调用
   6. 一些命令以一个指定的范围使用它的参数. 要在Vim中定义这样的冒号命令, 需要在定义时使用-range选项. 该选项的可能取值如下:
      -range 允许使用行号范围, 默认是当前行
      -range=% 允许使用行号范围, 默认是所有行
      -range={count} 允许使用行号范围,行号范围中的最后一行作为最后生效的单个数字,默认值是{count}
   7. 自定义命令时还有其它可用的选项和关键字, 列表如下:
      -count=fnumberg 使命令可以接受一个命令计数作为参数, 默认值是fnumberg.在定义时可用<count>关键字来引用该数字
      -bang 允许在定义的命令体中使用<bang>关键字来代替!
      -register 允许把一个寄存器作为参数传递给该命令, 命令体中对该寄存器的引用使用关键字<reg>或<register>
      -complete=ftypeg 定义该命令使用命令补齐的方式, 请参考j:command-completionj了解该选项的可能取值
      -bar 使该命令可以与其它命令共存于同一个命令行上, 以j分隔, 并且可以以一个"号进行注释
      -buffer 使命令只对当前缓冲区生效.
   8. 要重新定义一个命令只需要在:command后面加一个!即:command!
   9. 要删除命令可以用:delcommand或者用:comclear清除所有的用户定义命令
3) 自动命令(触发器)的格式为:autocmd [group] {events} {file_pattern} [nested] {command}
   1. {file pattern}是一个通常带有通配符的文件名.
   2. [group]名字是可选的. 它只是为了方便调用和管理这些命令
   3. [nested]这个可选的标志允许对自动命令的递归触发.
   4. {command}中的部分是实际上要执行的命令体
      可以用execute 表达式 来重新构建一个命令并执行它
      被自动执行的命令都是冒号命令,如果想执行一个normal模式下的命令,可以用:normal命令,如:autocmd BufReadPost *.log normal G
   6. {events}参数是可以触发该命令的事件列表(每个事件以逗号分隔)
      最常用的事件是BufReadPost. 它在每次Vim将要编辑一个文件时被触发
      如果Vim能正常检测到文件的类型的话, 它会设置°filetype°选项.这又会触发FileType 事件.
      可以通过:set eventignore来设置vim可以忽略的事件列表
   7. 要删除一个自动命令,只要定义一个空的命令体就行了,同时在autocmd后面加上一个!字符
4) :set nowrap        :设置是否自动换行
5) :set list          :让稳重制表符成为可见的
6) :set iskeyword     :定义一个word可以包含哪些字符

1.6.1 .vimrc设置
~~~~~~~~~~~~~~~~~
1) filetype plugin indent on:开启自动识别文件类型、使用文件类型plugin脚本、使用缩进定义文件
2) autocmd 属性 值 命令:设置一个触发器,当属性=值时,执行命令
3) 文件类型plugin的文件名一般为ftplugin/<filetype>.vim或ftplugin/<filetype>_<name>.vim或ftplugin/<filetype>/<name>.vim
4) :options :该命令打开一个新窗口,该窗口的最开头的注释下面是一个选项列表,每行一个,对每个选项有一个对应的简短说明
5) :syntax on :打开语法标亮功能

1.6.2 设置语法高亮
~~~~~~~~~~~~~~~~~~~
1) :syntax on :打开语法标亮功能
2) 使用:colorscheme 颜色方案名称来指定vim使用的颜色方案。颜色方案文件设置如下:
   term 黑白终端的显示属性
   cterm 彩色终端的显示属性
   ctermfg 彩色终端的前景色
   ctermbg 彩色终端的背景色
   gui GUI的显示属性
   guifg GUI的前景色
   guibg GUI的背景色

1.7 帮助
=========
1. :help '选项'  :查看set的选项帮助,记得选项要用单引号括起来。
2. K、\K         :用man查看光标所在的关键字,K在本窗口中显示man信息,\K在新窗口中显示man信息
3.

1.8 文件操作
=============
1. :hide edit 文件名 :可以在不关闭现文件的情况下编辑其他文件,现编辑的文件隐藏起来了
2. :args   :显示现在编辑文件的列表
3. :next/:previous/:last/:first :在多个编辑文件中切换
4. :args 文件列表 :重新定义一个文件列表,可以使用通配符

6. :set backupext=备份文件后缀  :设置备份文件后缀
7. :set backup   :开启备份模式
8. :saveas 文件名 :另存为,之后用w命令默认保存的文件名就变成了指定的文件名
9. gf或C-W f      :在normal模式下,按gf会进入光标所在关键字所指代的文件,文件搜索路径为当前目录和path所指代目录,其中gf在当前窗口打开文件,C-W f在新窗口打开文件
10. :find 文件名或:sfind 文件名 :根据path定义的路径,打开指定文件,其中:find在当前窗口打开文件,:sfind在新窗口打开文件
11. 加密文件:vim -x 文件名,就可以设置密码,下次vim打开时会提示输入密码
12. 更改密码或取消加密  :可以通过:set key=密码或:X交互修改密码,密码为空,则表示不加密
13. 编辑二进制文本的操作
  1) vim -b 文件名  :以二进制方式打开文件
  2) :set display=uhex    :设置以十六进制显示文本内容
  3) 用ga命令可以查看当前光标下字符的本来面目
  4) 字节数go   :移动到指定字节位置去
  5)

1.9 窗口操作
=============
1. :[number]split [文件名]   :上下分割一个窗口,若指定了number则新窗口为numbe行
2. :[number]vsplit [文件名]  :左右分隔一个窗口
3. :close|:q|ZZ     :关闭窗口,但是用:close不会关闭最后一个窗口,防止vim退出
4. :only            :只显示当前窗口
5. :new             :上下打开新窗口并编辑空缓存区
6. :vnew            :左右打开新窗口并编辑空缓存区
7. :命令后加all      :表示对所有窗口进行同一个操作
8. C-Z或者:suspend命令可以暂时挂起vim,回到shell中
9.

1.9.1 C-w 为前缀的命令表示对窗口进行操作的命令
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. C-w w            :在窗口之间切换
2. C-w +            :增加窗口的高度
3. C-w -            :减少窗口的高度
4. nC-w _           :设定窗口高度为n
5. C-w h|j|k|l|t|b  :光标移动到左边,下面,上面,右边,顶部,底部的窗口去(类似文本移动)
6. C-w H|J|K|L|T|B  :窗口移动到左边,下面,上面,右边,顶部,底部的位置
7. :[vertical ]all  :为指定的所有命令各开一个窗口,加了vertical 则让打开的窗口都是垂直分隔

1.10 启动参数
==============
1) 用vim -R|-M 文件名  :以只读的方式打开文件,-R是软现在 -M是硬限制
2) 用vim -o|-O选项可以让vim为每一个文件打开一个窗口,-o水平排列,-O则为垂直排列
3) 用vim -g  :用gui模式运行vim
4) 用vim -r 文件名 :恢复文件
5) 如果你在编辑一个没有指定文件名的缓冲区时死机了, 可以通过一个空字符串作为要恢复的"文件名"
6) 如果用vim -r的话,会列出所有找到的交换文件。
7) vim -S vim脚本文件     :启动vim时执行某个脚本,若脚本文件为会话文件则可以用来恢复某个会话
8) vim -s normal模式命令文本 待编辑文件 :执行normal模式命令来编辑文件名,就好像你手工键入的一样              :
9) vim -e -s 文件名 <ex脚本文件:这里-e表示vim以ex模式,根据ex脚本文件的内容对文件进行修改,-s参数告诉vim安静地运行
10) vim -                :-表示vim从标准输入读取要编辑的内容
11) vim -w 记录normal模型命令的文件 待编辑文件 :将编辑文件的所有操作记录下来,添加在normal模型命令的文件后面

1.11 缓冲区操作
================
1. :buffers或:ls      :列出缓冲区列表
2. :buffer|sbuffer 缓冲区编号|文件名或部分文件名   :编辑指定缓冲区,其中buffer表示在本窗口编辑,是buff而表示在新窗口编辑
3. :bnext|bprevious|bfirst|blast      :在各个缓冲区之间进行跳转
4. bdelete 缓冲区编号     :把一个缓冲区从列表中去除
5.

2 技巧
-------

2.1 移动
=========
1. `]      :返回最后编辑的位置

2.2 编辑
=========
1. xp可以用来交换两个字符的位置
2. 当光标位于一个单词的中间,而需要删除这个单词时,可以用daw,这里aw是表示一个文本对象=a word的缩写
3. 在R命令进入replace模式后,按退格键,会发现原来的字符又回来了,等价于一个撤消操作
4. set autowrite|noautowrite  :设置是否自动存盘
5. Ctrl-^  :可以快速地在两个文件间切换
6. ・"      :带你到上次你离开该文件时光标所在的位置
7. `.      :回到你最后一次对文件做出修改的地方
8. 删除内容时,也可以指定一个寄存器名,这种方法可以用来移动多处的文本。
9. 可以用:write >>文件名的方式来追加文件内容
10. 命令记录与回放步骤:
   1) 使用q{register}命令开始,后续的动作将被记录进名为{register}的寄存器中,名字为a-z
   2) 执行你要执行的操作
   3) 按下q以结束对命令的记录(注意仅仅是q一个字符,不要键入多余的字符)
   4) 通过@{register}命令来执行宏
   5) 通过@@可以重复执行上一次执行过的宏
11. 宏命令起始就是存储在寄存器中的一系列字符,可以通过"np将寄存器n中的内容倒出来进行编辑,然后通过"nyy将修改后的宏命令存回到寄存器n中,就能用@n命令执行新的宏命令了
12. 可以用其他符号代替s///的斜杠,如s+xxx+yyy+g
13. 在normal模式下,!{motion}{外部程序},将motion代表的文本送到外部程序作为输入,用其输出代替motion指定的文本块
14. 使用[位置]read !{外部程序} 可以将外部程序的输出写到指定位置
15. :write !{外部程序}  :将要写的文本传入外部程序作为输入
16. :g/^/m 0           :将各行顺序反转
17.
11.

2.3 窗口操作
=============
1. :[number]split [文件名]   :上下分割一个窗口,若指定了number则新窗口为numbe行
2. :[number]vsplit [文件名]  :左右分隔一个窗口
3. :close|:q|ZZ     :关闭窗口,但是用:close不会关闭最后一个窗口,防止vim退出
4. :only            :只显示当前窗口
5. :new             :上下打开新窗口并编辑空缓存区
6. :vnew            :左右打开新窗口并编辑空缓存区
7. :命令后加all      :表示对所有窗口进行同一个操作
8. C-Z或者:suspend命令可以暂时挂起vim,回到shell中
9.

2.3.1 C-w 为前缀的命令表示对窗口进行操作的命令
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. C-w w            :在窗口之间切换
2. C-w +            :增加窗口的高度
3. C-w -            :减少窗口的高度
4. nC-w _           :设定窗口高度为n
5. C-w h|j|k|l|t|b  :光标移动到左边,下面,上面,右边,顶部,底部的窗口去(类似文本移动)
6. C-w H|J|K|L|T|B  :窗口移动到左边,下面,上面,右边,顶部,底部的位置
7. :[vertical ]all  :为指定的所有命令各开一个窗口,加了vertical 则让打开的窗口都是垂直分隔

2.4 启动参数
=============
1) 用vim -R|-M 文件名  :以只读的方式打开文件,-R是软现在 -M是硬限制
2) 用vim -o|-O选项可以让vim为每一个文件打开一个窗口,-o水平排列,-O则为垂直排列
3) 用vim -g  :用gui模式运行vim
4) 用vim -r 文件名 :恢复文件
5) 如果你在编辑一个没有指定文件名的缓冲区时死机了, 可以通过一个空字符串作为要恢复的"文件名"
6) 如果用vim -r的话,会列出所有找到的交换文件。
7) vim -S vim脚本文件     :启动vim时执行某个脚本,若脚本文件为会话文件则可以用来恢复某个会话
8)

2.5
====

3 技巧
-------

3.1 移动
=========
1. `]      :返回最后编辑的位置

3.2 编辑
=========
1. xp可以用来交换两个字符的位置
2. 当光标位于一个单词的中间,而需要删除这个单词时,可以用daw,这里aw是表示一个文本对象=a word的缩写
3. 在R命令进入replace模式后,按退格键,会发现原来的字符又回来了,等价于一个撤消操作
4. set autowrite|noautowrite  :设置是否自动存盘
5. Ctrl-^  :可以快速地在两个文件间切换
6. ・"      :带你到上次你离开该文件时光标所在的位置
7. `.      :回到你最后一次对文件做出修改的地方
8. 删除内容时,也可以指定一个寄存器名,这种方法可以用来移动多处的文本。
9. 可以用:write >>文件名的方式来追加文件内容
10. 命令记录与回放步骤:
   1) 使用q{register}命令开始,后续的动作将被记录进名为{register}的寄存器中,名字为a-z
   2) 执行你要执行的操作
   3) 按下q以结束对命令的记录(注意仅仅是q一个字符,不要键入多余的字符)
   4) 通过@{register}命令来执行宏
   5) 通过@@可以重复执行上一次执行过的宏
11. 宏命令起始就是存储在寄存器中的一系列字符,可以通过"np将寄存器n中的内容倒出来进行编辑,然后通过"nyy将修改后的宏命令存回到寄存器n中,就能用@n命令执行新的宏命令了
12. 可以用其他符号代替s///的斜杠,如s+xxx+yyy+g
13. 在normal模式下,!{motion}{外部程序},将motion代表的文本送到外部程序作为输入,用其输出代替motion指定的文本块
14. 使用[位置]read !{外部程序} 可以将外部程序的输出写到指定位置
15. :write !{外部程序}  :将要写的文本传入外部程序作为输入
16. :g/^/m 0           :将各行顺序反转
17. 进入vim后,输入'0就会回到上次退出的位置
18. viminfo文件保存vim实例中的交换信息,可以用:wviminfo和rviminfo实现多个不同vim间分享viminfo文件
19. vim休眠:会话文件包含你编辑活动的所有信息,可以用:mksession 会话文件名的方式创建一个会话文件,用:source 会话文件名载入会话信息还原
20. 视图文件可以保存某个窗口的属性,可以用mkview 文件名|数字编码和loadview 文件名|数字编码来保存和恢复视图
21. 模式行:模式行加入到某个文件的前5行或后5行中,为该文件指定特殊的选项设置,语法为:任何文本 vim:set语法...: 任何文本。这里任何文本的意思是你可以在对vim有用的文本之前或之后放入任何东西,vim之前必须要有一个空格
22. 远程URL指定的文件,使用normal模式下的gf命令,vim也会自动下载该文件然后再编辑它
23. gzip插件可以使得vim像处理其他文件一样编辑压缩文件,vim自动处理解压缩问题
24. 自动补全:在insert模式下
    1) C-P/C-p :vim会搜索以之前输入过的,以光标前开头的所有word,然后补全这个变量名的剩余部分
    2) C-N/C-n :vim搜索以之后输入国的,以光标前开头的所有word,然后补全这个变量名的剩余部分
    3) 因为查找达到文件头尾时会绕过去循环进行,所有C-n和C-p会找到相同的word来补全,只不过查找的顺序相反。
    4) 查找时会隐含地使用ignorecase选项,忽略大小写的不同
    5) 对于自动补全有一个选项十分有用, 它就是°infercase°. 它使搜索
    6) 匹配的word时忽略剩余部分的大小写(当然还得°ignorecase°被设置了才行), 但继续保留已键入的部分的大小写. 这样对于键入了"For"时Vim会查找到"fortunately"这样的匹配, 但最终的结果是"Fortunately".
    7) 如果你自己清楚要找的东西, 你可以用以下命令来补全这样一些特殊的文档元素:再用C-n,C-p切换
       CTRL-X CTRL-F 当前目录中的文件名
       CTRL-X CTRL-L 整行内容
       CTRL-X CTRL-D 宏定义(也包括那些在include文件里定义的宏)
       CTRL-X CTRL-I 当前文件和被当前文件include的文件
       CTRL-X CTRL-K 来自一个字典文件的word
       CTRL-X CTRL-T 来自一个thesaurus的word
       CTRL-X CTRL-] tags
       CTRL-X CTRL-V Vim的命令行
25. 左右对齐文本:vim没有一个内置的命令来使文本左右对齐,但是可以使用fmt外部程序实现:%!fmt
26. 当一行多于一个屏幕长度时,用j/k命令可能会移动多于一个屏幕行的位置。要精确地移动一个屏幕行,可以用gj/gk命令来代替
27. 要方便地编辑表格时,可以:set virtualedit=all,就可以把光标任意移动到空无一物的虚位置上去了。
28. 增加数字序号:将光标移动到要修改的数字序号上,在normal环境下按C-A,就对序号+1,可以在前面接数字;按C-X做减法,可以在前面接数字
29.

3.3 设置
=========
1. 在set 选项&可以使得选项变为默认值,记得&号是紧靠选项后面的。

4 注意
-------

4.1 移动
=========

4.2 编辑
=========
1. yw复制的内容包括word之后的空白文字,而ye不包括后面的空白文字
2. 在R命令进入replace模式后,按退格键,会发现原来的字符又回来了,等价于一个撤消操作
3. :lcd与:cd的区别,:cd改变整个vim的工作目录而:lcd改变的只是该窗口的工作目录
4. 不保存源文件打开第二个文件:假设你现在在编辑one.txt,希望在不保存one.txt的情况下打开two.txt,则可以用:hide edit two.txt的方法,缓冲区one.txt会从屏幕消失,vim会保持one.txt的状态
5. 即使是用":bdelete"命令删除了一个缓冲区Vim还是 会 记 住 它. 实 际 上 它 被 打 入"unlisted"列 表 中,不 再 显 示 在":buffers"命 令 显 示 的 缓 冲 区 列 表 中.但":buffers!"还是会让它再度现身(是的, Vim可以完成Misson Impossible). 要彻底清除一个缓冲区, 要使用":bwipe". 同时请参考°buflisted°选项.
6. 即使加密了,但是vim不会对交换文件加密,为了保密,一个方法是不用交换文件,如vim -x -n file.txt或者在编辑状态:setlocal noswapfile
7. 在unix环境中,如果按下C-a,编辑器会插入你上一次在insert模式下录入的内容。而在windows环境C-a代表全选编辑区文本
8. 要输入特殊字符,在unix环境下按C-v 特殊字符,在windows环境下按C-q 特殊字符
9. 如果你想让缩进量是4的倍数, 只需要把°shiftwidth°设为4即可. 但是键入制表符还是会插入一个8字符宽度的缩进. 这可以通过°softtabstop°选项得以改观:
10.

5 专题应用
-----------

5.1 C编程
==========

5.1.1 跳转到函数
~~~~~~~~~~~~~~~~~
1. :[数字]tag|stag|ptag 函数名称    :跳转到函数定义出,stag会分隔一个窗口来显示,ptag会打开一个预览窗口来显示光标依然在原窗口中,其中函数名可以是/关键字 会找到包含关键字的函数,/关键字表示查找关键字的位置
2. :tags                           :会列出现在你已经到过哪些tag
3. C-T                             :跳到你前一次tag处
4. :set tags=../,.../...           :可以通过tags选项的设置来引用更多的tags
5. :tfirst|:tnext|:tprevious|:tlast:跳转到下个同名函数
6. :tselect 函数名                  :弹出个列表,可以在列表中选择
7. 预览窗口操作
   1) :ptag 函数名称                 :打开预览窗口,显示函数定义
   2) C-w }                         :打开预览窗口,显示光标所在的函数名称的定义
   3) :pclose                       :关闭预览窗口
   4) :pedit 文件名                  :在预览窗口编辑文件
   5) :psearch 关键字                :搜索当前文件和include的文件,并显示匹配行
8. g<鼠标左键点击>                    :跳转到鼠标点击处关键字的tag处
9. C-]                              :跳转到光标所在关键字的tag处

5.1.2 在程序中移动
~~~~~~~~~~~~~~~~~~~
1. %可以在#ifdef....#else...#endif间跳动
2. 在#ifdef ...#else...#endif 中可以用[#或]#跳到上一个或下一个#结构的开始元素中
3. [和]移动方法
   1. 用[[或][可以移动到一个代码块的开头或末尾,这两个命令都假设{}字符位于第一列
   2. [{或]}命令跳转到当前代码块的开头或结尾,它会跳过与它平级的代码块
   3. [m可以找到前一个函数的开始,]m到下一个函数的结尾
   4. []向前查找一个函数的结尾,]]查找一个函数的开始
   5. [(和])命令类似于[{和]}, 只不过它工作于()的内部而不是{}.
   6. [/和 ]/在/*...*/注释内移动
4. 查找全局标识符:
   1. [i或[I会列出当期光标之前的第一个([i)或所有的([I)包含光标所在标识的行,包括include的文件及include中include的文件,以此类推
   2. ]i或]I会列出当期光标之后的第一个(]i)或所有的(]I)包含光标所在标识的行,包括include的文件及include中include的文件,以此类推
   3. [I命令查找任何的标识符,要只查找以#define定义的宏,使用[D
   4. [I命令会搜索include文件,要使搜索限制在当前文件里并执行同样的功能,以命令gD(goto Definition)
   5. 要是搜索限制在当前函数中,使用gd命令
5. 跳转到匹配的全局标识符处 :[<TAB> 会跳转到用[i查出的匹配目标处,可以在前面加数字
6. vim会根据选项path指定的路径里查找include文件。使用:checkpath会列出所哟能找到和不能找到的include文件

5.1.3 编辑程序
~~~~~~~~~~~~~~~
1. 开启cindent选项可以让vim自动对C进行缩进
2. 要格式化代码可以使用=操作符命令,与其他操作符一样,它有三种命令形式
   1. == :为最简单的应用,为当前行进行适当的缩进
   2. visual模式下=命令为被选择的行设定缩进
   3. 可应用于文件对象,如=a{ 对当前的{}程序块进行重新缩进
   4. = 定位操作 :如=G,对到文件尾进行缩进
   5. 使用外部程序格式化代码:set equalprg=外部程序
      如:针对不同文件后缀使用不同的程序格式化程序:
      autocmd Filetype 文件后缀 :set equalprg=外部格式化程序
3. 也可以卡开smartindent选项来为未知格式的文件进行自动缩进
4. 要快速向右或向左缩进,可以用>或<操作符。使用方法类似=操作符
   1. 或 :为最简单的应用,为当前行快速减少或增加缩进
   2. visual模式下
   3. 应用于文件对象
   4. 接定位操作符
5. 对注释的格式化:gq 操作符,如
   1. visual模式下
   2. 应用于文件对象
   3. 可以把光标放在注释的开头,按下gq]/  :gq是格式化注释命令的操作符,]/是移动到注释命令的结尾
6. 自定义注释格式:
   1. 行注释:通过:set comments=:注释关键字 可以设置注释的格式,其中:为分隔符
   2. 段注释:set comments=s:注释开始关键字[,m{option}],e:注释结束关键字.这里s代表start,m代表middle为注释内容,e代表end
7. 补全:C-x C-XXX
   1. 万能补全
      启动万能补全:C-x C-o
      取消万能补全:"CTRL-E"停止补全并回到原来录入的文字。用"CTRL-Y"可以停止补全,并接受当前所选的项目
   2. 整行补全                        CTRL-X CTRL-L
   3. 根据当前文件里关键字补全        CTRL-X CTRL-N
   4. 根据字典补全                    CTRL-X CTRL-K
   5. 根据同义词字典补全              CTRL-X CTRL-T
   6. 根据头文件内关键字补全          CTRL-X CTRL-I
   7. 根据标签补全                    CTRL-X CTRL-]
   8. 补全文件名                      CTRL-X CTRL-F
   9. 补全宏定义                      CTRL-X CTRL-D
   10. 补全VIM命令                     CTRL-X CTRL-V
   11. 用户自定义补全方式              CTRL-X CTRL-U
   12. 拼写建议                        CTRL-X CTRL-S


5.1.4 编译程序
~~~~~~~~~~~~~~~
1. :make 参数        :编译程序,如果有错误发生,vim会自动将光标定位于第一个错误的事发地点
2. :cnext|cprevious|cfirst|clast  :cnext命令会带你到下一个错误的事发地点,其他的类推
3. :cc [数字]        :跳转到第N个错误,并显示完整的错误信息描述
4. :clist或:clist!   :clist会列出一个所有简要错误信息的列表,:clist!会列出一个所有完整信息的列表
5. :set makeprg      :设置:make命令被执行时实际调用的为外部程序,VC用户可以设置为nmake
6. :colder|:newer    :vim内部维护了一个错误列表,每次:make都会生成一个新的错误列表,可以用:colder来返回上一个错误列表,用:newer返回下一个错误列表
7. :cfile 错误信息文件 :若你有一个包含错误信息的文件,可以用:cfile 文件名的方式读取错误信息,就可以像:make命令一下让你跳转到出错地点去了。
8.

5.2 fileExplorer
=================
   1. 打开fileExplorer:
      :explore


  """"""""""""""""""""""""""""""
  " netrw setting
  """"""""""""""""""""""""""""""
  let g:netrw_winsize = 30
  nmap <silent> <leader>fe :Sexplore!<cr>
  "这样,在我输入“,fe”时,就会打开一个垂直分隔的窗口浏览当前文件所在的目录,窗口的宽度为30。

   2. fileExplorer下的的常用键
          ----  --------                        
          映射  简要解释                                
          ----  --------                        
         <F1>   netrw 给出帮助
         <cr>   netrw 进入目录或者打开文件                        
         <del>  netrw 试图删除文件/目录                          
           -    netrw 往上一层目录                              
           a    切换普通显示方式、                              
                隐藏方式 (不显示匹配 g:netrw_list_hide 的文件) 和显示方式 (只显示匹配 g:netrw_list_hide 的文件)
           c    使浏览中的目录成为当前目录                       
           C    设置编辑窗口                                   
           d    建立新目录       
           D    试图删除文件/目录                             
           gb   切换到收入书签的目录                          
           gh   快速隐藏/显示点文件                          
         <c-h>  编辑文件隐藏列表                            
           i    在瘦、长、宽和树状列表方式循环                
         <c-l>  使 netrw 刷新目录列表                 
           mb   把当前目录加入书签                            
           mc   把带标记文件复制到标记目标目录中               
           md   对带标记文件进行比较 (不超过 3 个)            
           me   把带标记文件放到参数列表中并编辑之            
           mf   标记文件                                  
           mh   切换带标记文件的后缀在隐藏列表中的存在与否    
           mm   把带标记文件移动到标记目标目录中            
           mp   打印带标记文件                           
           mr   标记满足 shell 风格的 |regexp| 的文件    
           mt   使当前浏览目录成为标记文件的目标目录       
           mT   对带标记文件应用 ctags                  
           mu   撤销所有带标记文件的标记                 
           mx   对带标记文件应用任意外壳命令             
           mz   对带标记文件压缩/解压缩                 
           o    用水平分割在新浏览窗口中进入光标所在的文件
           O    获取光标指定的文件                                
           p    预览文件                                        
           P    在前次使用的窗口中浏览                           
           qb   列出书签内的目录和历史                           
           qf   显示文件信息                                   
           r    反转排序顺序                                   
           R    给指定的文件或目录换名                          
           s    选择排序风格: 按名字、时间或文件大小             
           S    指定按名排序时的后缀优先级                      
           t    在新标签页里进入光标所在的文件/目录             
           u    切换到较早访问的目录                            
           U    切换到较迟访问的目录                            
           v    用垂直分割在新浏览窗口中进入光标所在的文件/目录    
           x    用指定程序阅读文件                             

           %    在 netrw 当前目录打开新文件