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

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

最佳答案

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

相关文章:

python - 如何循环遍历一个字符串并返回一个在特定字符处停止的新字符串

Java 字符串缓冲区

java - 我将如何在 Java 中拆分一个句子

vim - 切换到同一行的分割窗口

vim 拉出整行,但稍后在文本之间粘贴文本部分?

vim - 在 vimrc 中关闭 gitgutter

java - HTML/CSS 为什么版权标志没有被正确解释?

java - Java 中字符串的反序列化

c - 使用 scanf 读取两个可选的分隔整数

javascript - 使用 toLocaleString() 从通过 javascript 返回的日期中删除 'EDT' 的最佳方法