微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vim帮助文档总结

vim帮助文档简介

vim帮助文档有两部分:

  • 用户手册 是基于任务的,从简单到复杂,以用户角度来写的,文件名以usr开头。例如usr_02.txt。
  • 参考手册 则详细描述了vim的方方面面,文件名以单个主题为名,例如filetype.txt。

链接

vim文档中包含了大量的链接可以跳转。这些链接包括

  • 由竖条包裹起来的链接(vim术语是标签)。
  • 由单引号包裹起来的(特性)选项,一般在命令行模式下使用,来配置、定制化vim编辑器。
  • 由双引号包裹起来的命令,一般在正常模式下使用。

链接间的跳转可以在普通模式下由下面命令完成:

vim帮助文档中显示链接的方式由conceallevel特性选项控制:

  • :set conceallevel查看conceallevel等级。
  • :set conceallevel=0设置vim使得超链接文字前后都由| 包裹着。

常用帮助

:help进入通用的帮助页面
:help [subject]获取某些主题相关的帮助,例如:help x,:help deleting,:help index
帮助组合键命令,需要带CTRL-前缀,例如::help CTRL-A
帮助不同模式下的命令,需要带模式前缀,例如::help i_CTRL_H:help v_o:help c_%,正常模式下的命令不需要模式前缀。
帮助调试相关的命令,需要带>前缀,例如::help >cont
帮助外部命令,需要带:前缀,例如::help :s
帮助vim命令行参数,需要带-前缀,例如::help -t
帮助vim编辑器选项,需要用单引号,例如::help 'number'
帮助特殊键位,需要用尖括号,例如::help i_<Up>
帮助寄存器,需要带quote前缀,例如::help quote:
帮助vim出错信息,例如::help E37
帮助正则表达式符号,需要带/前缀,例如::help /\+
帮助可选功能,需要带+前缀,例如::help +conceal
帮助正则表达式:help pattern.txt
帮助vim脚本:help eval.txt
帮助案件映射:help map.txt
帮助命令定义:help command-<topic>,例如::help command-bar
帮助窗口处理:help windows.txt
帮助vim事件:help autocommand-events
CTRL-D可以在vim最后一行列出半截命令所有可能的选项,供参考。
<Tab>从第一个可能的选项开始,直接补全原半截命令。

其他

:set compatible?显示当前vim是否在兼容模式下运行,正常使用vim理应在非兼容模式下运行。
:scriptnames显示vim使用的配置文件列表。

  • 在选项名字前加上no即表示取消该选项,例如::set nonumber不显示行号。

vim模式

vim是个模态编辑器,意思是编辑器根据当前处于的不同模式,行为方式不同。
vim的模式一般有:正常模式插入模式命令模式替换模式可视化模式等。

模式切换

  • 使用vim命令进入vim界面时候,处于正常模式。
  • 不管当前在任何模式下,按Esc键回到正常模式(有时候需要按两下才能回到正常模式)。
  • 正常模式下,按:键进入命令行模式,vim的最后一行会有:字符,此时可以执行vim特有的命令。
  • 正常模式下,按i键进入插入模式,vim的最后一行会有-- INSERT --字样,此时按什么键,光标所在处就会插入什么值。
  • 正常模式下,按R键进入替换模式,vim的最后一行会有-- REPLACE --字样,此时输入什么字符,都会替换光标所在处开始的任何字符。
  • 正常模式下,按v键进入可视化模式,vim的最后一行会有-- VISUAL --字样,此时可以高亮显示选中的区域。

:set showmode设置在vim最后一行显示当前模式。

退出vim
一般情况下退出vim有两种方式:

正常模式

移动

