vimbook-OPL(21-23)

CH21 窗口和会话

21.1 更多窗口命令

  • CTRL-Wt 切换到顶部窗口;
  • CTRL-Wb 切换到底部窗口;
  • CTRL-Wp 切换到前一个窗口;
  • [count]CTRL-Ww 切换下一个窗口,如果指定了 count 表示切换到第 n 个窗口;
  • [count]CTRL-WW 切换到上一个窗口,如果指定了 count 表示切换到第 n 个窗口;
  • [count]CTRL-Wr 将窗口向下回绕一次,如果指定了 count 表示回绕 n 次;
  • [count]CTRL-WR 向上回绕窗口;
  • CTRL-Wx 将当前窗口与下一个窗口交换位置,如果窗口处于底部,就与上一个窗口交换位置;

:wall 写入所有窗口,:qall 退出所有窗口,:waqll 保存并退出所有窗口;

21.2 buffer 添加、删除、卸载

当编辑一个文件时,文件就被添加到缓冲列表。调用 :badd [+lnum] file 将文件手动添加到缓冲列表,此时文件并没有加载到内存,如果指定了 +lnum 参数,则当第一次进入缓冲时光标会自动定位到那一行。

调用以下命令均可删除一个缓冲:

  • :bd file.c 按照文件名删除缓冲;
  • :bd 3 :3 bd 按照缓冲的索引删除,list 命令显示缓冲的列表,第一列就是索引;
  • :1,3 bd 删除索引 1~3 的缓冲;
  • :bd! file.c 强制删除 file.c 的缓冲;
  • :bd 删除当前文件的缓冲;

卸载缓冲的意思是将缓冲从内存中卸载,并且关闭缓冲的所有窗口,但是文件还保留在缓冲列表中。:bunload 的命令语法类似于 :bd ,在此不再一一解释。

21.3 窗口选项

’laststatus’ 控制最后一个窗口何时有状态行:0 表示永不;1 表示只有在有至少两个窗口时;2 表示总是; ‘winheight’ 控制当前窗口的最少行数; ’equalalways’ 控制窗口分割时总是相同 size 分割; ‘splitbelow’ 选项控制分割窗口时,新窗口出现在下面;

21.4 会话(session)

在关闭 Vim 前可以将当前的缓冲列表、窗口信息、标记、寄存器和一些别的工作信息保存在会话文件中去。这个会话文件是 Vim 生成的 vimscript 脚本文件。当再次启动 Vim 时,可以从这个会话文件中恢复上次的工作信息。

:mksession vimbook.vim 将当前会话信息保存到文件中; :source vimbook.vim 从文件中恢复会话;

‘sessionoption’ 选项控制哪些信息得保存在会话文件中。如::set sessionoptions=buffers,winsize,options,help,blank 。以下是每个参数的详细解释:

参数 信息
buffers 保存所有的缓冲列表,包括隐藏的和卸载的缓冲
globals C 语言中的常量形式的变量
help 帮助窗口
blank 空窗口
options 所有的选项以及按键映射
winpos GUI 窗口的位置
resize 屏幕的缩放
winsize 窗口大小
slash 将反斜线替换为正斜线,方便在 UNIX 和 Windows 共享会话信息
unix 用 UNIX 的换行符来保存文件

22 更多高亮模式(visual mode)命令

gv 可以重复处理上一次的高亮模式;

在高亮模式下选择 word 有好几种不同的方式,aw w iw,为何要提供这么多不同的方式呢?原因在于它们可以对选择进行微调。

  • aw 选择一个单词,包括结尾的空白,需要注意的一点是不论光标位于单词的任何地方,都会选中单词的开头;

  • w 从当前位置开始选择一个单词,包括下一个单词的第一个字符;

  • iw 选择一个内含单词,不会包含结尾的空白,除此之外跟 aw 的效果是一样的;

  • aW 选择一个字串,包括结尾的空白,不论光标位于字串的任何地方,都会选中整个字串;

  • iW 选中一个内含字串,不会包含结尾的空白,除此之外跟 aW 是一样的;

除此之外还有 as is 选中句子(sentence),ap ip 选中段落;

