![在 Vim 中缩写分隔符的更好方法](https://linux22.com/image/1403943/%E5%9C%A8%20Vim%20%E4%B8%AD%E7%BC%A9%E5%86%99%E5%88%86%E9%9A%94%E7%AC%A6%E7%9A%84%E6%9B%B4%E5%A5%BD%E6%96%B9%E6%B3%95.png)
我想要一个简单的缩写来作为快速页面分隔符,例如
键入:
'>>>'
变成:
‘===============’
另外还有 2 个要求:1) 我希望能够执行连续缩写(一行中不止一个)和 2) 能够在分隔符后输入文本,然后能够添加另一个分隔符。因此,最终的分隔符可能如下所示:
==============================文本标题==============================
我尝试了以下行:
iabbr <silent> >>> ===============<c-r>=Eatchar('\m\s\<bar>/')<cr>
...但由于涉及前导字符类别的细微差别(参见 :h full-id 等),它无法满足上述要求。我最终得到了以下结果:
inoremap >>> ===============<c-r>=Eatchar('\m\s\<bar>/')<cr>
它可以工作,但我的感觉是,当我真正想要的只是一个简单的字符串替换时,重新映射可能有点过头了。有没有更好的方法来实现这一点?
答案1
处理这个问题最简单的方法可能是调用用户定义的函数。我想出了以下概念证明。不过有几个缺点:
如果使用缩写而不是映射,则触发缩写的缩写后输入的字符将作为调用从用户捕获的文本的一部分包含在内input()
,因此我使用了映射。
映射的问题在于,当您键入 > 时,它不会显示在文件中,直到您键入一些内容告诉 Vim 您未尝试触发映射(或者您等待足够长的时间以使映射检测超时)。
imap <expr> >>> MyHeader('=')
function! MyHeader(fillchar)
let l:text = input("Header Text: ")
let l:len = ((&tw ? &tw : 79) - len(text) - 2) / 2
let l:fill = repeat(a:fillchar, l:len)
return l:fill . ' ' . l:text . ' ' . l:fill
endfunction
由于这只是一个概念验证,因此我没有尝试完善它。例如,如果标题文本或标题的字符数为textwidth
奇数,则标题的宽度可能会“偏离一”。我将由您自行修复该问题并添加您想要的任何其他改进。