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

ysa*_*sap 4 vim gvim find-and-replace text-formatting

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

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

例如,给定的表:

A aa
BBBB bbb
CC c
Run Code Online (Sandbox Code Playgroud)

我想要的是:

A      aa
BBBB   bbb
CC     c
Run Code Online (Sandbox Code Playgroud)

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

Vim命令可能类似于:

:0,$ s/\(.*\) \(.*\)/\1(******N)\2/
Run Code Online (Sandbox Code Playgroud)

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

更新1:所以,Vim 有这个printf()功能。它可以直接从命令提示符使用,还是必须包含在 Vim 脚本中,并在所有行中运行显式循环?

Hep*_*ite 6

您可能想尝试 vim.org 上的 align 插件之一。我使用 Campbell 博士最流行的一个:http : //www.vim.org/scripts/script.php? script_id= 294

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

:%s/pattern/\=len(submatch(0))/g
Run Code Online (Sandbox Code Playgroud)

所以你使用 printf() 的想法会起作用:

:%s/\(.*\) \(.*\)/\=printf('%-7s %-7s',submatch(1),submatch(2))/
Run Code Online (Sandbox Code Playgroud)