定制表格折叠的改进

时间:2018-08-13 10:38:15

标签: vim

我之前曾问过这个问题How to create a strictly columnar display in Vim for a tab-separated file,并得到了以下令人满意的答案:

:syntax match Entity "[^\t]\{8}\zs[^\t]*[\t\n]" conceal cchar=|
:set conceallevel=1

现在,我想将其保留在一个函数中,并将硬编码值8制成一个变量;我还希望能够仅在一系列行中调用它。我已经以一种非常幼稚的方式尝试过:

function Tt(w)
  syntax match Entity "[^\t]\{" . a:w . "}\zs[^\t]*[\t\n]" conceal cchar=| 
  set conceallevel=1
endfunction

我知道这一定很容易,我们将不胜感激。这是来自热爱vim但无法为其脚本语言创建所需顶部空间的人。

1 个答案:

答案 0 :(得分:2)

尝试这样的事情:

function! Tt(w) range
    let l:range_pattern = printf('\%%>%il\%%<%il', a:firstline-1, a:lastline+1)
    let l:full_pattern = printf('%s[^\t]\{%i}\zs[^\t]*[\t\n]', l:range_pattern, a:w)
    exe printf('syntax match Entity "%s" conceal cchar=|', l:full_pattern)
    set conceallevel=1
endf

说明:

  • 它使用range关键字来手动处理范围。请注意,如果在调用函数时根本没有给出范围,则范围将限于当前行(整个文件使用:%call Tt(8))。如果您不想使用此功能,则可以删除range关键字,删除第一行,然后将第二行替换为:

    let l:full_pattern = printf('[^\t]\{%i}\zs[^\t]*[\t\n]', a:w)
    
  • 变量l:range_pattern存储模式的一部分,该部分将限制匹配的范围;为此,它使用模式原子\%>l\%<l

  • 要执行以字符串形式给出的完整命令syntax match ....printf()返回字符串),必须使用:execute命令({{1 }}(缩写形式),如Araxia在您的第一个问题中所建议的那样。

  • Araxia suggested一样,您也可以删除函数的参数:exe,并在函数代码中使用a:w