String VIM中的字符串格式(填充)
VIM中的字符串格式让我头疼 我想我非常习惯Python中的字符串格式,在这里可以指定如何使用 输出字符串将被分隔,中间有多少空格,以此类推 所以我有一个VIM插件,它将信息输出到一个暂存缓冲区,如下所示:String VIM中的字符串格式(填充),string,vim,formatting,String,Vim,Formatting,VIM中的字符串格式让我头疼 我想我非常习惯Python中的字符串格式,在这里可以指定如何使用 输出字符串将被分隔,中间有多少空格,以此类推 所以我有一个VIM插件,它将信息输出到一个暂存缓冲区,如下所示: Line: 1 ==>> ErrorName ==>> File Path: /foo 在将字符串附加到缓冲区之前,我构建了这个字符串,一切都非常好。但当你有不同的行号(数字)时,你会得到如下结果: Line: 1 ==>> Error ==>&g
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
我试着用标签代替空格,但这只会让事情变得更糟(空格变得更大)。所以我理想的最终结果应该是这样的:
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
我非常了解有帮助的插件(例如tablar.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
起初我怀疑这种方法是否有效。最初让我感到不舒服的是
a:amt-len(a:s)
,因为你需要足够的填充物来让它工作。这就解决了我的问题,感谢您花时间在这里获取函数。@Alfredeza只有在您只接受ascii码的情况下,才应该在这里使用len()
。尝试用strwidth()
(仅限vim-7.3)或len(拆分(a:s,'\zs'))
(不处理全宽字符)替换每个len。@alfredeza但如果仅处理ascii是正常的,那么您可以丢弃这两个函数,只使用内置的printf:echo printf('Line:%-*u==>%-*s==>>文件路径%s',8,linenum,12,errmsg,path)
.ForPrePad
在%
之后删除-
。printf是我所期待的:本机字符串格式。谢谢你的提示。@ZyX:谢谢。我显然不知道printf解决方案。我自己将来会发现它的许多用途。