![如何在 Vim 中格式化字符串替换或文本行?](https://linux22.com/image/1403321/%E5%A6%82%E4%BD%95%E5%9C%A8%20Vim%20%E4%B8%AD%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%9B%BF%E6%8D%A2%E6%88%96%E6%96%87%E6%9C%AC%E8%A1%8C%EF%BC%9F.png)
用 替换匹配项时,可以格式化替换字符串吗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