[#]{motion}一个移动命令motion前加一个数目#,表示重复该移动命令#次,例如9k3a!
常用移动命令如下:

  • h向左,j向下,k向上,l向右。
  • w向后移动光标一个单词的长度,跳过单词间的空格,直接到下一个单词开始的位置。
  • b向前移动光标一个单词的长度,跳过单词间的空格,直到上一个单词开始的位置。
  • e向后移动光标一个单词的长度,直到该单词最后一个字符开始的位置。
  • ge向前移动光标一个单词的长度,直到前一个单词最后一个字符开始的位置。
  • WEB功能类似,只是认为由空白字符组成的字符串才是单词。
  • [#]$移动到当前行之后,指定数目行的行尾,既最后一个字符处,#从1开始表示当前行,省略#也表示当前行。
  • ^移动光标到当前行第一个非空白字符开始位置。
  • 0移动光标到当前行第一个字符开始位置。
  • #G跳转到指定行,如果不指定#,则跳转到当前文件末尾。
  • gg跳转到当前文件开头。
  • #%按百分比跳转
  • H当前屏幕所显示内容不变,只移动光标到第一行。
  • L当前屏幕所显示内容不变,移动到最后一行。
  • M当前屏幕所显示内容不变,移动到中间行。
  • 长行移动:
    长行既是很长的、当前屏幕不能完全显示的一行。
    • Nowrap特性选项关闭换行显示长行时,如下命令可以以文本的视角来移动:
      • zh右移1个字符。
      • 4zh右移4个字符。
      • zH右移半个窗口。
      • ze右移直到当前光标所在位置为窗口最右边位置。
      • zl左移1个字符。
      • 4zl左移4个字符。
      • zL左移半个窗口。
      • zs左移直到当前光标所在位置为窗口最左边位置。
      • g0光标移动到当前行窗口可见的第一个字符处。
      • g^光标移动到当前行窗口可见的第一个非空白字符处。
      • gm光标移动到当前行窗口可见的中间位置。
      • gM光标移动到当前行的中间位置。
      • g$光标移动到当前行窗口可见的最后一个字符处。
    • wrap特性选项开启换行显示长行时,如下命令可以以文本的视角来移动:
      • gj光标向下移动屏幕中的一行。
      • gk光标向上移动屏幕中的一行。

特性选项:
CTRL+G显示当前文件名,当前文件行数,光标所在行号、列号以及占全文的百分比;有时候列号会写成2-9表示第二个字符,第九列(第一个字符是个制表键)。
:set number在vim每一行前都显示行号。
:set ruler在vim最后一行显示列号和列号。
:set wrap设置当vim窗口容不下很长的一行文本时候,换行显示该文本,但是该长行文本之间其实没有换行。
:set linebreak设置当wrap关闭以后,换行显示的文本不会从单词中间断开。
:set showbreak={char}设置当wrap关闭以后,换行显示的文本在行首的前缀字符。
:g/./,/^$/join将vim中以空行分割的段变成一行。
:set sidescroll=#设置当wrap特性选项开启换行显示长行时,往侧面滚动#个字符。

翻屏

相对于屏幕,文本整体上下翻动。

  • CTRL-F向下翻一屏幕的文本
  • CTRL-B向上翻一屏幕的文本
  • CTRL-D向下翻半屏
  • CTRL-U向上翻半屏
  • CTRL-E向上翻一行
  • CTRL-Y向下翻一行
  • zz翻屏,直到当前行处在屏幕中央
  • zt翻屏,直到当前行处在屏幕第一行
  • zb翻屏,直到当前行处在屏幕最后一行

跳转

一般来说,只要一个命令就能把光标位置移动超过一行,这种行为就是跳转跳转的位置称为标记(mark),其中如果用了搜索,则不论搜索后光标移动的位置是否超出本行,都算跳转

无名有序标记

每次退出vim,vim都创建一个无名有序号的全局标记来记录当前文件当前位置,上一次退出vim时的位置为`0,上上次为`1,以此类推,共有10个。

命名标记

vim可以记录当前光标所在位置到vim预留的存储空间中,这些位置称为标记,用单个字母表示。

  • m{a-z}创建作用于当前文件标记,该标记记录当前位置。
  • m{A-Z}创建作用于所有文件标记,该标记记录当前文件的当前位置。
  • `a(反引号)跳转到名字为a标记点处。
  • 'a(单引号)跳转到名字为a标记点所在行的第一个非空白字符处。
  • :marks {mark}查看名为mark标记的位置;如果没有指定mark则是列出所有标记的位置。

修改文本

基本命令

正常模式下修改少量文本、字符的常用命令如下:

  • #d{motion}删除:当前光标所在处开始,直到motion后所处位置,其间的所有文本都删除掉,模式处于正常模式,例如:3d2w删除6个单词,既一次删除2个单词,但是删3次。
  • #c{motion}修改:当前光标所在处开始,直到motion后所处位置,其间的所有文本都删除掉,模式处于插入模式
    cw是个例外,因为是老vi遗留下的常用命令,所以这个命令不会删除最后的那个空白字符;dw删除最后那个空白字符)
  • #r{Char}替换:从当前光标开始第#个字符替换成Char,模式仍保留为正常模式,例如:3rn将当前光标开始的三个字符替换成n
  • R:进入替换模式,此时每输入一个字符,就会替换当前光标下对应的一个字符,直到按Esc结束。

有些操作符过于常用,所以vim专门给他们整一个单字符来表示:

  • J删除当前行的换行符,造成上下两行连接起来的效果
  • xdl删除当前字符。
  • Xdh删除一个字符。
  • dd删除当前行,包括换行符。
  • Dd$删除光标位置所在处到当前行最后一个字符,不包括换行符。
  • Cc$删除光标位置所在处到当前行最后一个字符,不包括换行符,并进入插入模式
  • scl删除当前字符,并进入插入模式
  • cc删除当前行整行,不包括换行符,并进入插入模式
  • Scc

撤销与重做命令如下:

  • u撤销上次编辑操作。
  • U执行一个新的操作,该操作就是把当前行恢复到最后一批次修改操作之前的状态,但并不是撤销操作。
  • CTRL-R重做上次被撤销的操作。
  • .重复上一次文本的修改命令;例如:先/four寻找单词four,再cwfive<Esc>替换fourfive,再n寻找下一个four,再.替换一下,再n寻找一下,再.替换一下。
  • ~将当前光标下的字符变为大写,并移动到下一个字符。

复制粘贴命令如下:

  • y复制文本;y#{motion}按照#次motion的距离,拷贝跨过的文本,例如:y2w拷贝两个单词。
  • yyY一样,拷贝一整行。
  • p把刚复制或删除的文本粘贴进来,如果之前复制或删除的是一行或几行,则粘贴到光标所在行的下一行;如果之前复制或删除的只是个字符串,则粘贴到光标所在字符之后。
  • P功能p只是粘贴方向是相反的。
  • xp可以迅速替换两个手误打出来的字符,例如:teh.
  • "*剪贴板操作"*yy将当前行的内容复制到剪贴板里,"*p将剪贴板里的文本粘贴到当前光标处。
文本对象

有些命令表示文本块,用于可视化模式,或在正常模式的修改文本命令中代替移动命令(motion)。
常用的文本对象命令有两类:

  • a{Char}表示带有前缀或后缀空白字符的一个文本对象。
  • i{Char}表示不带前缀或后缀空白字符的一个文本对象。

其中Char的常用种类如下:

  • w单词。
  • s一句文本。
  • p一段文本。
寄存器

vim可以保存一些临时的文本或宏命令到vim预留的存储单元中,将来可以用于粘贴文本或回放宏命令,这些存储单元称为寄存器。
寄存器一般用单个小写字母表示,当用大写字母时候表示追加内容到该寄存器。
"是将寄存器用于文本操作的命令:

  • "{reg}y{motion | text-object}motion移动跨过的文本或text-object文本对象表示的文本块拷贝到reg寄存器里,;例如:"ayw一个单词拷贝到a寄存器里。
  • "{reg}preg寄存器里的文本拷贝到当前光标所在位置。例如:"bpb寄存器里的文本拷贝到当前光标处。
  • "AY将当前行的文本追加到名为a的寄存器里。
  • "*特殊的寄存器:剪贴板"*yy将当前行的内容复制到剪贴板里,"*p将剪贴板里的文本粘贴到当前光标处。

宏是指共同完成一个操作的、有顺序的一系列命令。
宏存放在vim的寄存器里,也就是说寄存器里存放的文本可以当成文本来使用,还可以当成正常模式下的命令来用。
q是和宏有关的命令:

  • 录制宏,分三步:
    1. q{reg}指定名为reg的宏,并开始录制宏命令包含的各种操作;
    2. 各种vim命令;
    3. q结束宏命令操作的记录,保存宏。
  • #@q{reg}把名为reg的宏播放#次,既是将该宏包含的vim各种操作命令重复#遍。
  • @@播放上次使用的宏(播放就是使用)。
  • qA{cmd}qcmd表示的一系列操作步骤追加到名为a的寄存器里。例如:qA/the<Enter>q
顺手命令

许多零零散散的命令功能简单,但是非常顺手。

  • CTRL-A对光标所在的数字实体加一,nrformats特性选项来设置可识别的数字类型。
  • CTRL-X对光标所在的数字实体加一,nrformats特性选项来设置可识别的数字类型。
  • #>>当前行开始往下#行都缩进特性选项shiftwidth设置的列数。

折叠

折叠不影响文本内容,只是为了更好的显示文本,用一行的空间来显示一节内容,一节由若干行组成。
除非用在视图里保存起来,否则vim不会保存折叠信息。
折叠基本操作如下:

  • zf{motion | text-object}根据位移命令motion或文本对象text-object所涉及的行,创建一个折叠。
  • zd删除当前光标下的一层折叠。
  • zD删除当前光标下的所有折叠。
  • zc关闭当前光标下的文本一层折叠。
  • zC关闭当前光标下的所有层折叠。
  • zo展开当前光标下一层折叠。
  • z0展开当前光标下所有层折叠。
  • zr展开下一级的所有折叠。
  • zR展开所有级别的所有折叠。
  • zm关闭一个级别的所有折。
  • zM关闭所有级别的所有折叠。
  • zn禁用折叠。
  • zN启用折叠。
  • zi在禁用和启用折叠之间切换。

特性选项:
:set foldopen={options}设置自动打开折叠的方式option
:set foldclose={options}设置自动关闭折叠的方式option
:set foldmethod={option}设置自动折叠方法option,其取值如下:

  • indent根据缩进来自动创建折叠,缩进长度除以shiftwidth为缩进级别;:set foldlevel=#关闭第#及第#以上级别的所有折叠。
  • marker根据标记{{{}}}自动创建折叠,可以用计数标记{{{#}}}#定义折叠的级别。
  • Syntax根据语法插件中定义的折叠参数来自动创建折叠。
  • expr根据自定义的表达式来计算折叠及折叠级别;:set foldexpr={expression}
  • diff用于设置了diff特性选项的窗口,任何没有改变的文本都会被折叠。

g命令

正常模式中散碎分布着以g开头的命令:

  • gq{motion | text-object}motiontext-object所涉及到的文本行(不足一行按一行算)以textwidth指定的行宽进行格式化。
  • gU{motion | text-object}motiontext-object所表示的文本变大写。
  • gu{motion | text-object}motiontext-object所表示的文本变小写。
  • g~{motion | text-object}motiontext-object所表示的文本大小写反转。
  • guu将当前行的文本变小写。
  • gUU将当前行的文本变大写。
  • g~~将当前行的文本大小写反转。
  • g<CTRL-G>统计整个文件的单词。

插入模式

一般情况下,在vim中编辑文件是不停地在正常模式和插入模式之间进行切换,在插入模式输入文本,在正常模式进行移动、拷贝、复制、粘贴等修改文本操作。
从正常模式进入插入模式的方法如下:

  • i从光标所在字符之前的位置开始,进入插入模式
  • I从光标所在行第一个非空白字符处,进入插入模式
  • a从光标所在字符之后的位置开始,进入插入模式
  • A从光标所在行的最后一个字符之后的位置开始,进入插入模式
  • o从光标所在行的下方另起一行,并进入插入模式
  • O从光标所在行的上方另起一行,并进入插入模式

编辑命令如下:

  • <BS>删除光标前的一个字符。
  • <Del>删除光标后的一个字符。
  • CTRL-W删除光标前的一个单词。
  • CTRL-U删除本行开始到光标处的所有文本。
  • CTRL-A输入在上一次插入模式下输入的所有文本。
  • CTRL-Y输入当前光标位置上一行相同位置的字符。
  • CTRL-E输入当前光标位置下一行相同位置的字符。
  • CTRL-R {reg}输入reg寄存器里存放的文本。
  • CTRL-V {key}输入特殊字符keykey键盘上任何一个按键,也可以是十进制、八进制、十六进制数字所代表的特殊字符的ASCII值。
    • :set list^显示无法明显显示的字符,用\$表示换行符;
    • :set listchars=eol:$,tab:>-,trail:-设置用什么字符显示哪些不能明显显示的字符。
  • CTRL-K {digraph}输入合成符digraph,合成符是由两个字符表示的的特殊字符,无法用键盘上的一个键表示,例如:CTRL-K Co输入商标符号©
    • 合成符依赖于所使用的字符集,MS-DOS和MS-WINDOWS对应的字符集就不一样。
    • :digraphs列出所有合成符。
  • CTRL-O {command}在插入模式下执行正常模式下的命令command
  • CTRL-T在插入模式下插入一个shiftwidth那么长的空白字符;CTRL-D在插入模式下删除一个shiftwidth那么长的空白字符。
  • {abbr}<Space>插入预定义的、作用于插入模式的简写abbr展开后的文本。
    • :abbreviate列出所有的简写设置,插入模式的简写前有i作为前缀,命令行模式的简写有c做为前缀,两种模式都有效的简写有!作为前缀。
    • :abbreviate {short} {long}设置名为长文本long的简写为short,输入short会自动替换为long。
    • :unabbreviate {short}删除名为short的简写设置。
    • :abclear删除所有简写设置。
    • :iab只作用于插入模式下的简写,:cab只作用于命令行模式下的简写,:cunab:iunab:cabclear:iabclear同理。
    • :noreabbrev {short} {long}设置long的简写为short自动替换shortlong时,如果long中的字符有对应的映射,则不应用映射。
  • 补全:
    • CTRL-PCTRL-N自动根据上下文单词列表来补全单词,vim根据认根据如下列表来搜索补全单词:
    • 特定的补全
      • CTRL-X CTRL-F 文件名。
      • CTRL-X CTRL-L 整行内容
      • CTRL-X CTRL-D 宏定义(头文件中定义的)宏里的内容
      • CTRL-X CTRL-I 当前文件和当前文件包含的文件中的内容
      • CTRL-X CTRL-K 字典里的单词。
      • CTRL-X CTRL-T 同义词。
      • CTRL-X CTRL-] tag。
      • CTRL-X CTRL-V vim命令。
      • CTRL-X CTRL-O 代码中的智能补全,也称Omni completion, intellisense是其专利称呼,同时还需要一些配置,例如启用文件类型插件
    • :set complete={str}设置补全候选项的搜索顺序,例如::set complete=.,w,b,u,t,i

特性选项:

  • :set showmatch设置在插入模式下输入)}]时候,其对应的({[自动高亮显示,并且光标会自动跳转过去,然后再跳转回来。
  • :set matchtime=#设置showmatch选项的反应时间为#个100毫秒。
  • :set iskeyword=@,48-57,_,192-255设置哪些字符可以作为单词的一部分:
    • @表示所有字母。
    • 48-57表示ASCII字符48到57即0到9。
    • 192-255表示ASCII字符192到255即所有可打印的拉丁字符。

可视化模式

进入可视化模式方式

可视化模式下第一步就是选择需要编辑的文本,有三种方式:

  • v进入普通可视化模式,然后用motion位移操作选择范围;按o将光标切换到水平方向另一头。
  • V进入按行可视化模式,当前行立刻被选中,只有用motion位移操作移动超出本行之后,才会改变选择的文本范围;按o将光标切换到垂直方向另一头。
  • CTRL+V进入按块可视化模式,用motion位移操作选择范围,但最终只能选中一个长方形范围的文本;按o将光标切换到对角线另一头;按O将光标切换到水平方向另一头。

操作

中文本的基本范围后,可以进行的操作如下:

  • <Esc>取消选择,同时回到正常模式
  • d删除选中的文本,同时回到正常模式
  • $将可视化选择的文本块中的每一行都拓展到该行末尾,并且当上下移动时候也会认直接选中到新行的末尾,同时如果新行更短的化可能会选中以前没有选中的行;h停止$的这种选中到行尾的效果
  • I{string}<Esc>(仅仅适用于CTRL-V选中的文本)把输入字符串string插入到选择块中的每一行的选择开头处,块中包含着的空行和未选中的行不受影响。
  • A{string}<Esc>(仅仅适用于CTRL-V选中的文本)把输入字符串string插入到选择块中的每一行的选择结尾处,块中包含着的空行和未选中的行受影响:会插入空格保证结果string出现在每一行相同列。
  • c{string}<Esc>把输入字符串string替换选择块中的每一行的选中内容
  • C{string}<Esc>把输入字符串string替换选择块中的每一行的选中开始处到该行结尾处间的内容
  • ~选中内容大小写反转。
  • U选中内容变大写。
  • u选中内容变小写。
  • >选中内容右移一个shift位置。
  • <选中内容左移一个shift位置。
  • J选中内容包含的所有行变成一行,替换每一行的换行符、前置空白符和后置空白符为一个空格。
  • gJ选中内容包含的所有行变成一行,替换每一行的换行符,保留前置空白符和后置空白符。
  • gv重新进入可视化模式并选取上一次可视化模式下选取的文本。

命令行模式

命令行模式常用于保存、退出vim,设置、开关特新选项,执行vim特有的命令行命令等。

特性选项
命令行模式的最常用方面就是通过设置特性选项来配置vim。
特性选项有两种类型:

  • 有些选项类似于开关,只可开或关,一般加前缀no表示关闭该选项,例如::set hlsearch:set nohlsearch
  • 另有些选项需要在=后设置值,用逗号分隔,例如::set nrformats=alpha,octal,hex,bin

配置文件
作用于整个vim的特性选项和键盘映射关系一般都在一个名为vimrc的文件中,称为vim配置文件
:edit $MYVIMRC直接打开当前用户使用的vim配置文件
:version显示vim版本信息,其中”user vimrc file"部分指定的是当前用户使用的vim配置文件
如果创建新的vimrc文件,可以在定制vimrc文件前初始化vim,只需要在第一行添加代码source $VIMRUNTIME/defaults.vim

插件
插件就是一个vim脚本文件,以.vim作为文件后缀名,在标准插件目录下的所有插件脚本都会在vim启动时候自动被加载。
插件有两种类型:全局插件(适用于所有种类的文件)和文件类型插件(仅适用于某一种文件类型的插件)。
添加插件方法获取一份拷贝并且放到正确的目录下。
添加插件文档的方法:把帮助文本文件,例如:doit.txt,放到~/.vim/doc目录下,然后执行命令:helptags ~/.vim/doc。之后,就可以调用帮助命令查看文档了:help doit
全局插件的位置:

  • :$VIMRUNTIME/plugin
  • :$VIMRUNTIME/macros
  • :$~/.vim/plugin

文件类型插件的位置::$VIMRUNTIME/ftplugin。

移动

在命令行中,移动光标位置的方法如下:
CTRL-B光标移动到命令行首位。
CTRL-E光标移动到命令行末尾。
CTRL-W删除一个单词。
CTRL-U删除整行命令。
<BS>删除光标前一个字符。
<Insert>进入覆写模式,往后每个输入的字符都将替换原有字符,直到下一次按<Insert>键。
CTRL-C<Esc>取消执行命令,<Esc>是通用的取消命令,因此在命令行模式下也会取消执行命令,但是在老vi方式下,<Esc>会执行命令,所以最好用CTRL-C来取消命令。

简写

命令行模式下的命令可以用简写方式,该命令的第一个字符到全写之间的所有连续字符都可以是该命令的简写,例如用:s或者:su或者:sub来代替:substitute
命令行命令的简写同特性选项的简写对比:

  • 命令行命令的每一个简写只代表一个固定的命令,一个命令可以有许多种简写。
  • 选项的简写只有固定的一两种,一般就是构成选项的每个单词的首字母,例如:ai就是autoident的简写。
  • 命令行命令的具体某个简写代表哪个命令,需要强记。

补全

<Tab>自动补全命令。
CTRL-P以相反顺序自动补全。
CTRL-D将候选内容独自列在某一行。
CTRL-L自动补全为最长的候选项。
:set wildmenu表示在用<Tab>键来补全命令时候,如果可能的命令多于一个,就在倒数第二行显示所有可能的命令。

历史

vim中有4中历史:/?:等。
:history显示命令行模式中的历史。
:history /显示/?搜索的历史命令。
:set history=#指定vim保存的历史命令的个数和历史搜索模式的个数。例如::set history=200
CTRL-P命令行模式下前一个命令。
CTRL-N命令行模式下后一个命令。

命令行窗口

在正常模式下按q:打开命令行窗口,窗口中只显示曾经执行过的命令。
<Enter>执行当前光标所在行的命令,并退出命令行窗口。
修改命令行窗口的命令并不会修改真正的命令行历史,只是临时显示修改后的命令,方便执行罢了。

顺手的特性选项

一些零散、顺手的特性选项:

  • 在设置vim配置选项时,加上&在选项后可以将其重新设置为认值。例如::set iskeyword&
  • :set backup使得在重写文件时候,让vim自动保存一个同名且带“~”前缀的备份。
  • :set undofile会在当前文件中保存多层级的撤销信息,使得关闭再打开文件后可以撤销关闭文件前的修改
  • :autocmd FileType text setlocal textwidth=78当一行的文本长度达到78列时候,自动换行;这个命令包含两部分:
    • autocmd FileType text一个autocommand,意思是当文件类型被设置为text之后,执行后面的命令。
    • set local textwidth=78就是被自动执行的命令,。
  • :set ruler表示永远再右下角显示当前光标的位置。
  • :set display={"" | truncate | lastline | uhex}指定当屏幕的最后一行无法完全显示的时候,如何显示
    • truncate用@@@显示在最后一行表示还有部分没有显示完全;
    • lastline用@@@显示在最后一行最后三列来表示
  • :map列出所有的命令映射。
  • :options打开一个新的窗口,一行一个地解释vim配置选项。
  • :set whichwrap=b,s,<,>,[,]设置移动光标时候允许移动到上一行末尾或下一行开头:
    • b表示backspace。
    • s表示空格键。
    • <>表示左右箭头键。
    • []表示插入模式下的左右箭头键。
  • :set cmdheight=#设置在vim下方用#行显示消息,会挤占编辑区的空间,所以这是个需要妥协各个功能需求的选项。

专题

搜索与替换

vim中的搜索可以在正常模式下进行也可以在命令行模式下进行,语法一样。

字符搜索

一次只搜索一个字符,有四种方式:

  • f<Char>向后搜索指定字符,只搜索当前行,光标停在指定字符的开始位置。
  • t<Char>向后搜索指定字符,只搜索当前行,光标停在指定字符的前一个字符的开始位置。
  • FT功能类似,只是方向是向前搜索
  • [#]<f|F|t|T><Char>指定搜索第几个字符。
  • %搜索当前行当前光标位置开始第一个括号,及其匹配的括号;括号认只包括三种:大括号{}、中括号[]和小括号()
单词搜索

一次只搜索一个单词:

  • [#]*向后搜索光标位置所在的单词,并跳转到第#次出现的地方。
  • g*文本匹配;用#代替*,表示往前搜索光标位置所在的单词。
文本搜索

搜索任意文本,用正则表达式表示搜索模式:

  • /<pattern>从光标位置开始,往后搜索字符串pattern:
    • 偏移:
      • /{pattern}/#将光标移动到匹配所在行向下第#行。
      • /{pattern}/e#将光标移动到匹配字符串最后一个字符向后第#列。
      • /{pattern}/b#将光标移动到匹配字符串第一个字符向后第#列。
    • pattern中的正则表达式符号,只作用于其前面一项,该项可以是一个字符,例如:a;也可以是用括号括起来的组合,例如:(cd)
      • \<表示单词开始。
      • \>表示单词结束。
      • ^表示一行开始。
      • $表示一行结束。
      • \c表示大小写不敏感。
      • \C表示大小写敏感。
      • 特殊字符需要加\前缀来转义,例如:\.\*;特殊字符有:.*[]^%/\?~$(数字键2790以外的数字键)。
      • {item}\*item可以出现0到无数次,例如:/ab\(cd\)\*
      • {item}\+item可以出现1到无数次,例如:/ab\(cd\)\+
      • {item}\=item可以出现0或1次,例如:/ab\(cd\)\=
      • {item}\{n,m}item可以出现n到m次,n认为0,m认为*;例如:/ab\(cd\)\{2,5}
      • {item}\{#}item只出现#次;例如:/ab\(cd\)\{2}
      • {item}\{-n,m}item可以出现n到m次,按最小次数算匹配,n认为0,m认为*;例如:/ab\(cd\)\{-2,5}efg
      • {item}\{-}item可以出现0到无数次,按最小次数算匹配;例如:/ab\(cd\)\{-}efg
      • {item1}\|{item2}item1和item2任何一个
      • {item1}\&{item2}item1和item2必须都匹配。
      • []表示一个字符,其取值范围在中括号中指定。
        • [abcdefg]一个字符的取值为abcdefg中的任何一个
        • -构成的连续字符串集合,例如:0-9,a-z
        • -符号放在中括号里第一个或最后一个表示这个减号字符。
        • ^在中括号里第一个位置表示除了中括号里的字符集合以外的任何字符,例如:/[^abcdefg0-9-]
        • 可以用在中括号里的特殊字符(集合):
          • \e表示<Esc>
          • \t表示<Tab>
          • \r表示<CR>
          • \b表示<BS>
      • 特殊字符(集合):
        • \d表示个位数字字符;[0-9]
        • \D表示非个位数字字符;[^0-9]
        • \x表示十六进制个位数字字符;[0-9a-fA-F]
        • \X表示非十六进制个位数字字符;[^0-9a-fA-F]
        • \s表示空白字符,既<Tab><Space>
        • \S表示非空白字符。
        • \h表示可作为变量单词首字符的字符;[a-zA-Z_]
        • \w表示可作为变量单词非首字符的字符;[0-9a-zA-Z_]
        • \l表示小写字母字符;[a-z]
        • \L表示非小写字母字符;[^a-z]
        • \u表示大写字母字符;[A-A]
        • \U表示非大写字母字符;[^A-Z]
        • \i可作为标识符的字符,同选项isident
        • \I可作为标识符的字符,数字字符除外。
        • \k可作为关键字的字符,同选项iskeyword
        • \K可作为关键字的字符,数字字符除外。
        • \p可打印的字符,同选项isprint
        • \P可打印的字符,数字字符除外。
        • \f可作为文件名的字符,同选项isfname
        • \F可作为文件名的字符,数字字符除外。
      • 换行符
        • \n表示换行符字符。
        • \_表示z在特殊字符集合中加上换行符,其构成规则类似于在\之后加上_;例如:\_s表示空白字符和换行符。
  • ?类似/,只是方向上是从光标处往前搜索
  • n跳转到下一个搜索匹配点,N跳转到上一个搜索匹配点。
  • /之后,通过上下键可补全历史搜索命令。
搜索选项:

vim提供一些专供搜索的特性选项:

  • :set ignorecase设置vim搜索时,忽略大小写
  • :set hlsearch设置vim搜索时,高亮显示搜索到的文本
  • :set incsearch设置vim搜索时,敲击回车键前,一边输入搜索字符串,一边高亮显示搜索匹配结果
  • :set wrapscan设置vim搜索时,如果搜索文件末尾了,接着从文件头开始继续搜索
  • :set smartcase设置如果搜索的模式字符串中全是小写字符,那么被匹配的字符串可以包含一个或多个大写字符;例如:搜索word可以匹配word, Word, WORD,但是搜索Word只能匹配Word
  • :set showcmd表示在右下角显示未完成的命令。例如,正常模式下输入f,右下角会显示f,再输入e,右下角的f会消失。
替换

替换只能在命令行模式下执行:
:[range]substitute/from/to/[flags]搜索并替换文本。

  • substitue可以用s简写代替。
  • range指定替换命令的作用范围:
    • 省略的话就是只作用于当前行。
    • %表示整个文件,例如::%s/the/these/
    • {#1},{#2}表示当前文件的第#1行到第#2行。
    • #表示当前文件的第#行。
    • .表示当前行。
    • $表示最后一行。
    • 用正则表达式 {pattern-sep-1}{pattern-1}{pattern-sep-1},{pattern-sep-2}{pattern-2}{pattern-sep-2}表示range:
      • 开始行在当前行以前,用pattern-1搜索到的第一处匹配点所在行。
      • 结束行在开始行以后,用pattern-2搜索到的第一处匹配点所在行。
      • pattern-sep-1pattern-sep-2是模式匹配分隔符,不能相同。
      • 例如:?^Chapter?,/^Chapter/s=grey=gray=g
    • range+#表示range行往下#行;range-#表示range行往上#行。例如:.+2,$-10 s/View/Graph/g
    • {mark1},{mark2}表示mark1mark2的两个标记的位置之间。例如:'t,'b
    • '<表示最近一次可视化选择范围的开始位置(所在行);'>表示最近一次可视化选择范围的结束位置(所在行)。
  • from指定被替换的文本或正则表达式,例如:s/^the/these/
  • flags指定替换命令的效果
    • 省略的话表示如果某一行出现了两个from的话,只替换第一个fromto
    • g表示如果某一行出现了两个from的话,两个from全部替换成to
    • p表示输出最后替换的那一行到状态栏。
    • e表示没有找到from不是错误
    • c表示每一次替换都提示,要求指定下一步操作(y/n/a/q/l/^E/^Y)
      • y: Yes,替换本次。
      • n:No,本次不替换。
      • a:All,以后的每一次都替换,且不要再提示了。
      • q:这一次也不替换了,而且以后不再继续以后的替换。
      • l:这次是最后一次替换,而且以后不再继续替换了。
      • CTRL-E:向上翻一行。
      • CTRL-Y:向下翻一行。
技巧

利用搜索与替换来快速编辑文本的技巧:

  • 用反向引用来给特定文本换位置,例如:%s/\([^.]*\), \(.*\)/\2 \1/g可以将Last, First变成First Last
  • :{range}move #range范围内的行移动到第#行。
  • 删除后置空白字符:%s/\s\+$/
  • :[range]global/{pattern}/{command}range范围内,对于能匹配到pattern的行,应用命令模式下的命令command,例如::g+//+s/foo/bar/g

缩进和制表键

一系列特性配置专门用于设置缩进和<Tab>键的处理上

  • :set autoindent自动缩进,使得新行按照上一行的缩进标准而缩进。
  • :set shiftwidth=#使用>来进行缩进时候缩进的列数。
  • :set tabstop=#设置<Tab>最长为#列那么长,光标当前位置到下一个最小#倍列之处用<Tab>代替。
  • :set softtabstop=#设置按下<Tab>键的时候,光标移动最长为#列那么长,当前光标位置到下一个最小#倍数列之处用空白字符串填充,空白字符串根据tabstop由相应个数的<Tab>和空格字符组成。
  • :retab #重新设置tabstop为#,并修改各个空白字符串中的<Tab>个数,使得其看起来并没有变化;注意,代码中用到<Tab>的地方也会变,但是\t不受影响。

语法高亮

语法高亮相关的特性选项可以有区别得高亮显示不同编程语言的关键字、常量、符号等。

格式化文本

为了方便浏览和打印,vim提供一系列特性选型:

  • :set textwidth=#强制在第#个字符之后插入一个换行符。
  • :set virtualedit=all启动虚拟空间编辑模式,此时光标随意动,每当插入字符时,vim会自动填充空格字符使得插入的字符就在光标位置处。
  • :set virtualedit=关闭虚拟空间编辑模式。
  • :[range] center [width]按照width长度,将range包括的文本居中对齐;如果没有指定width,就按照textwidth来办。
  • :[range] right [width]按照width长度,将range包括的文本右对齐;如果没有指定width,就按照textwidth来办。
  • :[range] left [margin]range包括的文本左对齐,留有margin长的边缘宽度。
  • _j将在可视化模式下选中的文本两边对齐,但是该功能不是vim内置功能,而是在justfiy脚本中实现,:packadd justify或者在vimrc中添加packadd! justify加载两边对齐脚本。

缓存

vim打开的文件在vim中会保留其一个副本,称为缓存。
缓存除了包含文件内容,同时还包含了该文件相关的标记、特性设置等各种东西。

状态

缓存有三种状态:

  • Active  :活动缓存,在某个窗口中显示,vim加载了其文本。
  • Hidden:隐藏缓存,不在窗口中显示,vim加载了其文本。
    :hide edit {filename}隐藏当前正在编辑的文件,不保存正在编辑的文件缓存,并在当前窗口中打开filename文件
  • Inactive:失效缓存,不在窗口中显示,vim也没有加载其文本。
    处于失效状态的缓存,vim仍然保存其一些信息,例如:缓存的文件名、标记
操作

缓存有如下基本操作:

  • :buffers或者:ls列出缓存列表,缓存列表有若干标志,如下所示:
    • u     不被列出的缓存,其不在正常的缓存列表中。
    •  %    当前缓存。
    •  #    替代缓存。
    •   a   缓存加载并被显示
    •   h   缓存加载但被隐藏。
    •    =  缓存只读。
    •    -  缓存不可修改,其modifiable选项被关闭
    •     + 缓存已经被修改了。
  • :e[dit][!] {filename}打开filename文件,同时放弃当前缓存的任何未保存的修改,如果没有!修改了当前缓存,但是并没有保存修改,这时则不打开文件,同时提示修改没有保存。
  • :w[rite] [filename]将当前缓存另存为filename文件,如果没有指定filename则保到创建缓存时磁盘上对应的文件
  • :b[uffer] #在当前窗口中切换第#号缓存。
  • :bprevIoUs在当前窗口中切换上一个缓存。
  • :bnext在当前窗口中切换下一个缓存。
  • :bfirst在当前窗口中切换第一个缓存。
  • :blast在当前窗口中切换最后一个缓存。
  • :bdelete #将第#号缓存从缓存列表中删除,使其变为不被列出的缓存,但是vim仍然保存该缓存的一些信息,只能通过:buffers!显示
  • :bwipe #将第#号缓存彻底从vim中删除,vim不保存该缓存的任何信息。
vim命令行中指定的文件列表

vim命令行中指定的文件列表保存在args特性选项中,文件名用逗号隔开:

窗口

缓存中的文件可以在多个窗口中显示出来。

  • vim -o one.txt two.txt three.txt在vim中打开三个文件,并将每一个文件显示在独立的一个窗口中,窗口高度等分屏幕高度。
  • vim -O one.txt two.txt three.txt在vim中打开三个文件,并将每一个文件显示在独立的一个窗口中,窗口宽度等分屏幕宽度。
  • CTRL-W w在多个窗口之间跳转
  • CTRL-W <h | j | k | l | t | b>光标移动到左/下/右/上/左上/右下边窗口。
  • CTRL-W <K | H | J | L>将当前窗口移动到最上/右/下/左边窗口,同时宽度或高度占满整个屏幕。
  • [#]CTRL-W +当前窗口的高度增加#行,没有指定#时候只增加1行。
  • CTRL-W -当前窗口的高度减少#行,没有指定#时候只减少1行。
  • [#]CTRL-W _当前窗口的高度变成#行,没有指定#时当前窗口高度为一行。
  • CTRL-W CTRL-^创建新的窗口,在新的窗口中显示缓存中别的文件
  • :[#] split [filename]在当前屏幕的上方新创建一个窗口来编辑名为filename文件,这个新窗口有#行那么高,光标落在新窗口上:
    • 如果没有#则新窗口占当前窗口高度的一半。
    • 如果省略filename则两个窗口都显示当前文件内容
    • 如果窗口多于两个,并且没有指定#时候,新创建窗口后,所有窗口都会平分当前屏幕的高度。
  • :vsplit类似:split,不同的是,新窗口创建在屏幕左边,而不是上面。
  • :close关闭当前窗口,但是不会退出vim。
  • :only关闭其它窗口,只保留当前窗口。
  • :new在屏幕上侧创建新的窗口,不打开任何文件
  • :vnew在屏幕右侧创建新的窗口,不打开任何文件
  • :qall关闭所有窗口并退出vim,等同于:quit all
  • :qall!不保存地强制退出
  • :wall把所有窗口中对应的文件都保存。
  • :wqall保存所有窗口文件退出
  • :all将vim命令行参数里指定的文件显示出来,一个文件一个窗口。
  • :set winheight=#指定所期望的最小的窗口高度为#行。
  • :set winminheight=#硬性规定最小的窗口高度为#行。
  • :set equalalways指定新创建窗口时,所有窗口平分当前屏幕高度。
  • :set splitbelow设置vim认的新窗口创建位置为当前窗口下方;:set splitright设置vim认的新窗口创建位置为当前窗口右方。
  • :leftabove {cmd}或者:aboveleft {cmd}新窗口创建位置在当前窗口左上方。
  • :rightbelow {cmd}或者:belowright {cmd}新窗口创建位置在当前窗口右下方。
  • :topleft {cmd}新窗口创建位置在vim显示屏的顶部或左部。
  • :botright {cmd}新窗口创建位置在vim显示屏的底部或右部。
标签

缓存中的文件可以在多个标签页中显示出来。

工作目录

vim,vim中的窗口,vim中的tab都有自己的工作目录。
认情况下,窗口和tab使用vim的工作目录,特殊情况下也可以为窗口和tab设置自己的工作目录。
:cd {directory}修改vim的工作目录为directory,同时摒弃当前窗口或tab自己的目录,使用vim的工作目录,。
:lcd {directory}修改窗口的工作目录为directory,不再使用vim或tab工作目录。
:tcd {directory}修改tab的工作目录为directory,不再使用vim或窗口目录。

文件对比

vim提供一种特殊的文件对比视图专门用于对比文件

  • vimdiff {file1} {file2}用比较模式对比两个文件文件的不同点由不同颜色高亮表示出来,大片内容相同的文本行被折叠。
  • :vertical diffsplit temp.txt~是在vim内部用对比模式对比文件
  • zo打开折叠的文本行。
  • zc关闭折叠的文本行。
  • ]c跳转到下一个有不同内容的行。
  • [c跳转到上一个有不同内容的行。
  • :diffupdate更新高亮显示修改后的两个文件,使得修改后的效果可以显示
  • :dp当前光标所在文本块的内容不同时,将不同的文本块从当前窗口放置到另一窗口,并替换掉另一窗口中原有内容
  • :do将不同文本块从另一窗口放到当前窗口,并替换掉当前窗口原有的内容
批量修改

缓存中的文件可以按照不同分类方式,统一执行各种vim内部命令来批量修改文件

  • :argdo {command}在所有args文件列表中的文件中执行command命令用,例如::argdo %s/print/000000/ge | update
  • :windo {command}在所有窗口中打开的文件中执行command命令。
  • :bufdo {command}在所有缓存中的文件中执行command命令。

vim协同操作

vim可以同操作系统的其他命令或功能结合起来,协同完成一系列任务。

  • CTRL-Z或者:suspend挂起vim,但只是将vim放到后台,并不是退出vim。
  • fg恢复被挂起到后台的vim。
  • vim -r {filename}自动检测并恢复上次崩溃的文件
  • vim -R {filename}以只读模式用vim打开名为filename文件,如果试图修改会有警告信息,但是仍然可以修改却不能保存。
  • vim -M {filename}以只读模式用打开名为filename文件,同时禁止修改和保存。
  • :set modifiable允许修改该缓存。
  • :set write来允许保存该缓存。
  • :set autowrite让vim自动保存每次对文件修改
  • :w!来强制保存当前缓存的修改
  • :saveas {filename}将当前文件的缓存重命名filename,同时也会在文件系统上创建该文件,不会影响操作系统上的原文件
  • :file {filename}将当前文件的缓存重命名filename,只有当用:w保存后才会创建该文件,不会影响操作系统上的原文件
shell命令

在vim的命令行模式中可以执行操作系统的命令。

  • :!{program}执行操作系统中的program程序或命令。
  • :r !{program}执行program并把输出插入下一行。
  • :w !{program}将当前文档作为·program·的输入,并执行·program·。
  • :[range]!{program}range范围内的文本作为program的输入,执行program,并将输出替换range范围内的文本。
  • :shell挂起当前vim,并新开一个shell。
  • :[range]read {filename}filename文件里的内容复制到当前缓存的range处,range为0时候,复制到第一行(大多数命令不接受0作为行号),例如::10r temp
  • :{range}write {filename}将当前缓存的range范围内的文本写入filename文件中去。
  • :{range}write! {filename}将当前缓存的range范围内的文本强制覆盖式写入filename文件中。
  • :{range}write >> {filename}将当前缓存的range范围内的文本追加而不是覆盖到filename文件中。
  • :!{motion}{program}motion所跨过的文本传给名为program的外部命令,并将program产生的输出替换掉这些文本;例如:!5jsort
  • :!!{program}将当前行传给外部命令program,并将program产生的输出替换当前行;例如:!!date
  • :[range]read !{program}program执行的结果复制到range指定行(没有range就是指当前行的下一行);例如::0read !ls
  • :{range}write !{program}range指定范围内的文本作为参数传给外部命令program,并将结果显示在状态栏;例如:.,.+1write !wc
shell脚本

为了方便自动化,可以在shell脚本中使用vim及其命令脚本来修改文件

  • 在vim脚本中用命令行模式的命令
    vim -e -s {filename} < {script}script脚本文件中的vim命令行模式下的命令来编辑filename文件-e表示vim用命令行模式编辑文件-s(在有-e的时候)表示没有任何提示
  • 使用vim编辑标准输入的文本
    ls | vim -S {script} -script脚本中的vim命令编辑标准输入的文本;-S指定脚本;最后的-表示使用标准输入作为输入。
  • 在vim脚本中用正常模式的命令
    • vim -s {script} {filename1}...script脚本中的vim正常模式下的命令来编辑filename1文件-s(在没有-e时候)指定vim脚本文件,该文件包含vim正常模式下的命令,注意其中<Enter>表示向下移动一行。
    • vim -w {script} {filename}编辑filename文件,并将所有用到的、正常模式下的命令追加保存到script脚本中。
    • vim -W {script} {filename}编辑filename文件,并将所有用到的、正常模式下的命令全新保存到script脚本中。
viminfo

viminfo文件会记录如下信息:

每一次退出vim的时候,vim就会保存这些信息到viminfo文件中,并在下一次启动vim时候恢复这些信息。
:set viminfo={string}配置viminfo要保存的内容string,其格式是逗号分隔开的选项/参数对:

  • '指定为多少个文件保存标记(小写的字母 a 到 z )。
  • f指定是否保存全局标记(0-9和A-Z);0为不保存,1或者不指定 f 为保存。
  • <指定每一个寄存器能够保存多少行文本;0为不保存文本。
  • :指定保存多少行命令模式下的命令行命令。
  • @指定保存多少行输入命令(输入行命令是啥?)。
  • /指定保存多少行搜索命令。
  • !指定保存多少个全局变量(大写字母开始,但并不包含小写字母)。
  • h搜索时不高亮显示
  • %保存缓存列表,当启动vim而不给文件名时非常有用。
  • n指定viminfo的名字(如果有此选项,必须放在最后一个)。

:set viminfo='100,<50,s50,h
:oldfiles显示之前打开过的文件列表,接着:e #<2打开并开始编辑列表中第2个文件:browse oldfiles结合前两个功能
:wviminfo[!] {filename}将当前viminfo信息【以覆写方式而非合并方式】保存在文件filename中。
:rviminfo[!] {filename}将名为filename的viminfo【以覆写方式而非合并方式】文件读入。

会话

vim会话保存当前正在编辑的所有信息,包括但不限于:文件列表、窗口布局、全局变量、选项特性等。
:set sessionoptions={string}配置会话中应该保存的信息为string,其格式是用逗号分割开的项目集合:

  • blank保存空白窗口。
  • buffers保存所有的缓存,并不仅仅是某一个窗口的缓存。
  • curdir当前目录。
  • folds所有的折叠,包括手动创建的那些。
  • help帮助窗口。
  • options所有的选项特新。
  • tabpages所有的tab。
  • winsize所有的窗口的大小。
  • terminal终端窗口。

:mksessoin[!] {filename}将当前vim会话信息【以覆写方式而非合并方式】保存为名为filename文件
:source[!] {filename}【以覆写方式而非合并方式】读入并恢复名为filename的会话信息文件
vim -S {filename}启动vim并恢复名为filename的会话信息文件

当临时去编辑另一个项目时候,可以用如下命令来保存所有文件,保存会话,最后切换会话:

:wall
:mksession! secret.vim
:source boring.vim

会话不保存viminfo中的标记位置、寄存器内容和命令行历史,可以将两者结合起来:

:mksession! secret.vim
:wviminfo! secret.viminfo
:source boring.vim
:rviminfo! boring.viminfo
视图

视图只保存当前窗口当前文件的外观信息,来以自己喜欢的方式编辑某一个文件
视图有两种使用方式:

  1. 让vim为视图选名字
    :mkview [#]创建当前窗口当前文件的视图,#为1到9的个位数字表示第#种视图;可以忽略#,此时为认的视图。
    :loadview [#]加载当前文件的视图,#为1到9的个位数字表示第#种视图;可以忽略#,此时为认的视图。
    :set viewdir={dir}设置认的保存视图的目录为dir。
  2. 自己手动为视图选名字
    :mkview {view.vim}创建当前窗口当前文件的视图,名为view.vim。
    :source {view.vim}加载名为view.vim的视图。
其他类型的文件

DOS,MAC和Unix文件
早期打字机时代,新起一行用两个字符:<CR>回车,表示回到行首;<LF>换行,表示下移一行。

  • 计算机早期,内存珍贵,人们觉得两个字符表示新起一行浪费,不同的系统有不同的改进办法:
    • Unix系统用<LF>代表新行。
    • Mac系统用<CR>代表新行。
    • Dos系统继续沿用原来的<LF><CR>代表新行。
  • :set fileformats={os}设置vim依次尝试使用逗号分割的格式列表,os的值只有三种:unix,doxmac,例如::set fileformats=unix,dos
  • :set fileformat={os}强制转换当前文件缓存的格式为os认情况下vim会自动检测文件格式,并将结果保存在fileformat选项中。
  • :set ++ff={os} {filename}临时一次性使用os格式打开编辑filename文件

加密文件

二进制文件

  • vim -b {filename}以二进制方式打开filename文件
  • :set display=uhex用16进制显示不可打印字符。
  • :%!xxd转换二进制文件,用两列分别显示二进制文件内容,16进制和ASCII字符。
  • :%!xxd -r从两列显示模式恢复为原来的二进制文件

压缩文件
vim内置gzip插件,在编辑压缩包中的文件时,自动利用相应的压缩解压缩工具来根据情况执行压缩或解压缩操作。

Netrw文件浏览器

Netrw是vim自带文件管理器。

  • :edit {directory}或者:Explore {directory}调用Netrw文件管理器来显示directory目录。
  • <Enter>在当前窗口打开光标所在文件,或者进入光标所在目录。
  • -返回上一级目录。
  • o在当前窗口上方新创建窗口来显示当前光标下的文件,并将光标定位在新窗口。
  • v在当前窗口右方新创建窗口来显示当前光标下的文件,并将光标定位在新窗口。
  • p在当前窗口下方新创建窗口来预览当前光标下的文件,光标仍在当前窗口。
  • P在前一个窗口来编辑当前光标下的文件,光标移动到前一个窗口。
  • i以不同方式列出Netrw工作目录下的目录和文件,方式有thin, long, wide和tree四种。
  • s以不同方式排序Netrw工作目录下的目录和文件,排序方式有按名称,按修改时间,按大小和按后缀名四种。
  • r以于s相反的顺序排序。
  • R重命名当前光标下的文件或目录。
  • D删除当前光标下的文件或目录。

C语言支持

vim针对C语言提供了许多的支持

标签

标签tag记录了定义一个标识符的位置,vim可以利用一个名为tags的文件记录,使用其中的一系列tag来进行跳转

  • ctags *.c在当前目录下,用Excuberant ctags生成tags文件
  • ctags -R .Excuberant ctags遍历当前目录及各级子目录,生成一个大的tags文件
  • :tags显示tag跳转的位置列表。
  • :tag跳转:tags列表中第一个位置。
  • :tag {identifier}根据tags文件,查找并跳转到定义identifier的位置。
  • :tag /{pattern}在tag名前加上/表示按照该tag名为一个搜索模式,按照这个模式来搜索并选择tag。
  • :stag {tagname}分裂当前窗口,并在新窗口中跳转到tagname的定义位置,CTRL-W ]有同样功能
  • :set tags={pathlist}设置vim寻找tag时用的tags文件列表,用逗号分隔开,用**表示通配任何中间目录。
  • :tfirst:#tprevIoUs#tnexttlast在匹配的tag列表中跳转
  • :ptag {tagname}在预览窗口中查看名为tagname的tag。
  • :pclose关闭预览窗口。
  • :psearch {tagname}搜索tagname并显示在预览窗口。

跳转

vim中做了许多映射来表示C语言的各种语法结构来方便跳转

  • CTRL-]根据tags文件,查找并跳转到当前光标所在单词的定义位置。
  • [#跳转到C语言的预定义开始处。
  • ]#跳转到C语言的预定义结束处。
  • [[跳转到最外层的代码块开始处。
  • ]]跳转到最外层的代码块结束处,代码块以第一列为{}为准。
  • [{跳转到当前代码块开始处。
  • ]}跳转到当前代码块结束处,代码块以第一列为{}为准。
  • [(跳转到当前小括号开始处。
  • ])跳转到当前小括号结束处。
  • [/跳转到当前/*形式的注释开始处。
  • ])跳转到当前/*形式的注释结束处。
  • gD在全局(当前文件,当前文件包含的文件等)中寻找当前光标下的单词表示的变量。
  • gd寻找局部变量。
  • gf查找并打开当前光标下指定的文件认情况下,vim只支持C语言风格的文件查找。
  • :set path={directory}设置vim在directory中查找文件,例如::set path=.,/usr/include,,
  • :set isfname={format}设置文件名字符的模式为format字符串,例如::set isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=

编译

在vim中可以执行特定的编译命令:

  • :make执行由makeprg特性选项定义的编译程序及其参数。
  • :next跳转到下一处错误点;:cprevIoUs跳转到上一处错误点。
  • :cc展开当前出错点的出错信息。
  • :clist列出所有重要的(即有文件名和行号)编译错误:clist!列出所有编译错误
  • :colder选择上一次编译出错列表;:cnewer选择下一次编译出错列表。
  • :set errorformat={format}定义当前编译器出错信息的所有格式。
  • :compiler {name}使用名为name的编译器脚本里所定义的编译器、出错格式等;例如::compiler msvc

格式化文本

vim中针对C语言的语法提供了一些顺手的格式化功能

  • :set cindent使用C风格的缩进。
  • ={motion}将motion跨过的文本行或motion表示的文本对象按照C风格的方式缩进;例如:=a{缩进当前代码块。
  • :set cinoptions={format}按照format方式缩进;例如::set cinoptions+={2
  • gq]/格式化光标当前处到注释结尾之间的文本。
  • :set comments={format}设置识别注释的语法格式,format为用逗号分隔的标记/文本对,标记和识别文本之间用冒号分隔。
    • 例如::set comments=s1:/*,mb:*,ex:*/
      • s表示注释开始部分,1表示中间部分有1个列的位移距离。
      • /*表示注释开始的识别文本。
      • m表示注释中间部分。
      • b表示注释中间部分识别文本之后有一个空白字符防止将*pointer识别为注释。
      • e表示注释结束。
      • x表示vim自动*之后插入一个空格之后,再输入/删除该空格。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