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 当前目录打开新文件