vim帮助文档总结3-高级部分

命令行模式下编辑

基本

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

简写

命令行模式下的命令可以用简写方式,该命令的第一个字符到全写之间的所有连续字符都可以是该命令的简写,例如用:s或者:su或者:sub来代替:substitute;但是每一个简写只代表一个固定的命令。
具体某个简写代表哪个命令,需要强记。
选项的缩写只有一两种,一般就是构成选项的每个单词的首字母,例如:ai就是autoident的简写。

自动补全

<Tab>自动补全命令;CTRL-P以相反顺序自动补全。
CTRL-D将候选内容独自列在某一行。
CTRL-L自动补全为最长的候选项。

历史

vim中有4中历史:/?:等。
:history显示命令行模式中的历史。
:history /显示用/?来搜索的历史命令。
CTRL-P命令行模式下前一个命令;CTRL-N命令行模式下后一个命令。

命令行窗口

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

vim协同操作

CTRL-Z或者:suspend挂起vim,但只是将vim放到后台,并不是退出vim;fg恢复vim。

shell命令

:!{program}执行program。
:r !{program}执行program并把输出插入下一行。
:w !{program}将当前文档作为program的输入,并执行program。
:[range]!{program}将range范围内的文本作为program的输入,执行program,并将输出替换range范围内的文本。
:shell挂起当前vim,并新开一个shell。

viminfo

viminfo文件会记录如下信息:

  • 命令行和搜索历史
  • 寄存器里的文本
  • 多个文件中的标记
  • 缓存列表
  • 全局变量

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

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

viminfo的值的例子::set viminfo='100,<50,s50,h
`0跳转到上次vim退出前的位置;`1跳转到上上次vim退出前的位置。
每次退出vim,vim都创建一个全局标记来记录当前文件当前位置,最近一次的位置为`0,之前的`0变成了`1,以此类推,之前的`9被丢弃。
:oldfiles显示之前打开过的文件列表,接着:e #<2打开并开始编辑列表中第2个文件;:browse oldfiles结合前两个功能。
wviminfo[!] {filename}将当前viminfo信息【以覆写方式而非合并方式】保存在filename中。
rviminfo[!] {filename}将名为filename的viminfo【以覆写方式而非合并方式】文件读入。

会话

vim会话保存当前正在编辑的所有信息,包括但不限于:文件列表、窗口布局、全局变量、选项特性等。
:set sessionoptions={string}用string文本来配置会话中应该保存哪些信息,默认的sessionoptions文本为:

  • 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的视图。

文件

Netrw文件浏览器

:edit {directory}或者:Explore {directory}调用vim自带的Netrw文件管理器来显示名为directory的目录。
Netrw文件管理器的功能:

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

工作目录

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

寻找文件

gf查找并打开当前光标下指定的文件;默认情况下,vim只支持C语言风格的文件查找。
:set path={directory}设置vim在directory中查找文件,例如::set path=.,/usr/include,,
:set isfname={format}设置文件名字符的模式为format字符串,例如::set isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=

缓存

vim中缓存就是所编辑的文件的一个副本,同时还包含了文档的内容、标记、设置等各种东西。
保存文件就是把缓存保存到磁盘上的文件中。
:hide edit {filename}隐藏当前正在编辑的文件,不保存正在编辑的文件缓存,并在当前窗口中打开编辑名为filename的另一个文件。
vim中缓存有三种状态:

  • Active  :在某个窗口中显示,vim加载了其文本。
  • Hidden:不在窗口中显示,vim加载了其文本。
  • Inactive:不在窗口中显示,vim也没有加载其文本。

处于失效状态的缓存,vim仍然保存其一些信息,例如:缓存的文件名、标记。
:buffers或者:ls列出缓存列表。
缓存列表的标志各有意义和位置,如下所示:

  • u     不被列出的缓存,其不在正常的缓存列表中。
  •  %    当前缓存。
  •  #    替代缓存。
  •   a   缓存加载并被显示。
  •   h   缓存加载但被隐藏。
  •    =  缓存只读。
  •    -  缓存不可修改,其modifiable选项被关闭。
  •     + 缓存已经被修改了。

