2011-02-11 133 views
2

VIM中的字符串格式令我头疼。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中实现我需要的字符串格式?

回答

3

我使用了两个小函数,没什么特别的,一个在字符串之后添加填充,另一个如果我想在字符串之前添加。 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 
+0

起初我怀疑这种方法会起作用。最初抛弃我的是'a:amt - len(a:s)',因为你需要ENOUGH填充才能使它工作。这解决了我的问题,感谢您花时间在这里获取功能。 – alfredodeza

+1

@alfredodeza只有当你接受ascii时,你才应该使用'len()'。尝试用'strwidth()'(仅vim-7.3)或'len(split(a:s,'\ zs'))'(不处理全角字符)替换每个len。 – ZyX

+3

@alfredodeza虽然如果只处理ascii是正常的,那么你可以扔掉这两个函数,并使用内置的printf:'echo printf('Line:% - * u == >>% - * s == >> FilePath%s',8,linenum,12,errmsg,path)'。对于'PrePad',在'%'后面删除'-'。 – ZyX