分享

VOoM(原VOOF):vim实现带折叠双栏树状文本管理 | 善用佳软

 phisics 2011-03-25

VOoM(原VOOF):vim实现带折叠双栏树状文本管理

重要说明:自v4.0开始,VOoM支持html、vimwiki、wiki等格式的标题,本文有待更新。
  Vim[1]加装VOoM插件,实现了带折叠的双栏树状文本管理 [2]/[3],为我几年来的寻找画上了近乎圆满[4]的句号。只须在txt文本的标题行增加 {{{1、{{{2…… 或其他自定义的简单标识,利用VOoM就可以生成目录树,与正文分居两窗口,实现光标点击跳转,以及对节点的层级、顺序管理。即,VOoM让txt成为最通用的资料库,让Vim成为最方便的个人信息管理软件。

一、VOoM界面预览及视频演示界面视频
二、VOoM基本教程安装python支持基本操作
三、高级使用:改进VOoM快捷调用更快捷定义标题行高亮标题行并隐藏标识符自定义标识符在html中变通使用
四、总结
附录:注释文章更新历史

一、VOoM界面预览及视频演示

1. VOoM界面预览

  VOoM:vim outliner
  上图是善用佳软使用Vim VOoM的实际截屏,从中可以看到如下特点:
  * 两栏;
  * 左侧目录可折叠/展开(正文也可以折叠,本例未采用);
  * 点击目录可实现正文跳转;
  * 标题高亮。

2. VOoM视频演示

  下面的视频是使用vim的outliner功能,来写日记的示例。有助于初学者感性认识及理解Vim,内容包括:
  * 用fdm=indent实现基于缩进的长文本折叠管理。
  * (2分10秒开始) 下载安装VOoM插件。
  * VOoM的使用。
  * (3分20秒开始) 自定义语法文件,高亮标题。
  需要说明的是视频中未能展示节点管理(改变层级、调整顺序)功能。

二、VOoM基本教程

1. 安装VOoM

  VOoM插件的安装与使用极为简单,有基础者可以略过本段。
  * 到Vim官方网站VOoM主页下载最新版:http://www./scripts/script.php?script_id=2657
  * 解压到vim安装目录/vimfiles/下。
  * 重启Vim。
  * 打开自带的示例文件 simple_outline.txt (可能位于 x:\soft\Vim\vimfiles\voom_samples\)。
  * 在命令行模式键入(注意大小写):Voom 并回车。

  如果顺利,现在就能看到左侧的树状目录了。
  如果不顺利,很可能是需要Python支持,见下。

2. VOoM 与 python

  VOoM 之所以基于 Python,完全是出于效率:Python扫描文本正文发现fold marker的速度,大约是vim脚本的10倍。作者在帮助文档的“Why VOoM uses Python”一节,给出了详细的测试代码和测试结果。
  所谓 VOoM 需要 Python支持,具体包括两方面:
  ① GVIM.exe 支持 Python;
  ② 系统中安装有对应版本的Python环境。
  条件①通常具备,因为官方发布的gVim默认是支持 Python的。
  条件②可能会有些问题:如果你没有安装Python,这时就需要根据gvim的版本,安装合适版本的Python:gvim7.2需要Python 2.4,gvim7.3需要Python 2.7。安装Python时最好在C根目录。如果你的Python版本与gvim版本不对应,一种办法是换用正确版本的Python;一种办法是重新编译gvim,让它支持你已经安装的Python版本(不会编译的请到 这里下载)。
  为了这样一个插件而安装Python,对普通用户是否值得?这是一个爱屋及乌、见仁见智的问题。笔者不做程序开发,安装JRE是因为FreeMind;安装.Net是因为EverNote v3.5;安装Python是因为VOoM与UltiSnips;安装Ctags、taglist是因为TxtBrowser……

3. VOoM 基本操作

  鼠标方式:Vim并不排斥鼠标。如果想用鼠标操作VOoM,则它与类似软件并无区别,无须解释。
  键盘方式:Vim的长处还是键盘。要点如下,详见帮助文档。
  1. 基本操作之Tab:在左右 [6]两个窗口之间切换焦点;
  2. 基本操作之跳转到目录:在目录树侧,可通过↑↓来打开正文的相应位置,→←来展开/折叠父子节点。
  3. 节点基本操作:在目录树buffer中,如下快捷键可用:
    i I a A:修改当前节点标题行。
    <LocalLeader>i、I:在当前节点前、后插入新节点。(LocalLeader默认为\,也可自定义)
    ctrl+方向键:上下移动节点(调整顺序);左右移动节点(调整级别)。
    dd yy pp:删除、复制、粘贴节点。

三、高级使用:改进VOoM

1. 更快捷调用VOoM

  默认情况下,需要键入 :Voom回车 来调用VOoM插件。此过程需要注意输入法状态、vim模式、大小写,不算简便。因此,可以自定义热键。
  我的选择是映射为 F11 ——选择 F11 是因为数字11的形状与双栏式结构很相像,便于记忆。
  具体做法是在 _vimrc 中增加一句 “map <F11> :Voom<CR>”——放到 _vimrc中因为此命令常用。

2. 更快捷定义标题行

  如果认为 {{{1 这样的字符串也不便于键入,不妨进行自定义。举例如下。

例1:基本做法
  imap [1 {{{1
  imap [2 {{{2
  imap [3 {{{3
  实现了插入模式的映射,即键入 [1 可以得到 {{{1 …… 当然,也可用缩写代替映射。

例2:改进做法(推荐)
  imap [1 <esc>$a {{{1
  map [1 <esc>$a {{{1
  功能同上,但不限模式、光标无须准确定位。

例3:Geek做法(供参考)
  设定1/2/3级标题,在 MS Word 中的默认热键是 ctrl+alt+1/2/3。按照“不同软件的操作方式尽可能一致”原则,也力争在VOoM中保持同样热键。但是,Vim map 并不支持 ctrl-数字,所以,ctrl+alt+数字也是做不到的。一定要实现?请用万能的AutoHotkey :

^!1::
IfWinActive, ahk_class Vim
{
sendinput {esc}$a {{}{{}{{}1
}
else
sendplay ^!1
return

3. 高亮标题行、隐藏标识符

  为实现高亮效果,可以使用如下syntax代码:

syn match zhead0 "^.+{{{d"
hi zhead0 gui=bold guibg=black
syn match zhead1 "^.+{{{1"
hi zhead1 gui=bold guifg=red guibg=black
syn match zhead2 "^.+{{{2"
hi zhead2 gui=bold guifg=green guibg=black
syn match url "S*://S*"
hi url guifg=lightblue gui=underline

  但是,标题行突出显示后,{{{1 这样的标示符更加刺眼。能否将之隐藏呢?Vim 当然不会让你失望,只需稍修改上述高亮规则即可。笔者在初学 vim syntax 时,曾苦苦探寻实现方式。而现在,可以直接给出两种做法:
  一是利用零宽断言(:h zero-width)让标题不包括{{{d,代码如下:

syn match zhead0 "^.+({{{d)@="
syn match zkey "{{{d"

  二是利用contain参数,代码如下:

syn match zkey "{{{d" contained
syn match zhead0 "^.+{{{d" contains=zkey

  对于zkey的隐藏,可以直接设定前景色与背景色相同,但更推荐 hi link zkey ignore 的做法。同理,zhead0 也可以不做直接设定,而是 hi link zhead0 MatchParen 或其他预设风格。

4. {{{2 标识符的自定义等

  {{{1、{{{2……这样的标识符用来表示标题。VOoM称之为“起始折叠标记”(start fold marker),它是通过 foldmarker 选项来定义的。比如 set fmr=<<<,>>> 或 set fmr=[[[,]]] ,这样就可以使用 <<<2 或 [[[2 来表示二级标题。
  另外,除了数字表示级别外,还可以紧跟如下字母(及组合):x 表示标记(目录树第二列显示x),可用来标出某些重要标题。= 表示起始节点,即:Voom时的起始节点。o 表示open,即该目录树完全展开。除了在标题行直接增加这些标记外,也有相应快捷键操作。

5. 在html中变通使用vim-VOoM

  工具固然有好坏之分,但多数情况下,用户应用水平对最终效果的影响更大。而学会变通使用,闻一知二、举一反三,是显著提升应用效果的关键。
  txt需要额外标记才能使用VOoM,而html是已经附有标记的、扩展后的txt。其中,标题行以及层级已由h标签进行了标示。所以,理论上,html应该可以“不加修改”、“快速”使用VOoM功能。
  所谓好工具,就是理论上应该能做到的事,实际上也能做到。对着VOoM想一下,答案有了!
  实现方法:很简单,只须设定

:set fmr=</h,}}}

再:Voom 即可(对于自己的html笔记文档,可增加modeline)。
  
  上述操作效果如图。美中不足的是,目录行首的h起始标签有些碍眼。
  最理想的效果参见此文,通过修改voom.py(v2.0)中第59行开始的函数:def makeOutline(body, lines),在 74 行之后,增加如下两行:
  del_html_re = re.compile('<.*?>')
  tline = del_html_re.sub('', tline)
把html标签全部清空即可——此修改当然有副作用,所有尖括号内容均被忽略,请慎用!感谢 vfantasie @ 网友提供上述代码,相关讨论参见此处

四、总结

  如果说Vim是单一txt文件编辑利器,Vim加wiki类扩展则实现了多个txt的管理,那么VOoM就实现了以txt为文本资料库的管理。凭着Vim方便的加密、查找、替换、语法高亮、折叠功能,再加上VOoM的树状管理,我自己认为找到了理想的文字笔记管理方案。

附录:注释

  [1]: 参见Vim--普通人编辑利器、更多vim文章
  [2]: 关于纯文本资料管理。txt是最简单,也是最基本的文件格式,很多人对它情有独钟。通过软件为长篇txt增加目录功能,一直是某些开发者和用户的梦想,为此,有了《超级小巧的5款免费树状笔记软件》。
  [3]: 关于双栏树状结构。我最早是利用 UltraEdit 的 function list 实现长篇txt的目录导航。后来转到 Vim 后,一直试图用tag、folding来模拟此功能,但都不满意。对于较少使用高级文本编辑器的用户而言,双栏树状结构的典型例子是 MS Word 的“文档结构图” [5]
  [4]: 近乎圆满,是因为 Vim 并不适合处理太大的txt文件。当然,这个大小是相对的,与硬件及Vim激活的功能多少有关。 更新:而VOoM处理长文本,也会较占资源,主要是扫描正文生成outline。VOoM作者的2002年旧电脑(1.6GHz Pentium 4 Mobile)上,附带的 calendar_outline.txt (3.2 Mb, 56527 lines, 4160 headlines)会在更新后有明显停顿(小于1秒)。但要说明的是:仅阅读跳转仍然流畅;减少标题行能大幅度提高效能。总之,我相信当前情况下,10MB txt,上千个节点是可以正常使用的。
  [5]: MS Word 文档结构图是处理长文档极为重要的工具,也是我推荐的Word视图,我在 Word 2003 中调用此功能的“快捷键”是 alt+v d ,可参见 [视频教程] WPS处理长文档的技巧
  [6]: 用户也可以自定义目录窗口的位置:上、下、左、右,及其大小。建议放在默认位置,即左侧。

附录:文章更新历史

  2010-09-16:感谢知无兄协助更新本文。
  2010-04-18:VOOF改名为VOoM;html利用h标签更完美。
  2010-03-24:补充目录、总结。
  2010-03-20:补充在html中利用h标签,实现目录的做法。
  2010-03-03:全面更新文章;VOOF升级到v1.92。
  2009-12-09:改进实现^!1/2/3功能的AutoHotkey脚本。
  2009-11-11:补充“隐藏标示符”。
  2009-11-09:补充截屏,增加改进部分与Python,算是下篇。
  2009-11-06:补充视频,修改并发表,算是上篇。
  2009-05-27:长期跟踪的习惯让我在第一时间发现了刚刚诞生的VOOF。一试之下,赞叹不已!立即在水木社区vim版 发文推荐

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多