:b[uffer] #在当前窗口中切换第#号缓存。
:bprevious在当前窗口中切换上一个缓存。
:bnext在当前窗口中切换下一个缓存。
:bfirst在当前窗口中切换第一个缓存。
:blast在当前窗口中切换最后一个缓存。
:bdelete #将第#号缓存从缓存列表中删除,使其变为不被列出的缓存,但是vim仍然保存该缓存的一些信息,只能通过:buffers!来显示。
:bwipe #将第#号缓存彻底从vim中删除,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 -x {filename}用vim编辑名为filename的文件,同时提示用户输入加密密码两次;下次再打开编辑filename文件就不再需要用-x选项了。
:set key={password}用明文密码password重新加密;给key选项置空值可以取消加密。
:X提示用户重新加密,不会明文显示密码。
vim -x -n {filename}用vim编辑名为filename的文件,同时提示用户输入加密密码两次,另外不再创建swap文件;因为swap文件中的内容都是分块加密的,解密起来较为方便。
:setlocal noswapfile删除当前文件的swap文件。

二进制文件

vim -b {filename}以二进制方式打开名为filename的二进制文件。
:set display=uhex用16进制显示不可打印字符。
g CTRL-G显示当前光标在整个文件中的位置。
:%!xxd转换二进制文件,用两列分别显示二进制文件的内容,16进制和ASCII字符。
:%!xxd -r从两列显示模式恢复为原来的二进制文件。

压缩文件

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

插入模式下编辑

<BS>删除光标前的一个字符;<Del>删除光标后的一个字符。
CTRL-W删除光标前的一个单词。
CTRL-U删除本行开始到光标处的所有文本。

符号对仗

