vimbook-OPL(24-25)

CH24 键盘映射

24.1 缩写的相关命令

:abbreviate @a fresh 添加 @a 为 fresh 的缩写,在插入模式按键 @a 并按 <ESC> 将插入 fresh 字符串; :unabbreviate @a 将删除 @a 的缩写; :abclear 将所有缩写都删除;

以上形式定义的缩写将在插入模式和 Ex 命令模式都会展开。如果想仅在插入模式展开,调用 :iabberviate @a fresh 设置仅在插入模式生效的缩写,:iunabbreviate @a 清除请在插入模式生效的缩写,:iabclear 清除所有在插入模式下的缩写。仅在命令模式下的缩写为 :cabbreviate :cunabbreviate 以及 :cabclear

:abbreviate 将显示所有的缩写,首列为缩写的工作模式:c 表示在命令模式下,i 表示在插入模式下,! 表示两种模式皆有。 在插入模式调用 CTRL-] 将强制进行缩写扩展。而 CTRL-C 将在不检查缩写扩展的情况下退出插入模式。

24.2 映射和模式

映射时可以指定映射的模式,用 :vmap 将仅在可视模式下进行映射,:nmap 仅在normal模式下映射,:map! 将在插入模式和 Ex 模式下映射,:imap 将仅在插入模式下映射。:cmap 将仅在 Ex 模式下映射。在指定映射时,必须是用 CTRL-V CTRL-A 才能生成 ^A 这样的 Vim 内部表示,注意这不是 ^ 和 A 的组合。而:map 则在normal、可视模式下进行映射。

:unmap 则将原来的映射给取消,这在某些时候有用。:mapclear 则取消所有的映射。:map 在不带参数的情况下列举所有的映射,列举出来分为三列,每列有不同的含义,具体查看相应的文档。

默认情况下 Vim 中的映射时循环映射,调用 :set noremap 进行关闭。

CH25 Ex 命令

Ex 命令就是用 : 打头的命令。指定行的范围有多种方式。比如::range delete register count在 range 中删除 count 行,count: delete 从当前行开始删除 count 行,:line delete count 从 line 行还是删除 count 行。还可以用正则表达式来指定行的范围,具体::/hello/,/goodbye/ delete 将删除从包含 hello 的行一直到包含 goodbye 的行。特殊的模式匹配:\/ 前向搜索上一个模式 \? 回溯搜索上一个模式 \& 前向搜索上次的替换模式。:/first//second/ delete 将在搜索到 first 之后再继续搜索 second ,从那里开始删除。:7/first/ 从第7行开始搜索 first 所在行。

总而言之,Ex在指定操作的行范围上有非常大的灵活性。

这本书里边讲了一些之前我没用过的命令,在此记录一下:

:range copy address 将 range 范围的文本行复制到 address 位置。 :range move address 将 range 范围的文本行移动到 address 位置。

对写代码有用的 Ex 命令

  • :range ijump count [/]pattern[/] 对 C/C++ 程序非常有用,在当前文件和 #include 包含的文件中搜索 pattern ,如没有包含双斜线则按字面意思搜索,如果有的话就按正则表达式搜索。如: :ijump /define\s*EOF/ 将搜索到 “# define EOF (-1)” 这样的文本。
  • :ilist 类似于 ijump 一样搜索,但是不跳转而是列举;
  • :isearch 将列举第一个匹配,:isplit 搜索分割并跳转;

另外还有宏定义跳转,如::djump [/]name[/] 跳转到 name 宏定义所在行,:dsplit :dlist :dsearch 都类似于上面的命令功能,除了是查找宏定义。

目录文件相关的命令

:cd :pwd 类似于 Linux 下的同名命令功能。:file 命令可以知道当前编辑的是哪个文件,如果指定新的文件名,则当调用 :w 时将会把内容保存到新的文件名所指示的文件中去。

在 Ex 模式下还有许多个命令是模拟命令模式下的,如::startinsert 类似于 i:yank 类似于 y 命令。

:history 命令可以显示所有执行过的命令。要执行之前的命令有一个很好的方式,按下 : 然后用向上键进行回溯执行。

CH27 表达式和函数

Vim 有一个插件语言叫 Vimscript,用来写 Vim 的各种插件来丰富 Vim 的功能。这本书没怎么将这一块,主要还是在将如何在 Vim 中操作,简单描述了 Vimscript 中的变量、常量、表达式和函数,包括一整个内建函数表。我这里只讲一下变量,因为这个变量跟我们在常规的编程语言中的变量还有点不一样。

只由大写字母、数字和下划线构成的变量可以保存在 viminfo 中;首字母大写的变量可以保存在 session 中;只包含小写字母的变量退出时不做保存;

$var 这个变量将会成为 Vim 的环境变量。@var 这个变量将会成为寄存器。&var 这个变量将会表示 Option。b:name 此变量只在当前缓冲中可见。w:name 此变量将会成为窗口的本地变量。g:name 此变量将会成为全局变量;a:name 此变量是函数的参数;v:name 此变量是 Vim 内部使用的变量。

以上变量具体如何用,说实话我没有深入去了解,因为暂时用不上,而且这本书没怎么讲清楚。有个 Learn Vimscript the hard way 的教程把如何写 Vimscript 描述的非常好,有兴趣可以搜索下。

在此仅介绍下 v:name 的一些变量,这是 Vim 内部定义的变量。v:version 是当前的版本号。v:this_session 最后一次使用到的 session 文件名。v:statusmsg 状态消息;v:errmsg 最后一条错误消息;v:warningmsg 最后一条警告消息;

另外,Vim 中还定义了一些可扩展的特殊字符串,如 ‘%’ 表示当前文件名,’#’ 表示 Alternate 文件名,<cword> 光标下的单词,<cWORD> 光标下的字串,留意 word 和 WORD 的区别。<cfile> 光标下的文件名。

关于如何定义函数,以及使用 Vimscript 本身,此文不打算讲。主要还是集中在书上的内容。

:function 命令将列举所有用户自定义的函数; :function {name} 命令将展示整个函数定义; :delfunction {name} 将删除一个函数,{name} 是函数的名字;