如何在 Vim 中格式化字符串替换或文本行?

如何在 Vim 中格式化字符串替换或文本行?

用 替换匹配项时,可以格式化替换字符串吗Vim

假设我有一个包含 2 列表格的文件,其中每行的条目都用空格分隔。条目(和行)的宽度不固定。我想通过添加适当数量的空格来格式化表格,使第 2 列项目全部对齐。

例如给定的表:

A aa
BBBB bbb
CC c

我想要的是:

A      aa
BBBB   bbb
CC     c

(请注意,标签在这里不是解决方案。)

Vim命令可能看起来像这样:

:0,$ s/\(.*\) \(.*\)/\1(******N)\2/

并且(******N)应该用格式代码替换,以将第二个元素放在第 N 个字符的位置。

更新 1:那么,Vim 具有该printf()功能。是否可以直接从命令提示符中使用它来实现该目的,还是必须将其包含在 Vim 脚本中,并使用显式循环遍历所有行?

答案1

你可能想尝试一下 vim.org 上的对齐插件。我使用的是 Campbell 博士最受欢迎的一个:http://www.vim.org/scripts/script.php?script_id=294

除此之外,你可以从替代命令中调用 Vim 函数,但缺点是全部的替换模式必须是表达式。请参阅“ :help sub-replace-expression”和“ :help submatch()”。例如,如果我们想用字母计数替换匹配的模式:

:%s/pattern/\=len(submatch(0))/g

因此,使用 printf() 的想法是可行的:

:%s/\(.*\) \(.*\)/\=printf('%-7s %-7s',submatch(1),submatch(2))/

答案2

您没有指定您的系统,但是在类 UNIX 系统上,您可以使用该column命令作为过滤器:

:%!column -t

参考:

:help filter
$ man column

相关内容