4.5 代码收藏

源码分析过程中,常常需要在不同代码间来回跳转,我需要“收藏”分散在不同处的代码行,以便需要查看时能快速跳转过去,这时,vim 的书签(mark)功能派上大用途了。

vim 书签的使用很简单,在你需要收藏的代码行键入 mm,这样就收藏好了,你试试,没反应?不会吧,难道你 linux 内核编译参数有问题,或者,vim 的编译参数没给全,让我想想,别急,喔,对了,你是指看不到书签?好吧,我承认这是 vim 最大的坑,书签所在行与普通行外观上没任何差别,肉眼,你是找不到他滴。这可不行,得来个让书签可视化的插件,vim-signature(https://github.com/kshenoy/vim-signature )。vim-signature 通过在书签所在行的前面添加字符的形式,以此可视化书签,这就要求你源码安装的 vim 具备 signs 特性,具体可在 vim 命令模式下键入

  1. :echo has('signs')

若显示 1 则具备该特性,反之 0 则不具备该特性,需参考“1 源码安装编辑器 vim ”重新编译 vim。

vim 的书签分为两类,独立书签和分类书签。独立书签,书签名只能由字母(a-zA-Z)组成,长度最多不超过 2 个字母,并且,同个文件中,不同独立书签名中不能含有相同字母,比如,a 和 bD 可以同时出现在同个文件在,而 Fc 和 c 则不行。分类书签,书签名只能由可打印特殊字符(!@#$%^&*())组成,长度只能有 1 个字符,同个文件中,你可以把不同行设置成同名书签,这样,这些行在逻辑上就归类成相同类型的书签了。下图定义了名为 a 和 dF 两个独立书签(分别 259 行和 261 行)、名为 # 的一类分类书签(含 256 行和 264 行)、名为 @ 的一类分类书签(257 行),如下所示:

4.5 代码收藏  - 图1(独立书签和分类书签)

两种形式的书签完全分布在各自不同的空间中,所以,它俩的任何操作都是互不相同的,比如,你无法遍历所有书签,要么只能在各个独立书签间遍历,要么只能在分类书签间遍历。显然,两种形式的书签都有各自的使用场景,就我而言,只使用独立书签,原因有二:一是独立书签可保存,当我设置好独立书签后关闭文档,下次重新打开该文档时,先前的独立书签仍然有效,而分类书签没有该特性(其他文档环境恢复参见“6.3 环境恢复”);一是减少记忆快捷键,光是独立书签就有 8 种遍历方式,每种遍历对应一种快捷键,太难记了。

vim-signature 快捷键如下:

  1. let g:SignatureMap = {
  2. \ 'Leader' : "m",
  3. \ 'PlaceNextMark' : "m,",
  4. \ 'ToggleMarkAtLine' : "m.",
  5. \ 'PurgeMarksAtLine' : "m-",
  6. \ 'DeleteMark' : "dm",
  7. \ 'PurgeMarks' : "mda",
  8. \ 'PurgeMarkers' : "m<BS>",
  9. \ 'GotoNextLineAlpha' : "']",
  10. \ 'GotoPrevLineAlpha' : "'[",
  11. \ 'GotoNextSpotAlpha' : "`]",
  12. \ 'GotoPrevSpotAlpha' : "`[",
  13. \ 'GotoNextLineByPos' : "]'",
  14. \ 'GotoPrevLineByPos' : "['",
  15. \ 'GotoNextSpotByPos' : "mn",
  16. \ 'GotoPrevSpotByPos' : "mp",
  17. \ 'GotoNextMarker' : "[+",
  18. \ 'GotoPrevMarker' : "[-",
  19. \ 'GotoNextMarkerAny' : "]=",
  20. \ 'GotoPrevMarkerAny' : "[=",
  21. \ 'ListLocalMarks' : "ms",
  22. \ 'ListLocalMarkers' : "m?"
  23. \ }

够多了吧,粗体部分是按个人习惯重新定义的快捷键,请添加进 .vimrc 中。

常用的操作也就如下几类:

  • 书签设定。mx,设定/取消当前行名为 x 的标签;m,,自动设定下一个可用书签名,前面提说,独立书签名是不能重复的,在你已经有了多个独立书签,当想再设置书签时,需要记住已经设定的所有书签名,否则很可能会将已有的书签冲掉,这可不好,所以,vim-signature 为你提供了 m, 快捷键,自动帮你选定下一个可用独立书签名;mda,删除当前文件中所有独立书签。
  • 书签罗列。m?,罗列出当前文件中所有书签,选中后回车可直接跳转;
  • 书签跳转。mn,按行号前后顺序,跳转至下个独立书签;mp,按行号前后顺序,跳转至前个独立书签。书签跳转方式很多,除了这里说的行号前后顺序,还可以基于书签名字母顺序跳转、分类书签同类跳转、分类书签不同类间跳转等等。
    效果如下:

4.5 代码收藏  - 图2(可视化书签)

我虽然选用了 vim-signature,但不代表它完美了,对我而言,无法在不同文件的书签间跳转绝对算是硬伤。另外,如果觉得收藏的代码行只有行首符号来表示不够醒目,你可以考虑 BOOKMARKS—Mark-and-Highlight-Full-Lines 这个插件(https://github.com/vim-scripts/BOOKMARKS—Mark-and-Highlight-Full-Lines ),它可以让书签行高亮,如下是它的快捷键:,高亮所有书签行;,关闭所有书签行高亮;,清除 [a-z] 的所有书签;,收藏当前行;,取消收藏当前行。