【发布时间】:2012-03-21 22:13:46
【问题描述】:
有时我想跨多行编辑某个可视文本块。
例如,我会采用如下所示的文本:
name
comment
phone
email
让它看起来像这样
vendor_name
vendor_comment
vendor_phone
vendor_email
目前我现在的做法是……
- 按V然后按j四次选择块的所有4行。
- 使用 > 缩进。
- 用 h 返回一个字母。
- 使用 Ctrlv 进入阻止可视模式。
- 按 j 四次向下选择四行。此时您已经选择了一个 4x1 的可视空白块(四行一列)。
- 按 C。请注意,这几乎向左缩进了一列。
- 键入不带引号的
" vendor_"。请注意我们必须放回的额外空间。 - 按 Esc。这是我使用 Esc 退出插入模式的极少数情况之一。 Ctrlc 只会编辑第一行。
- 重复步骤 1。
- 使用 以另一种方式缩进。
如果单词前至少有一列空格,我不需要缩进。如果我不必用 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 )
到
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.。希望现在您可以看到这种方法的缺点。我仅限于选择一列在垂直位置上都相同的文本。
【问题讨论】:
-
更好的方法:":%s/^/vendor_/"
-
感谢您的回复。如果我只想在每一行附加一个单词,那就行了。但是我使用的方法可以在任何位置进行。让我用一个更复杂的例子添加另一个我的例子。
-
然后使用 shift-V 突出显示要更改的行,并键入适当的搜索和替换命令 - 在第二个示例中,
:s/models\./\0whatever./ -
实现上述的方法很多。要完全回答问题的所有部分,然后是第 1 部分)我编辑的正则表达式或可视模式 esc 与答案中提供的一样工作得很好(我更喜欢 GVIM 中的可视选择)。对于第 2 部分),宏可能是 Brian Neal 提供的最简单的方法。我所知道的所有这些“操作方法”的最佳资源是 Drew Neil 的 Practical Vim。每当您忘记公式时,都是出色的快速阅读和轻量级参考。希望这个建议对某人有所帮助,对于许多 vim 用户来说,这将是值得的。
-
@Paul:如果你是counting keystrokes,你可以用
&替换\0。
标签: vim