Vim:使用字符填充行

16

如何重复在一个或多个行的结尾添加一个字符,将该行(行)填充到特定列?

例如:
(“x”表示第40列,不是行中的字符;文本后没有空格或制表符)

line one                               x
line two                               x
line three                             x
line eleventy-billion                  x
成为
line one ------------------------------x
line two ------------------------------x
line three ----------------------------x
line eleventy-billion -----------------x
2个回答

29

通过结合\=submatch()repeat()函数:

:%s/\v^.*$/\= submatch(0) . " " . repeat("-", 39 - len(submatch(0)))

我大致明白你在这里做什么,但开头的\v是什么意思?此外,为什么运行该替换会破坏语法着色?O_o。 - Yewge
3
正则表达式中的“\v”会使所有标点符号变成特殊字符;我之所以这样做是出于习惯,这样我就不必记住哪些是特殊字符,哪些不是。除非额外的破折号是无效语法,否则它不应该破坏语法高亮显示。尝试使用Ctrl-L重新绘制屏幕。 - Eevee
3
哦,我明白了。在你进行搜索或替换后,Vim(开启 hlsearch)会突出显示所有匹配项,而我的正则表达式匹配……一切,因此整个文档都被突出显示,遮盖了语法颜色。使用 :noh 命令关闭上次搜索的高亮显示。 - Eevee
你说得对,这是因为文档中的所有内容都被突出显示,而不是与语法着色有关。但是出于某种原因,即使你从替换的开头删除“%”,因此只将其应用于单个行,整个文档仍然会被突出显示。 - Yewge
1
是的,搜索高亮应用于整个文档,不管您的:s范围是什么。 - Eevee
显示剩余2条评论

11

万一未来有人偶然发现这篇文章,我有一种替代方法(我认为)更容易记住,在极少数需要手动填充某些行的情况下使用。

输入文本:

Here are some words
They do not have equal length
I want to insert characters after them until column 40
How to do?

你输入的内容:

gg                // Position cursor anywhere on first line you want to pad
q1$40A-<Esc>d40|q // Looks more complex than it is.
                  // Here, in English:
                  // 1. Record a macro in slot 1
                  // 2. Go to the end of the line, then *A*ppend a '-' 40 times
                  // 3. Delete from cursor position (which is still at the end of the line) to column 40
                  // 4. Stop recording
:1,4normal @1     // Repeat macro "1" for every line

输出文本:

Here are some words-----------------
They do not have equal length-------
I want to insert characters after t-
How to do?--------------------------

希望您能够调整命令的各个部分,使其完全符合您的要求。 请注意 ,超过所需列跨度的文本将被截断(在第3行演示)。


这是一个非常简洁和有创意的答案,甚至还成功地加入了一个宏! - Kes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接