Vim,如何在每一行下面 添加一个或多个空白行。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vim,如何在每一行下面 添加一个或多个空白行。相关的知识,希望对你有一定的参考价值。
我在做一个表 , 需要在每一行下面 插入空白行。 有那个大神知道吗?
windclsoe 给出的替换是一种思路。一般来说如果要在一行下面添加一行,容易想到的是用 o 这个命令。如果想添加三行的话,是 3o。
如果 3o 后立即退出插入模式的话,就可以添加三个空白行。如果输入一些文字再退出,可以添加三个相同文字的行。试一下就知道了。
如果想在每一行执行相同的命令,在 vim 里可以用 :g 实现。一般的语法是 :g/pattern/cmd
它表示在匹配 /pattern/ 这个正则表达式的行上执行 cmd 命令(指 ex 模式的命令,也称冒号命令)。而 /^/ 这个表达式,用于匹配行首。因为任何一行都有行首,你的要求就很容易实现了:
:g/^/norm 3o
norm 这个命令的意思是,把后面的参数看成是在普通模式下的按键。 参考技术A %s/\n/\r\r/
会在每行下添加一个空白行,拿分不谢^_^本回答被提问者采纳
如何在 Vim 的每一行末尾添加一个字符串?
【中文标题】如何在 Vim 的每一行末尾添加一个字符串?【英文标题】:How can I add a string to the end of each line in Vim? 【发布时间】:2010-10-10 07:34:53 【问题描述】:我想在 Vim 的每一行末尾添加*
。
我试了代码不成功
:%s/\n/*\n/g
【问题讨论】:
你的不起作用,因为在:s///
的右侧,\n
对应于一个空字符。 :help sub-replace-special
部分是相关的。
【参考方案1】:
:%s/$/\*/g
应该有效,:%s/$/*/g
也应该有效。
【讨论】:
有没有办法在同一列插入'',因为所有行的长度不同,所以第1行可能在第15列有'',但是行2 在第 25 列有“*”。 每行只有1个EOL,所以g
标志是不必要的。
我想在每行的开头添加 / :1,$s/^/\/g 为我工作。【参考方案2】:
我认为使用视觉块模式是处理这类事情的更好、更通用的方法。这是一个例子:
This is the First line.
This is the second.
The third.
插入“Hello world”。 (空格 + 剪贴板) 在每一行的末尾:
在第一行的字符上,按 Ctrl-V(如果是 Ctrl-V,则按 Ctrl-Q 是粘贴)。 按 jj 将可视块扩展到三行。 按 $ 将可视块扩展到每行的末尾。按 A 然后空格然后输入Hello world。 + 然后 Esc。结果是:
This is the First line. Hello world.
This is the second. Hello world.
The third. Hello world.
(来自Vim.Wikia.com的示例)
【讨论】:
可以点击G
移动到最后一行,而不是按jj
。这在大文件中很有用,在这种情况下按j
直到你打到最后一行是不切实际的。
同意视觉块在这里最干净,也更可扩展
请注意,这似乎并不适用于所有行,但在您按 Esc 后,它会通过并将其添加到所有行。
Visual Block 在使用 vim 作为其他东西的扩展时会导致问题和错误,比如 VS Code。在这些情况下,搜索和替换原始用户的要求是可靠的选择。
确保使用大写 A,小写“a”不起作用。【参考方案3】:
一个选项是:
:g/$/s//*
这将找到每个行尾锚点并将其替换为*
。我说的是“替代”,但实际上,它更像是一个附加,因为锚是一个特殊的东西,而不是一个常规字符。如需更多信息,请参阅Power of g - Examples。
【讨论】:
正则表达式中的 s// 是什么意思?我知道一个类似的命令,:g/ / /p,(grep)。我很确定你的命令和我的很接近,至少在结构上是这样。 s 是替代 - 它用星号替换行尾锚(好吧,实际上并没有替换它,因为它是一个锚点)。【参考方案4】:如果你想在每一行的末尾添加 Hello world:
:%s/$/HelloWorld/
如果您想针对特定的行数执行此操作,例如从 20 到 30,请使用:
:20,30s/$/HelloWorld/
如果您想在每一行的开头执行此操作,请使用:
:20,30s/^/HelloWorld/
【讨论】:
【参考方案5】:最后你真的不需要g
。于是就变成了:
:%s/$/*
或者,如果您只想在末尾添加 *
,例如第 14-18 行:
:14,18s/$/*
或
:14,18norm A*
【讨论】:
【参考方案6】:%s/\s*$/\*/g
这样可以解决问题,并确保忽略前导空格。
【讨论】:
【参考方案7】:...并在每一行前面加上 *,
%s/^/*/g
【讨论】:
这没有回答问题。【参考方案8】:比 :search 命令还要短:
:%norm A*
这就是它的意思:
% = for every line
norm = type the following commands
A* = append '*' to the end of current line
【讨论】:
伙计,没有 vi 或 vim 线程可以让我学到一些东西。今天我学习了规范。正如他们在 Cheers 上所说的那样,“Norm!” 对于前置,您只需使用 0i*,0 将您带到行首,i 表示插入模式,* 表示 *。 D: 作为VimGolfer,我不得不补充一点,使用I*
而不是0i*
可以为您节省一次按键操作。
另一个提示: 这也适用于范围。只需在可视模式下突出显示行并按:
,这将使用:'<,'>
预先填充命令,然后您可以将其转换为:'<,'>norm A*
对于前置,请改用I
- :%norm I*
【参考方案9】:
还有:
:g/$/norm A*
还有:
gg<Ctrl-v>G$A*<Esc>
【讨论】:
啊……第二个也可以与选择的线条一起使用。不错! 你能解释一下第一个例子吗? @CodyPollg
是global
命令,它对每个匹配的行执行一些操作。 $
匹配每一行。也可以是^
或.*
。 norm 执行您通常在命令模式下使用的命令。所以A*
表示将*
附加到行尾。【参考方案10】:
:%s/\n/*\r/g
您的第一个在其他任何地方都是正确的,但由于某种原因,Vim 必须有不同的换行符处理。
【讨论】:
在我的 Vim 版本中 \n 工作,但这只是用 * 替换换行符,有效地加入行。 这个命令已经过验证,可以在我尝试过的每个 Vim 版本上正常工作。你用的是windows版本还是什么的?以上是关于Vim,如何在每一行下面 添加一个或多个空白行。的主要内容,如果未能解决你的问题,请参考以下文章