我在 vi 中打开了一个 Ruby 代码文件,有一些注释掉了#
:
class Search < ActiveRecord::Migration
def self.up
# create_table :searches do |t|
# t.integer :user_id
# t.string :name
# t.string :all_of
# t.string :any_of
# t.string :none_of
# t.string :exact_phrase
#
# t.timestamps
# end
end
def self.down
# drop_table :searches
end
end
假设我想取消注释第一个def ... end
部分中的所有行。在 Vim 中这样做的有效方法是什么?
一般来说,我正在寻找一种简单流畅的方式来评论和取消注释。在这里,我正在处理 Ruby 代码,但它可能是 JavaScript( //
)或 Haml( -#
)。
对于那些任务,我使用大部分时间块选择 。
将光标放在第一个#
字符上,按Ctrl V (或Ctrl Q表示 gVim),然后向下直到最后一个注释行并按x ,这将垂直删除所有#
字符。
对于评论文本块几乎是相同的:
VISUAL BLOCK
模式。 INSERT
模式,然后按# 。这将向第一行添加哈希。 #
字符。 对于 debian / ubuntu 默认附带的精简版 vim,请在第三步中键入: s/^/#
。
这是两个用于视觉参考的小屏幕录音。
%
如果要选择多个字符,请使用一个或组合这些方法:
有时候我被绑在一个远程盒子里,我的插件和. vimrc 无法帮助我,或者有时候 NerdCommenter 错了(例如嵌入 HTML 中的 JavaScript)。
在这些情况下,一种低技术替代方案是内置的norm
命令,它只在指定范围内的每一行运行任意 vim 命令。例如:
评论 #
:
1. visually select the text rows (using V as usual)
2. :norm i#
这会在每行的开头插入 “#”。请注意,当您键入时:范围将被填充,因此它看起来确实如下:'<,'>norm i#
取消注释 #
:
1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x
这将删除每行的第一个字符。如果我使用了诸如 // 之类的 2-char 注释,那么我只需执行:norm xx
删除两个字符。
如果评论在 OP 的问题中缩进,那么您可以锚定您的删除,如下所示:
:norm ^x
这意味着 “转到第一个非空格字符,然后删除一个字符”。请注意,与块选择不同,即使注释具有不均匀的缩进,此技术也可以工作!
注意 :由于norm
实际上只是执行常规 vim 命令,因此您不仅限于注释,还可以对每一行进行一些复杂的编辑。如果您需要将转义字符作为命令序列的一部分,请键入 ctrl-v 然后点击转义键(或者更简单,只需记录一个快速宏,然后使用 norm 在每一行上执行该宏)。
注意 2 :如果你发现自己经常使用norm
你当然也可以添加一个映射。例如,在〜/ .vimrc 中放入以下行可让您在进行视觉选择后键入ctrl-n
而不是:norm
vnoremap <C-n> :norm
注 3 :Bare-bones vim 有时没有编译成norm
命令,所以一定要使用增强版本,即通常是 / usr / bin / vim,而不是 / bin / vi
(感谢 @Manbroski 和 @rakslice 对此答案的改进)