asciidoc的vim折叠:在section-title行中包含_previous_行

时间:2015-05-03 21:07:46

标签: vim anchor folding asciidoc asciidoctor

摘要即可。如何(以及如果?)我可以获得vim折叠以自动将截面标题行之前找到的asciidoc [id='']行与为该部分创建的折叠相关联?

详细信息即可。 asciidoc内容允许节标题标识(除其他外,映射到呈现的HTML-anchor-tag名称并且还允许文档内交叉引用),否则已知(我认为?)为{{ 3}}。但是,[id='']行blurb必须在之前放置到节标题行,即使它是该节的一部分。例如:

[id='under_construction', reftext='Under Construction']
## DISCLAIMER: This Document is Under Construction

这使得asciidoc文件的vim-fold更难管理,因为折叠部分移动“丢失”前一行(并且所有部分id都被洗牌),因为在眼中vim fold,前一行属于上一节。

1 个答案:

答案 0 :(得分:1)

我不确定如何使用asciidoc进行vim折叠,但我认为新部分以##开头(或者==,从简短的角度来判断你提供的链接),并且[id = ...]提供额外的关于该部分的信息。 因此,您可以查看Steve Losh's markdown folding:h fold-expr。 所以这里是降价折叠的修改代码:

function! Fold_askiidoc(lnum)
  let l1 = getline(a:lnum)

  if l1 =~ '^\s*$'
      " assume sections are separated by blank lines
      return '0' 
  endif

  " check next line 
  let l2 = getline(a:lnum+1)

  if  l2 =~ '^#'
      " next line starts with hashes (or '=', or any symbol)
      " number of hashes specifies indent level
      return '>'.matchend(l2, '^#\+')
  else
      " otherwise keep previous foldlevel
      return '=' 
  endif
endfunction

setlocal foldexpr=Fold_test(v:lnum)
setlocal foldmethod=expr

它检查每一行,如果它是空白的,则假设它是一个部分的结尾。如果下一行以#开头,则表示折叠从当前行开始。 #的数量指定折叠级别。 它会在节标题之前折叠任何非空白行,如果只想要特定行,例如id = [''],则必须添加其他字符串比较。

您可以将其保存到$HOME/.vim/after/ftplugin/asciidoc.vim。我不确定文件类型,如果它存在或你必须单独创建它。从那里开始,每次打开特定文件时都应自动加载。或者您可以将功能放在vimrc中并指定    setlocal foldexpr = Fold_test(v:lnum)    setlocal foldmethod = expr 作为此文件类型的自动命令。