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

时间:2011-02-11 01:35:01

标签: string vim formatting

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

1 个答案:

答案 0 :(得分:4)

我使用两个小函数,没什么花哨的,一个用于在字符串后面添加填充,另一个用于在字符串前添加。 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