[更新] VOOF:vim实现带折叠双栏树状文本管理(上,下)

  Vim[1]加装VOOF插件,实现了带折叠的双栏树状文本管理 [2]/[3],为我几年来的寻找画上了近乎圆满[4]的句号。只须在txt文本的标题行增加 {{{1 {{{2 {{{3 这样的简单标识,利用VOOF就可以生成一个目录树,与正文分居两窗口,实现点击跳转。
VOOF:vim outliner

一、VOOF视频演示

  上图是善用佳软使用Vim VOOF的实际截屏:两栏;左侧目录可折叠/展开(正文也可以折叠,未采用);点击目录可正文跳转;标题高亮。
  下面的视频是使用vim的outliner功能,来写日记的示例。有助于初学者感性认识及理解Vim,内容包括:
  - 用fdm=indent实现基于缩进的长文本折叠管理。
  - (2分10秒开始) 下载安装VOOF插件。
  - VOOF的使用。
  - (3分20秒开始)自定义语法文件,高亮标题。

二、VOOF的基本使用

  VOOF的安装与使用极为简单,几乎不需要说明。
  到Vim官方网站 VOOF 页下载最新版,解压到vim安装目录/vimfiles/下。重启Vim,打开自带的示例文件 simple_outline.txt (可能位于 x:\Program Files\vim\vimfiles\plugin\VOOF_11\),然后在命令行模式键入(注意大小写):
  :Voof
  并回车,就能看到双栏窗口了。

  如果通过鼠标来使用,则与通常的图形化界面outliner并无区别。
  如果喜欢键盘操作,只要记住左右 [6]两个窗口之间切换焦点的默认按键是Tab;目录树侧可通过↑↓来移动节点,→←来展开/折叠节点。

三、高级使用:改进VOOF

1. 更快捷调用VOOF

  默认情况下,需要键入 :Voof回车 来调用VOOF插件。此过程需要注意输入法状态、vim模式、大小写,不算简便。因此,可以自定义热键。
  我的选择是映射为 F11 ——选择 F11 是因为数字11的形状与双栏式结构很相像,便于记忆。
  具体做法是在 _vimrc 中增加一句 “map <F11> :Voof<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。按照“不同软件的操作方式尽可能一致”原则,也力争在VOOF中保持同样热键。但是,Vim map 并不支持 ctrl-数字,所以,ctrl+alt+数字也是做不到的。一定要实现?请用万能的AutoHotkey :

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

3. 高亮标题行

  上图中的高亮效果,来自如下代码:

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

4. 隐藏标示符

  标题行突出显示后,{{{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 或其他预设风格。

四、其他补充

  关于 VOOF 与 python:需安装与gVim对应的Python版本。官方的gVim 7.2默认支持Python 2.4。如果你已经安装了其他版本的Python,也可自行编译对应的gVim 或到,其他Python版本可参见这里下载

附录:注释

  [1]: 参见Vim–普通人编辑利器、更多vim文章
  [2]: 关于纯文本资料管理。txt是最简单,也是最基本的文件格式,很多人对它情有独钟。通过软件为长篇txt增加目录功能,一直是某些开发者和用户的梦想,为此,有了《超级小巧的5款免费树状笔记软件》。
  [3]: 关于双栏树状结构。我最早是利用 UltraEdit 的 function list 实现长篇txt的目录导航。后来转到 Vim 后,一直试图用tag、folding来模拟此功能,但都不满意。对于较少使用高级文本编辑器的用户而言,双栏树状结构的典型例子是 MS Word 的“文档结构图” [5]
  [4]: 近乎圆满,是因为 Vim 并不适合处理太大的txt文件。当然,这个大小是相对的,与硬件及Vim激活的功能多少有关。
  [5]: MS Word 文档结构图是处理长文档极为重要的工具,也是我推荐的Word视图,我在 Word 2003 中调用此功能的“快捷键”是 alt+v d ,可参见 [视频教程] WPS处理长文档的技巧
  [6]: 用户也可以自定义目录窗口的位置:上、下、左、右,及其大小。建议放在默认位置,即左侧。

附录:文章更新历史

  2009-12-09:改进实现^!1/2/3功能的AutoHotkey脚本。
  2009-11-11:补充“4. 隐藏标示符”。
  2009-11-09:补充截屏,增加改进部分与Python,算是下篇。
  2009-11-06:补充视频,修改并发表,算是上篇。
  2009-05-27:长期跟踪vim.org的习惯让我在第一时间发现了刚刚诞生的VOOF。一试之下,赞叹不已!立即在水木社区vim版 发文推荐


B1:已有评论46 条

  • CooB: 2009-11-09 7:36, #12619

    相当完美的解决方案,明天有东西玩了~~

    回复

  • xbourn: 2009-11-09 16:42, #12624

    看了前面那篇Outlines,这几天正在琢磨怎么用vim实现,哈哈,xbeta老大这文章发正是时候啊..

    回复

  • 晏然自在: 2009-11-09 16:55, #12626

    “近乎圆满,是因为 Vim 并不适合处理太大的txt文件”
    就我使用经验而言,vim打开大文本文件比我用过的其他软件个要快的多,翻屏速度也不卡(主频2.4,内存512M)。也许我打开的文件不算是最大的(文本10M左右)?大家能否推荐一下打开较大快头的文本文件(>10M)的编辑器还有什么?

    回复

    lodwef: 2009-11-09 17:57

    在我用过的编辑器中,百G以上的大文件,大概只有emeditor可以驾驭。

    可惜现在40美元的价格稍贵了一点。

    回复

    I.O.R.I: 2009-11-09 22:16

    是贵,一直很想注册一个,奈何价格……

    回复

    晏然自在: 2009-11-10 06:52

    谢谢回复.还好我还不至于用到编辑上G的文本文件(难以想象).vim对我而言足以.深入学习中…

    xiaodiega: 2009-11-10 23:15

    我用emeditor多年,也很想注册一个…

  • mercuryhg: 2009-11-09 17:30, #12627

    这个要求要安装 PYTHON,不想安装这个,现在就还是用不了。

    回复

  • ewebull: 2009-11-09 18:03, #12629

    输入:Voof,提示缺少python24.dll

    回复

    ewebull: 2009-11-09 18:13

    本机是装了python2.5的。找到了解决办法。

    http://www.gooli.org/blog/gvim-72-with-python-2526-support-windows-binaries/

    回复

  • CooB: 2009-11-09 18:09, #12630

    同样缺少python环境,有无相对环保的解决办法?

    回复

  • wfifi: 2009-11-09 20:33, #12639

    我装的gvim默认只支持2.4,机器上已有2.6,只好重新编译了一个gvim.exe,比较折腾

    回复

  • gxlexperience: 2009-11-09 21:48, #12642

    您好,善用佳软,可否推荐了桌面便签软件。谢谢!

    回复

    sean: 2009-11-10 20:52

    atnotes 在单位用了1年多,非常稳定

    回复

  • yadsun: 2009-11-09 22:53, #12644

    您好,善用佳软,可否写一编文章专门介绍一下vim排版?
    【善用佳软:你们说的排版具体指什么?Vim是纯文本纯辑器,几乎没有格式,更无版式。】

    回复

    Forrest: 2009-11-11 21:55

    强烈申请出排版教程

    回复

  • lilydjwg: 2009-11-10 1:22, #12646

    这个不错。不过在视频中找使用后的效果找了好一会儿。希望以后还是弄个截图。
    【善用佳软:已补充。】

    回复

  • ibbcall: 2009-11-10 2:53, #12650

    我的也报缺少python24.dll,怎样解决啊?

    回复

    lilydjwg: 2009-11-10 04:27

    安装python2.4呗。或者(如果已经装有不同版本的Python2.x)重新编译一下,把python2.6编译进去。
    最好的解决办法是换Linux,就像我这样。

    回复

    ibbcall: 2009-11-11 16:05

    谢谢了!:)

    回复

  • blire: 2009-11-10 3:47, #12651

    可不可以把视频中的极点皮肤发给我?(是极点吧)谢谢!
    【善用佳软:极点5.2,实际是没有skin,但仍需skin目发和文件,freewb\skin\none\skin.ini 内容如下:】
    [状态栏]
    状态栏自动定位=1
    隐藏状态栏=1
    透明度=0
    字号=9
    候选窗按钮文件名=nofile.ini
    图像宽度=75
    图像高度=20
    文本框top=4
    文本框left=20
    文本框right=68
    文本框bottom=16
    状态栏无法自动定位时的位置=0

    [候选窗]

    候选窗光标跟随=0
    汉字候选窗透明度=20
    候选项数=2
    汉字候选窗字号=12
    汉字候选窗圆角弧度=14
    汉字候选窗采用单线框=1
    候选框使用透明边框=0
    汉字候选框式样=3
    自动缩放背景图=0
    汉字候选使用背景图=0
    候选窗背景色=238,238,238
    候选窗前景色=0,0,0
    候选窗边框色=176,176,255
    候选汉字颜色=0,0,0
    候选字提示码颜色=47,3,222
    自动词组前景色=0,0,0
    背景图片文件=no_bmp.bmp
    横坐标=105
    纵坐标=322

    回复

    blire: 2009-11-10 22:33

    谢谢!

    回复

  • CooB: 2009-11-10 18:46, #12665

    安装了python2.4.3重启后使用正常,感谢xbeta。这也是目前最理想的使用组合了。
    为了提高可读性,请教xbeta如何实现以下类似UE的模板效果:
    输入Alt+1自动输出下面模板,^为鼠标定位位置
    〓〓〓〓〓〓〓〓〓〓
    ^ {{{1

    【善用佳软:
    :map <a-1> <esc>O———————-<cr>{{{1<esc>bi
    :imap <a-1> <esc>O———————-<cr>{{{1<esc>bi

    回复

  • hj: 2009-11-10 21:35, #12667

    我原本安装的是python2.6
    也报了2.4dll的问题,下了一个2.4版本的dll,
    dll的错没有,但是还有其他错误,是python interface的问题,重新下载了python-enabled vim的exe替换了,就ok了

    回复

    lilydjwg: 2009-11-11 05:45

    那个应该就是一个重新用python2.6的库编译的Vim了。

    回复

  • hj: 2009-11-10 21:38, #12668
  • lilydjwg: 2009-11-11 5:43, #12676

    xbeta可以试试把python24.dll放到C:\Windows\system32下(这是默认位置)或者gvim.exe所在目录。但即使这样还是会有问题:这个插件是Python写的,其中引用了几个Python文件,所以必须安装Python,否则脚本不能运行,就像运行.Net程序必须安装.Net Framework一样。不过Windows版的Vim编译时用的Python版本有点低。

    回复

  • whgtsq: 2009-11-11 16:41, #12680
  • hj: 2009-11-11 21:31, #12683

    博主有办法把 {{{1 这些东西隐藏掉么,比如在语法文件中设置为背景色,同时还要保存之前的标题语法高亮?
    【善用佳软:可以。vim能做的事有很多,能个性化的地方更是超乎想象。
    把 “^.\+{{{\d” 中的 {{{\d 改为 \({{{\d\)\@= ,这样标题行高亮就不包括这个标识了。
    然后,重新定义标识的前/背色相同即可。
    相关知识 :h /zero-width】

    回复

    lilydjwg: 2009-11-11 23:38

    还是把标识链接到Ignore组比较好,不然换个配色方案还要重新修改它。

    回复

    hj: 2009-11-11 23:42

    哈哈~~行了 谢谢博主啊 折腾了两天终于比较满意了

    回复

  • Jake: 2009-11-12 2:15, #12692

    可以下载vim的源代码修改成你自己机器上的python版本,再编译一下。

    回复

  • 发条狐狸: 2009-11-12 3:00, #12694

    有点不明白为什么善用佳软从来不用带图片的笔记.因为很多教程什么的都有图片.即使学会了,以后也可以拿出来回顾一下.毕竟人的脑袋总有想不起来的一天.
    【善用佳软:因为我经常读、经常写,但极少复制下载。】

    回复

  • CooB: 2009-11-12 5:51, #12705

    xbeta,我对笔记的苛刻要求和你简直一模一样,要求用最简单的htm实现文字+图片,同时不影响htm源码的阅读、编辑和树状快速定位(VOOF)。仔细看了前面《我这样记笔记:gvim+。。。》和《大道至简,终于。。。》二文,但对详细实现仍比较模糊,恳请xbeta照顾下我等html半文盲,给一个全面的htm笔记源码模板。在下感激不尽~~~!!!
    【善用佳软:讲完基础内容之后,会就此做一个总结。】

    回复

  • CooB: 2009-11-12 5:56, #12706

    要求用最少的htm标识,最直观的文本格式来编辑带图的内容,同时方便地通过gvim来调用浏览器打开阅读,是最理想的笔记了。这里介绍过比较优秀的笔记软件我都用过(正版和盗版),但都不满意,唯有随心所欲的自行控制htm显示,随心所欲的快速自行编辑内容,才是我的最佳笔记方式。
    另外我还担心由于htm用到不合规范的源码,导致若干年后的htm笔记浏览器显示有问题,不知道会不会杞人忧天了。

    回复

  • wgf4242: 2009-11-18 12:57, #12814

    :Voof
    显示无法加载库pathon2.4怎么办哪?

    回复

  • Steve: 2009-11-19 15:21, #12825

    弱问一下,在insert模式下怎么移动光标比较方便?方向键太远了?
    另外,map :tabnew里面M-t代表什么按键啊?

    回复

  • Forrest: 2009-11-27 9:10, #12997

    用gVim来写文章,一个自然段就是一行,常常会碰到由于是文章的一段话,这一行字会特别长的情况,打开自动折行,要好几行甚至十多行才能显示完全。这这种情况下,vim只会在在当前窗口下能把整个段落完全显示的时候,才将其显示;而在不能完整显示的情况,它会用@来代替,请问有没有办法让vim在当前窗口能显示这行字的多少就显示多少,而不要等整行字都能显示时才将其显示出来?谢谢。

    附件为截图。

    回复

    Forrest: 2009-11-27 09:11

    本来准备发到你xbeta.info的邮箱里,可是发不过去~

    回复

    Forrest: 2009-11-27 12:50

    查到解决方法:
    set display=lastline即可。
    另外还可以用gj和gk可以上下移动屏幕显示的一行。

    新的问题出现了:如果一行文本有几千汉字时,gVim的支持非常差,右边滚动条滚动和鼠标滚动毫不自然,有时很难凭借滚动来移动到自己想要到的位置。如果用gj和gk来移动,尤如隔靴搔痒,gVim的高效性荡然无存。不知道善用佳软是如何用gVim来操作中文长行的,期待你的回复。

    回复

    winstarst: 2009-12-27 02:04

    老兄,可以试着在模式行中加上set fo+=mM,然后就能自动对中文换行了,注意是真正的换行,不是折行,如果修改后可以用gq命令重新格式化,用起来相当方便。

    感谢佳软,一直想在VIM下写日志什么的,但总是觉得管理起来麻烦,以前都是用UE写的,这次终于知道什么是“圆满”了,多谢佳软。

    我已经把一年多的日志都合并在一起了,用VIM编写,还可以用X加密,只是文件大了有些慢。

    回复

  • hellocat: 2009-11-30 11:52, #13035

    【善用佳软:因为我对Python并不“理解”,并且是很早之前安装的VOOF,所以,现在无法提供细致的解决办法。我争取找一台无VOOF和Python的PC,再试一下问题和解决办法。】

    输入“:Voof”报错“无法加载库 python26.dll”
    于是跟着文中的介绍下载了“Gvim 7.2 with Python 2.5/2.6 support Windows binaries”(http://www.gooli.org/blog/gvim-72-with-python-2526-support-windows-binaries/),将相应文件替换后还是报相同的错误。
    于是下载并安装了python2.6 for windows(http://download.csdn.net/source/676273
    ),结果还是不行。
    很想在用上为善用佳软长期寻找画上完美句号的Voof,可是却被这一问题阻挠,希望能得到你的帮助。

    回复

    tc: 2009-12-03 20:34

    我这里也是一样的,我的VIM是在D盘的
    是不是因为这个问题啊?
    希望佳软件解决下
    谢谢了

    回复

    tc: 2009-12-04 10:26

    找到原因了,安装python之后,要在系统环境变量把它的路径加入,让vim可以找到它。就解决了你的问题,再谢谢佳软

    回复

  • wangshu: 2010-01-23 8:53, #14974

    Voof的这个方法是不是有问题,当你要记录的文本里面本身就含有{{{n的时候,tree就乱了。

    对于想对一些程序或者数学公式做笔记的人来说,{{{n出现的概率太大了。

    回复

    winstarst: 2010-01-31 23:02

    可以自己定义标识符的,比如换成<<<

    回复

我要发表评论

您的留言:(与本文无关问题,请到小众客栈提问)
NOTICE: You should type some Chinese word (like “你好”) in your comment to pass the spam-check, thanks for your patience!

 名称/Name (* 必需)
 邮箱/Email (* 必需)
 链接/Link