String VIM中的字符串格式(填充)

String VIM中的字符串格式(填充),string,vim,formatting,String,Vim,Formatting,VIM中的字符串格式让我头疼 我想我非常习惯Python中的字符串格式,在这里可以指定如何使用 输出字符串将被分隔,中间有多少空格,以此类推 所以我有一个VIM插件,它将信息输出到一个暂存缓冲区,如下所示: Line: 1 ==>> ErrorName ==>> File Path: /foo 在将字符串附加到缓冲区之前,我构建了这个字符串,一切都非常好。但当你有不同的行号(数字)时,你会得到如下结果: Line: 1 ==>> Error ==>&g

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
我试着用标签代替空格,但这只会让事情变得更糟(空格变得更大)。所以我理想的最终结果应该是这样的:

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)
.For
PrePad
%
之后删除
-
。printf是我所期待的:本机字符串格式。谢谢你的提示。@ZyX:谢谢。我显然不知道printf解决方案。我自己将来会发现它的许多用途。