VIM 中的字符串格式化让我头疼。
我想我已经习惯了 Python 中的字符串格式化,你可以在其中指定如何格式化 输出字符串将被分隔,之间有多少个空格等等。
所以我有一个 VIM 插件,它将信息输出到临时缓冲区,如下所示:
Line: 1 ==>> ErrorName ==>> File Path: /foo
我在将字符串附加到缓冲区之前构建了该字符串,一切都运行得非常好。但只要你有不同的行号(数字方面),你就会得到这样的结果:
Line: 1 ==>> Error ==>> File Path: /foo
Line: 123 ==>> ErrorNameLong ==>> File Path: /foo
Line: 12 ==>> ErrorShort ==>> File Path: /foo
我尝试过用制表符代替空格,但这只会使情况变得更糟(空格变得更大)。所以我理想的最终结果必须是这样的:
Line: 1 ==>> Error ==>> File Path: /foo
Line: 123 ==>> ErrorNameLong ==>> File Path: /foo
Line: 12 ==>> ErrorShort ==>> File Path: /foo
我很清楚有帮助的插件(例如 tabular.vim),但由于这本身就是一个插件,我不想仅仅为了简单的字符串格式化而需要依赖不同的插件。
这些是我到目前为止尝试过的事情:
- 制表符(以及制表符 + 空格)
- 搜索并替换为制表符(以及在缓冲区中渲染后带有空格的制表符)
在我看来,必须有一个好的方法来解决这个问题,但我只是缺少它。
如何在 VIM 中实现我需要的字符串格式?
最佳答案
我使用两个小函数,没什么花哨的,一个在字符串后面添加填充,一个如果我想在字符串前面添加。 PrePad 函数允许填充字符的可选参数,我有时用它来用前面的 0 填充数字。
function! Pad(s,amt)
return a:s . repeat(' ',a:amt - len(a:s))
endfunction
" Pad('abc', 5) == 'abc '
" Pad('ab', 5) == 'ab '
function! PrePad(s,amt,...)
if a:0 > 0
let char = a:1
else
let char = ' '
endif
return repeat(char,a:amt - len(a:s)) . a:s
endfunction
" PrePad('832', 4) == ' 823'
" PrePad('832', 4, '0') == '0823'
使用 Pad() 构建原始日志消息会很简单。像这样的东西:
echo 'Line: ' . Pad(linenum,8) . '==>> ' . Pad(errmsg,12) . '==>> FilePath: ' . path
关于VIM 中的字符串格式化(填充),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4964772/