协慌网

登录 贡献 社区

什么是在 Vim 中评论 / 取消注释行的快速方法?

我在 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 ,这将垂直删除所有#字符。

对于评论文本块几乎是相同的:

  1. 首先,转到要评论的第一行,按Ctrl V.这将使编辑器处于VISUAL BLOCK模式。
  2. 然后使用箭头键并选择直到最后一行
  3. 现在按Shift I ,将编辑器置于INSERT模式,然后按 。这将向第一行添加哈希。
  4. 然后按Esc (给它一秒钟),它将在所有其他选定行上插入一个#字符。

对于 debian / ubuntu 默认附带的精简版 vim,请在第三步中键入: s/^/#

这是两个用于视觉参考的小屏幕录音。

评论: 评论

取消注释: 取消注释

在 vim 中注释掉块:

  • Esc (退出编辑或其他模式)
  • 点击ctrl + v (可视块模式)
  • 使用向上 / 向下箭头键选择你想要的行(它不会突出显示所有内容 - 没关系!)
  • Shift + i (大写 I)
  • 插入所需的文字,即%
  • Esc Esc

要在 vim 中取消注释块:

  • Esc (退出编辑或其他模式)
  • 点击ctrl + v (可视块模式)
  • 使用 / 箭头键选择要取消注释的行。

    如果要选择多个字符,请使用一个或组合这些方法:

    • 使用左 / 右箭头键选择更多文本
    • 选择文本块使用shift + / 箭头键
    • 您可以反复按下面的删除键,就像常规删除按钮一样

  • 如有必要,请按dx删除字符

有时候我被绑在一个远程盒子里,我的插件和. 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 对此答案的改进)