a( i( 选中包围的 () ,其中,a 形式的命令会包含开闭符号 ( 、),i 形式命令则不包含。a< i< 选中 <> 对,a[ i[ a{ i{ 功能类似。

22.1 在高亮块中跳转

o 命令可以在高亮块的两个对角进行跳转。O 仅在块高亮模式(Block Visual Mode)时,用来在同一行的两端跳转。

22.2 其它命令

~ 转换选择块的大小写,U 将整个高亮块都变成大写的,u 将整个高亮块变成小写的。

J 将整个高亮块拼接成一行,gJ 同样的作用,但是不添加额外的空白符。

:write block.txt 将选中的行写入到文件中;

! 将选中的行调用外部命令,如 !sort

22.3 选择模式(Select Mode)

选择模式类似于高亮模式,也会选中一大块文本,区别在于可用的命令。选择模式不能使用任何可打印字符的命令,如:j k ,如果键入任何这种字符,都将导致被选中的块被删除,并被替换为键入的字符,然后进入插入模式。此外,还可以用 <BS> 删除选中块,然后进入插入模式。

在选择模式中要移动光标必须用方向键,CTRL 键和功能键(F1等)。进入选择模式有以下几种:

  • gh 进入按字符移动的选择模式;
  • gH 进入按行移动的选择模式;
  • gCTRL-H 进入块选择模式(block selecttion);

23 面向程序员的命令

Vim 编辑器是一个程序员写给程序员的编辑器,自然会带上很多程序员的特征。比如:<Tab> 键应该正常缩进还是替换成空格,自动缩进选项,make 命令选项。

23.1 移除或插入自动缩进

CTRL-D 移除一个缩进的空白符,0CTRL-D 移除所有缩进空白符,并将光标置于第一列。 CTRL-T 插入一个缩进,这个命令的效果类似于 <Tab> ,除了此命令是按照 ‘shiftwidth’ 的长度缩进,而 <Tab> 按照 ’tabstop’ 的长度缩进。

CTRL-TCTRL-D 可以在行的任意位置调整缩进,而不仅仅是行首。

23.2 插入寄存器

在插入模式想要将寄存器中的内容粘贴并进行合理的缩进,必须调用 CTRL-R CTRL-P a 命令,其中 a 是寄存器。

23.3 空白符和 <Tab>

‘softtabstop’ 控制使得 <Tab> 的长度看起来是这么多。比如 :set softtabstop=4 ,而此时 ’tabstop’ 的值还是 8 ,也就是说 <Tab> 本身占 8 个空格的长度。当第一次按 <Tab> 键时,将插入 4 个空格,按第二次时插入一个占 8 个空格场的 <Tab> 值,继续按则再此插入 4 个空格。<BS> 回退效果是一样的。

‘smarttab’ 选项如果打开,将在行首用 ‘shiftwidth’ 选项指定的宽度进行缩进,缩进的原则跟 ‘softtabstop’ 是一样的,就是不足 ’tabstop’ 的长度就用空格代替,足够的话就用 <Tab> 替换掉空格。而在其他地方依然使用 ‘softtabstop’ 或者 ’tabstop’ 的指定的宽度进行插入。

’tabstop’ 选项指定 <Tab> 的不同宽度,如: :set tabsto=4

‘shiftwidth’ 缩进或自动缩进使用的空白数目;

’expandtab’ 选项将 <Tab> 扩展成一系列的空格,设定了此选项不会将已经存在的 <Tab> 转换为空格,如果需要这么做,请调用 :retab 命令。如果你不希望 <Tab> 被扩展为空格,调用 CTRL-V<Tab> 将插入一个实实在在的 <Tab> 而不会扩展为空格。

:%retab 8 则将当前的 ’tabstop’ 宽度改为 8 并重新格式化文档。

如果没有指定 ‘shiftround’ 选项将导致每次用 >> 命令缩进时每次都缩进 ‘shiftwidth’ 数目的空白,如果指定了 ‘shiftround’ 将对齐到 ‘shiftwidth’ 宽度,这样看起来更加规整。

23.4 处理多个目录

‘path’ 选项是一个很重要的东西,能够给多个命令提供搜索查询的目录,它是一个逗号分隔的目录列表。这些命令包括 gf :find :sfind tabfind 。 目录中的空格和反斜线需要转义,句点表示文件所在的目录,空字符串表示当前工作目录 ,, 是唯一形式;

两个特殊的目录通配形式:

* 匹配单层目录里边的所有文件,比如:./abc*,表示当前目录下所有以 abc 开头的文件或文件夹; ** 匹配整个目录树,只能出现在两个 / 之间,或者路径的尾部。/usr/**/sys 匹配 /usr 下并且直达 sys 目录的所有目录。/usr/include/** 匹配 /usr/include 下的整个目录树;

调用 :set path-= 删除一个目录;:set path+= 增加一个目录;:set path^=../lib 将 lib 目录放到搜索目录列表的最前面。在 C 代码中经常会遇到 #include “lib.h” 这种预处理语句,调用 gf 命令可以跳转到对应的文件,而文件目录的地址必须先配置在 ‘path’ 选项中。

:checkpath 命令检查当前文件的所有 #include 文件是否可以被查找到,并且检查这些包含文件所包含的其它文件是否可以被找到。如果所有文件都可以找到将返回正确的信息,如果有任何文件找不到将显示出来。

23.5 未介绍的内容

  • ‘comments’ 定义什么是注释,这是一个很复杂的配置,但是能够将什么是注释运用于很多语言;
  • ‘cinkeys’ 定义哪些时候应该触发缩进重排 ‘cinoptions’ 控制如何进行缩进 ‘cinwords’ 定义哪些是 C/C++ 关键字;
  • ‘matchpairs’ 控制哪些符号可以用 % 进行匹配,默认配置: :set matchpairs=(:),{:},[:] ,将匹配这几种括号;
  • ‘makeprg’ 可以对怎样调用 make 进行精确控制,如::set makeprg=make\ % 将当前文件名作为参数传给 make ;
  • ‘makeef’ 控制 make 错误信息的重定向的文件名;
  • ’errorformat’ 选项能够控制 Vim 如何去解析 make 产生的错误信息;
  • ‘switchbuf’ 控制缓冲区切换的行为;
  • ‘grepprg’ 控制用那个 grep 程序的调用,可以用 # 表示当前文件,% 表示 alternate 文件,‘grepformat’ 控制 grep 输出的解析格式;
  • ‘highlight’ 控制语法高亮,可以控制三种终端(term,cterm,gui)的各种语法元素(Syntax Elements)的显示特性(颜色、下划线、加粗等);