我之前曾问过这个问题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但无法为其脚本语言创建所需顶部空间的人。
答案 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
。