:set showmatch设置在插入模式下输入)}]时候,其对应的({[会自动高亮显示,并且光标会自动跳转过去,然后再跳转回来。
:set matchtime=#设置showmatch选项的反应时间为#个100毫秒。

补全

CTRL-PCTRL-N自动根据上下文来补全单词。
补全候选项:vim根据默认根据如下列表来搜索补全候选项:

  • 当前文件。
  • 其他窗口中的文件。
  • 其他加载的文件(Hidden缓存)。
  • 其他未加载的文件(Inactive缓存)。
  • tag文件。
  • 当前文件中所有被#include过的文件。

:set complete={str}设置补全候选项的搜索顺序,例如::set complete=.,w,b,u,t,i

特定的补全

  • 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是其专利称呼,同时还需要一些配置,例如启用文件类型插件。

CTRL-A输入在上一次插入模式下输入的所有文本。

其他

CTRL-Y输入当前光标位置上一行相同位置的字符;CTRL-E输入当前光标位置下一行相同位置的字符。
CTRL-R {register}输入名为register的寄存器里存放的文本。
: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,输入short会自动替换为long,并且当long中的字符有对应的映射时,不应用映射。
CTRL-V {key}插入key键代表的特殊字符;key也可以是十进制、八进制、十六进制数字,代表特殊字符的ASCII值。
:digraphs列出所有合成符,既由两个字符表示的的特殊字符,这些特殊字符不是键盘上能用一个键位表示的符号,例如:商标符号©;注意,合成符依赖于所使用的字符集,MS-DOS和MS-WINDOWS对应的字符集就不一样。
CTRL-K {digraph}输入由digraph表示的合成符,例如:CTRL-K Co
CTRL-O {command}在插入模式下执行正常模式下的命令command。
CTRL-T在插入模式下插入一个shiftwidth那么长的空白字符;CTRL-D在插入模式下删除一个shiftwidth那么长的空白字符。

格式化文本

: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加载两边对齐脚本。

长行

:set wrap设置当vim窗口容不下很长的一行文本时候,换行显示该文本,但是该长行文本之间其实没有换行。
wrap关闭之后,由如下命令可以按照文本的视角来移动:

  • zh右移1个字符。
  • 4zh右移4个字符。
  • zH右移半个窗口。
  • ze右移直到当前光标所在位置为窗口最右边位置。
  • zl左移1个字符。
  • 4zl左移4个字符。
  • zL左移半个窗口。
  • zs左移直到当前光标所在位置为窗口最左边位置。
  • g0光标移动到当前行窗口可见的第一个字符处。
  • g^光标移动到当前行窗口可见的第一个非空白字符处。
  • gm光标移动到当前行窗口可见的中间位置。
  • gM光标移动到当前行的中间位置。
  • g$光标移动到当前行窗口可见的最后一个字符处。

:set linebreak设置当wrap关闭以后,换行显示的文本不会从单词中间断开。
:set showbreak={char}设置当wrap关闭以后,换行显示的文本在行首的前缀字符。
gjwrap开启时,光标移向下移动屏幕中的一行;gk向上移动一屏幕行。
:g/./,/^$/join将vim中以空行分割的段变成一行。

折叠

折叠不影响文本内容,只是为了更好的显示文本,用一行显示若干行组成的一节内容。

手动折叠

zf{motion}根据motion创建一个折叠。
zd删除当前光标下的一层折叠;zD删除当前光标下的所有折叠。
zc关闭当前光标下的文本一层折叠;zC关闭当前光标下的所有层折叠;zo展开当前光标下一层折叠;z0展开当前光标下所有层折叠。
zr展开下一级的所有折叠;zR展开所有级别的所有折叠。
zm关闭一个级别的所有折叠;zM关闭所有级别的所有折叠。
zn禁用折叠;zN启用折叠;zi在禁用和启用折叠之间切换。
:set foldopen={options}根据option设置自动打开折叠的方式;:set foldclose={options}根据option设置自动关闭折叠的方式。

保存恢复折叠

除非用在视图里保存起来,否则vim不会保存折叠信息。

根据缩进折叠

:set foldmethod={option}设置缩进方法,option的取值部分如下:

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

编程语言特性

使用tags

tag记录了定义一个标识符的位置,vim可以利用一个名为tags的文件记录,使用其中的一系列tag来进行跳转。
ctags *.c在当前目录下,用Excuberant ctags生成tags文件。
:tag {identifier}根据tags文件,查找并跳转到定义identifier的位置。
CTRL-]根据tags文件,查找并跳转到当前光标所在单词的定义位置。
:tags显示tag跳转的位置列表。
:tag跳转到:tags列表中第一个位置。
:stag {tagname}分裂当前窗口,并在新窗口中跳转到tagname的定义位置;CTRL-W ]有同样功能。
:set tags={pathlist}设置vim寻找tag时用的tags文件列表,用逗号分隔开;用**表示通配任何中间目录。
ctags -R .Excuberant ctags遍历当前目录及各级子目录,生成一个大的tags文件。
:tfirst:#tprevious#tnexttlast在匹配的tag列表中跳转。
:tag /{pattern}在tag名前加上/表示按照该tag名为一个搜索模式,按照这个模式来搜索并选择tag。
:ptag {tagname}在预览窗口中查看名为tagname的tag;:pclose关闭预览窗口;:psearch {tagname}搜索tagname并显示在预览窗口。
[#跳转到C语言的预定义开始处;]#跳转到C语言的预定义结束处。
[[跳转到最外层的代码块开始处;]]跳转到最外层的代码块结束处;代码块以第一列为{}为准。
[{跳转到当前代码块开始处;]}跳转到当前代码块结束处;代码块以第一列为{}为准。
[(跳转到当前小括号开始处;])跳转到当前小括号结束处。
[/跳转到当前/*形式的注释开始处;])跳转到当前/*形式的注释结束处。
gD在全局(当前文件,当前文件包含的文件等)中寻找当前光标下的单词表示的变量;gd寻找局部变量。

编译

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

格式

: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自动在*之后插入一个空格之后,再输入/会删除该空格。

posted @ 2021-08-01 18:50  夏花与星空  阅读(312)  评论(0)    收藏  举报