有时我想跨多行编辑某个可视文本块。

例如,我会取一个看起来像这样的文本:

name
comment
phone
email

让它看起来像这样

vendor_name
vendor_comment
vendor_phone
vendor_email

现在我要做的是…

Select all 4 row lines of a block by pressing V and then j four times. Indent with >. Go back one letter with h. Go to block visual mode with Ctrlv. Select down four rows by pressing j four times. At this point you have selected a 4x1 visual blocks of whitespace (four rows and one column). Press C. Notice this pretty much indented to the left by one column. Type out a " vendor_" without the quote. Notice the extra space we had to put back. Press Esc. This is one of the very few times I use Esc to get out of insert mode. Ctrlc would only edit the first line. Repeat step 1. Indent the other way with <.

如果单词前至少有一列空白,我就不需要缩进。如果我不需要用c清除可视块,我就不需要空白。

但是如果我必须清除,那么是否有一种方法来做我上面所做的而不创建所需的缩进空白?

还有为什么一次编辑多行只能通过退出插入模式与Esc在Ctrlc?


这里有一个更复杂的例子:

name    = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone   = models.CharField( max_length = 135, blank = True )
email   = models.EmailField( blank = True )

to

name    = models.whatever.CharField( max_length = 135 )
comment = models.whatever.TextField( blank = True )
phone   = models.whatever.CharField( max_length = 135, blank = True )
email   = models.whatever.EmailField( blank = True )

在这个例子中,我将在.上执行垂直可视块,然后在插入模式下重新插入它,即输入.whatever..希望现在你能看到这种方法的缺点。我只能选择一列在垂直位置相同的文本。


当前回答

我想在只有vi(没有nano)的服务器上注释掉一些配置文件中的很多行,所以可视化方法也很麻烦 我是这样做的。

打开vi文件 显示行号:设置行号!或:设置数字 然后使用行号将行首替换为“#”,如何?

: 35, 77年代/ ^ / # /

注:数字包含在内,行数从35行到77行,都包含将被修改。

要取消注释/撤销,只需使用:35,77s/^#//

如果你想在每一行代码后添加一个文本单词作为注释,你也可以使用:

:35,77s/$/#test/(适用于Python等语言)

:35,77s/;$/;\/\/test/(适用于Java等语言)

积分/参考资料:

https://unix.stackexchange.com/questions/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim https://unix.stackexchange.com/questions/120615/how-to-comment-multiple-lines-at-once

其他回答

假设你有这个文件:

something

name
comment
phone
email

something else
and more ...

你需要在“name”、“comment”、“phone”和“email”前面添加“vendor_”,而不管它们出现在文件中的哪个位置。

:%s/\<\(name\|comment\|phone\|email\)\>/vendor_\1/gc

c标志将提示您确认。如果你不想要这个提示,你可以去掉它。

我来这里粘贴许多行已经复制的字符串。当用y复制时,我们可以粘贴,在插入模式下,按Ctrl+r,然后按“”。这将有相同的结果,在正常模式和按p。这被称为从注册表粘贴。

假设缓冲区中有以下文本:

vendor_something

text
to_receive
the_paste
pattern

然后我们可以把光标指向vendor_中的v,按下v,使用l向右移动,直到选择我们想要粘贴在下面的文本中的下划线符号。在此之后,我们可以将光标指向“text”的开头(vendor_something后面两行)并按Ctrl+v。然后我进入插入模式,我们按3j Ctrl+r”Esc。这个序列的结果将是:

vendor_something

vendor_text
vendor_to_receive
vendor_the_paste
vendor_pattern

我想在只有vi(没有nano)的服务器上注释掉一些配置文件中的很多行,所以可视化方法也很麻烦 我是这样做的。

打开vi文件 显示行号:设置行号!或:设置数字 然后使用行号将行首替换为“#”,如何?

: 35, 77年代/ ^ / # /

注:数字包含在内,行数从35行到77行,都包含将被修改。

要取消注释/撤销,只需使用:35,77s/^#//

如果你想在每一行代码后添加一个文本单词作为注释,你也可以使用:

:35,77s/$/#test/(适用于Python等语言)

:35,77s/;$/;\/\/test/(适用于Java等语言)

积分/参考资料:

https://unix.stackexchange.com/questions/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim https://unix.stackexchange.com/questions/120615/how-to-comment-multiple-lines-at-once

使用ctrl - lv选择要修改的行。 新闻: I:插入到所选内容之前。 A:在选中的内容之后追加。 c:替换所选内容。 输入新的文本。 按Esc将更改应用到所有选定的行。

更灵活的替代方案:

示例:在行开头输入文本XYZ

:%norm IXYZ

这里发生了什么?

% ==执行每一行 在正常模式(normal的简称)下执行以下键 I ==在行开始处插入 XYZ ==您要输入的文本

然后你按回车键,它就执行了。

具体到您的要求:

:%norm Ivendor_

你也可以选择一个特定的范围:

:2,4norm Ivendor_

或在选定的可视范围内执行:

:'<,'>norm Ivendor_

或者执行匹配'target'正则表达式的每一行:

:%g/target/norm Ivendor_