vimbook-OPL(8-10)

CH8 Basic Abbreviations, Keyboard Mapping, and Initialization Files(基本缩写,映射和初始化文件)

Vim 提供了重要的功能来帮助快捷完成重复任务,比如缩写、键盘映射以及初始化文件 .vimrc

8.1 缩写

通过缩写可以完成将很长而且特定的文本用很简单的几个按键就可以完成,比如:注释头尾、版权申明等,以下

:abbreviate #b /***************************
:abbreviate #e <Space>********************/

当你在文本中按下 #b 时,并且继续按下空格或者 <Esc> 时,缩写会自动展开,值得注意的是在扩展中空格的表示,这是 Vim 特有的字符转义码。:abbreviate 能够显示所有的现有缩写。

8.2 映射

:map 命令可以将多个 Vim 命令绑定到一个单独的键上,例如:

:map <F5> i{<Esc>ea}<Esc>

可以让你在按下 F5 时,就在单词的两边加上一个 {} ,但是首先你得到单词的左边边界—— b 命令就可以。:map 命令列举当前所有的映射。

8.3 保存设置

现在已经在很多配置了,调用 :mkvimrc {file} 将当前的映射和缩写以 Vim 命令形式写入到文件 file 中(它也是一个 Vim 脚本),但是这样写入的有点混乱,最好的方式还是手动编写。通过 :source {file} 来导入 Vim 脚本并执行。Vim 在启动时会去特定地方查找初始化文件 .vimrc,Windows 下是 _vimrc ,这个文件通常在 $HOME 目录下,但并不总是这样。Vim 查找初始化文件有一个顺序:

  • Linux: $HOME/.vimrc 或 $HOME/.vim/vimrc
  • Windows: $HOME/_vimrc、$HOME/vimfiles/vimrc 或 $VIM/_vimrc

在这些位置找到了第一个初始文件之后,将不会继续查找了。除此之外,Vim 还有另外一个与 Vi 兼容的初始文件 —— exrc ,这个文件是从 EX 编辑器继承来的。EXtended 编辑器最初是由伯克利的 Bill Joy 写的,慢慢发展到了 Vim。

8.4 formatoptions

通过 formatoptions 我们可以指定怎样进行自动排版,比如 C 的注释自动加上 * 号前导符,大于 ’textwidth’ 时自动回绕文本,以及插入模式当超过时不自动分行等等。这些在帮助文档的 fo-table 标签中。在 C 文件中通常设定为 :set formatoptions=croql

  • c 注释自动回绕,自动插入注释前导符;
  • r 插入模式按回车,自动插入注释前导符;
  • o 普通模式按 ‘o’ 或 ‘O’ 时,自动插入注释前导符;
  • q ‘gq’ 命令排版时排版注释;
  • l 插入模式不分行,如果当前语句超过了 ’textwidth’ 不自动回绕;
  • t 插入模式时自动分行;

’t’ ‘c’ 的不同组合影响 Vim 的自动排版功能:

  • "" 没有自动排版动能
  • “t” 自动排版文本,不包括注释
  • “c” 自动排版注释,不包括文本(对 C 程序适用)
  • “tc” 自动排版文本和注释

CH9 Basic Command-Mode Commands(基本命令行模式命令)

Vim 中的命令行模式就是从 Ex 编辑器继承过来的,因而这些命令也被称为 Ex-Command。Ex 命令以冒号开头,当按下 : 时,会在窗口的底部出现一个回显命令的小窗口。还有另外一种进入 Ex 模式的方法,按 Q,此时 Vim 将一直停留在 Ex 模式,只有当调用 :visual 时才能回到正常模式。

NOTE: Ex 模式的命令是基于行的,如常用的替换命令,并且在非常多别的命令都有用到。处理的行用[range]表示,放在命令的前面。

9.1 打印命令

打印命令可以很好说明 Ex 命令是基于行的。:[range]print 将显示 [range] 范围内的行,缺省为当前行。以下是一些举例:

  • :print 打印当前行
  • :1,5print 打印 1 至 5 行;
  • :5print range可以只指定一行,因而打印第 5 行的内容;

有一些特殊的行号标记:$ 表示最后一行,. 表示当前行,% 是表示整个文件的 range,相当于 1,$。举例说明:

  • 1,$print %print 打印整个文件;
  • .,100print 打印当前行到 100 行;

行号甚至可以用正则表达式 /pattern/ 和 ?pattern? 表示,其中 / 表示向下搜索,? 表示向上搜索,是不是很有意思的编辑器?

  • :1,/trouble/print 打印从第 1 行至下面第一次出现 trouble 单词的行;
  • :?Notice?,39print 打印从 39 行向上搜索第一次遇到的包含 Notice 的行直到第 39 行的内容;

还记得标记(Marks)吗?行号还可以用标记呢。用 ma mb 分别标记两个行号,然后调用 :'a,'bprint 打印两个标记之间的内容。此处必须用单引号形式去取行,因为 `a 得到的还包括列号,print 命令的调用是不会成功的。

可视模式也可以表示行的范围,方法是用可视模式取若干行(会高亮),然后按下 :print 将打印范围内的行内容。在屏幕的底部你将会看到 :'<,'>print 回显,其实这是两个特殊的标记分别表示可视块的上边界(<)和下边界(>),查看帮助文档 :h mark-motions 得到所有关于特殊标记的详细解释。

9.2 替换命令

替换命令是我们在编写代码时经常用的,比如替换掉方法名。其完整格式 :[range] s[ubstitue] /from/to/flags ,[] 中的字符是可以省略的,缺省只替换当前行。from 是 Vim 正则表达式。flags 标志位 g 表示全部替换(这也是我经常使用的)也是缺省标志,c 要求在每个替换前都要求用户确认,还有其它一些标志位参考帮助文档 :s_flags 部分。这里给出 c 后出现的确认选项:

  • y 替换匹配
  • n 跳过此次匹配
  • a 替换此次及之后的所有匹配
  • q 退出匹配
  • 与 q 一样退出匹配
  • l 替换此次匹配并退出
  • CTRL-E 或者 ^E 上卷屏幕一行
  • CTRL-Y 或者 ^Y 下卷屏幕一行

to 部分还可以用到 from 中的捕获组,如 \1 \2 分别表示第 1 和第 2 个捕获组。

9.3 读写命令

:read [filename] 将文件中的内容插入到光标之后,我以前经常用 :read !ls 来读取当前文件夹下的所有文件名。:[range]write filename 能够将[range]范围中的文本写入到新文件中,缺省是整个文件的内容,如果不指定 filename,默认是写入到当前这个文件中,:write 也非常常用。这个命令解决我一个问题,当我需要从 Vim 中复制文本出去的时候(通常是几行),因为 cygwin 不能直接从 Vim 中复制,我不得不 cat 整个文件来复制,现在可以将需要文本高亮选择,并写入到临时文件即可。

9.4 shell 命令行

没有错,在 Vim 中可以打开 shell 命令行去执行任何命令,这对于一个 Linux 下工作的程序来说是多么重要。而我以前居然不知道!以前我都是关掉 Vim 或者重新打开一个新的终端或者用 !command 去执行,好可怜!现在我只需要 :shell 就可以方便的在 Vim 中进行操作,退出 shell 命令行用 exit 命令。所以作为一个立志做优秀程序员的人还是要多学多记多用!

CH10 Basic GUI Usage(基本GUI应用)

略过,没什么好讲的