如何在Vim中快速插入类似于"=========="的分隔线?

6

我正在编辑重组文本文件。 我经常需要在一行中放置一些像“=-`~”这样的字符,并且我希望该行的长度与上一行匹配。 在vim中应该如何做到这一点?

a long long title
=================

谢谢!

5个回答

17

另一个可以工作的:

yypv$r=

13
"yypVr=" 是一个稍微比较短但是采用相同技巧的方法。 - Randy Morris
3
@sidyll yy 和 Y 需要键入相同的次数:P。此外,许多人使用 nnoremap Y y$ ,这样Y就与D和C保持一致。 - Randy Morris

6

你觉得 yyp:s/./=/g 怎么样?

你可以将其映射到一个键上,例如 :map <F5> yyp:s/./=/g<CR>


1
这不是最佳答案,请参见下面更好的解决方案,使用可视模式替换粘贴的行,而不是使用替换功能。 - Tom
使用替换的坏处是什么? - Johan Kotlinski
在这种情况下,这是过度的,它需要将正则表达式应用于行上的每个字符。它还会更改您当前的搜索寄存器,因此现在您将无缘无故地突出显示整个文档。它也不会处理行首的任何空格。 - Tom
哦,是的。高亮显示不太好:D - Johan Kotlinski

2
如果您的行没有任何尾随空格:
Hello World    

普通模式:

YpVr=

结果为:

Hello World
===========

解释

Y -> 复制整行,类似于 yy
p -> 粘贴该行
V -> 在可视化模式下选择整行 r -> 用后一个字符替换所选内容的全部
= -> 用来替换其他字符的字符

如果您的行有前导空格,例如:

    Hello World

使用:

Ypv$r=

结果:

    Hello World
    ===========

我们使用v$视觉选择到行末,而不是使用V选择整行内容。
如果有尾随空格,您可以使用g_移动到最后一个非空格字符。

2

我建议使用yypver=尽可能避免搜索和换档按钮。这当然也可以映射到一个按键上。


当然,Barry Brown是正确的,我的测试案例只有一个单词,有点太简单了。 - chelmertz
2
不是故意捣乱,但你是不是想说 yypVr=?为了避免给未来的读者带来困惑。 - sa125
@sa125:实际上我没有,但是如果该行不以\s+结尾,那当然是一个有效的解决方案。 - chelmertz
“e” 不只会到第一个单词的结尾吗? - dash-tom-bang

0

当光标放置在一行很长很长的代码上时,你可以使用类似以下的方法

:s/\(.*\)/\=submatch(1) . nr2char(13) . repeat('=', strlen(submatch(1)))/

为了更方便地进行替换,我会使用一个映射表:
nmap __ :s/\(.*\)/\=submatch(1) . nr2char(13) . repeat('=', strlen(submatch(1)))/

所以,你可以通过键入__来给光标所在的行添加下划线。


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