在Vim中,有什么快速的方法可以注释/取消注释行呢?

1542

我在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 (-#)。


50
应该将被接受的答案更改为其中一个详细说明如何在不使用插件的情况下添加/取消注释块的答案。当前被接受的答案基本上只是一个指向第三方插件的链接。 - faintsignal
最高评分的答案没有提到任何插件,@rationalis的评论是误导性的,请您纠正或删除它,谢谢。 - bonobo
接受的答案应该是Magnus的回答 - user3313834
一个理想的解决方案是,一个热键可以切换注释“关闭”和“打开”,无论是“光标所在行”还是“选择的多行”。其他任何操作都太麻烦了。 - Lonnie Best
55个回答

4
我使用 Jasmeet Singh Anand的comments.vim(在vim.org上找到)。
它适用于C,C ++,Java,PHP [2345],proc,CSS,HTML,htm,XML,XHTML,vim,vimrc,SQL,sh,ksh,csh,Perl,tex,fortran,ml,caml,ocaml,vhdl,haskel和普通文件。
它可以在正常和可视模式下对不同源文件中的行进行注释和取消注释。
用法:
  • CtrlC 注释单行
  • CtrlX 取消注释单行
  • ShiftV 选择多行,然后 CtrlC 注释所选的多行
  • ShiftV 选择多行,然后 CtrlX 取消注释所选的多行

4

最快最直观的方法是将)键重新映射为向下注释行,然后将(键重新映射为向上取消注释。试一试,你就会爱不释手。

RubyBash中,使用2个空格进行缩进:

map ) I# <Esc>j
map ( k^2x

C/C++PHP中,使用4个空格进行缩进:

map ) I//  <Esc>j
map ( k^4x

缺点是你失去了句子移动时的括号(但是可以用“das”填充),有时你会退回到选择和替换或使用Ctrl+V来处理长段落。但这种情况很少见。 对于C风格,最好使用长注释:
set cindent
set formatoptions=tcqr

...这很好地结合了使用V[move]gq来重新执行单词包装。


3
我喜欢使用C语言的ansi注释/* ... */,下面是我的技巧,你可以根据不同情况进行适当调整。

使用/* ... */进行注释

选中文本(从开头开始,启动可视块,用}跳转):

<c-V>}

在所选内容中输入要应用的命令。

:norm i/* <c-v><esc>$a */

命令应该像这样::'<,'>norm i /* ^[$a */

详情请参见(i*)。


取消注释/* ... */

选择文本(与之前一样,或者您喜欢的其他方式):

<c-V>}

在选择区域中输入要应用的命令

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

命令将会是::'<,'>norm :s-\s*/\*\s*-^M$bbld$

详情请见(ii*)。


结果

作用是逐行注释:

Comment block
Comment block
Comment block

变为(反之亦然):
/* Comment block */
/* Comment block */
/* Comment block */

最好将其保存为一些 map@reg 放在您的 .vimrc 中,因为需要键入很多内容。如果您更喜欢使用单个 /**/ 来代替整个块,则可以使用以下命令:

使用单个 /* */ 注释整个块

通过录制例如 qc 的方式将其保存到寄存器中,然后在要注释的段落开头插入:

v}di/*  */<esc>hhhp

别忘了再次输入 q,以结束记录。

详见 (iii*)。


取消注释代码块中的一对 /* */

将其存入寄存器,比如说,@u。将光标放在代码块内的任意位置,并执行以下操作:

?/\*<enter>xx/\*/<enter>xx

通过完成 q 命令保存寄存器。

详见(iv*)。


结果

效果是多行的单个注释:

Comment block
Comment block
Comment block

变成(反之亦然):
/* Comment block
Comment block
Comment block */

说明

(i*) 它通过使用norm实现,其在每个选定的行中重复应用相同的命令。该命令简单地插入一个/*,找到该行的末尾,并最终插入*/

:norm i/* <c-v><esc>$a */

(ii*) 它还使用norm在每行上重复搜索/替换。搜索spaces /* spaces并替换为空。之后,找到行末尾,向后两个单词,向右移动一个字母,删除至结尾。

:norm :s-\s*/\*\s*-<c-v><enter>$bbld$

(iii*) 通过v}选择段落,删除它,插入一个打开和关闭的注释,移动到它的中间并粘贴已删除的块。

v}di/*  */<esc>hhhp

(iv*) 在代码中间,往回查找 /* 并删除;往前查找 */ 并删除。

?/\*<enter>xx/\*/<enter>xx

3

以下是基于上述使用 C-v 然后 I 方法的基本单行命令。

此命令 (:Comment) 将所选行的开头添加一个选择的字符串。

command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"

将以下行添加到您的.vimrc文件中,以创建一个命令,该命令接受单个参数并将参数放置在当前选择的每一行的开头。

例如,如果选择了以下文本:

1
2

如果你运行以下代码:: Comment //,结果将是:
//1
//2

3

在VIM中:

1- 按下v进入可视模式。

2- 使用箭头选择要注释的块。

3- 按下:

4- 输入's/^/#'

要删除注释,只需将步骤4替换为:

4- 输入's/^#//'


3

取消注释整个文件:

  1. Esc 退出插入模式
  2. gg 跳转到第一行的第一个字符
  3. ctrl+Vctrl+shift+v选择当前字符
  4. Gshift+g跳转到最后一行
  5. x 删除所选内容

3

我喜欢简短、整合且易于记忆的方法,以不依赖外部脚本和花哨的麻烦...

TLDR:
按下 gI(大写i)可将光标置于插入模式中行首(无论是空格还是非空格字符,并防止自动缩进)

使用此功能可以快速注释(例如)非连续行,注释符号(例如# //)作为第一个字符,无需缩进,只需按下键盘上的.(点)即可进行操作。但如果在插入模式下仍存在自动缩进机制,则按下Ctrl-oCtrl-d纠正缩进并在操作后返回普通模式。现在.可用于注释掉行...

长版:
多年来,我意识到按下gI(大写i)会将光标置于插入模式中的第1列(即:在行首,无论它是单词还是非单词字符)。

插入注释符号(例如#)并按下escape - 现在可以通过键盘上的.快速注释单个非连续行(以注释符号为第一个字符且不缩进)。

与按下0i或者只有I不同,它们会将注释符号放置在第一个单词字符上,可能也有不想要的缩进。


对于取消注释,您需要重复相同的步骤,但是要删除注释符号。此外,请注意任何自动缩进设置可能会在注释符号之前添加前导空格。否则,“撤消”功能会更加繁琐。 - Jonathan E. Landrum

2
  1. 注释代码的一种方法是使用可视块选择
  • 将光标放在需要注释的行的第0个位置,然后按下ctrl + v进入可视块。现在使用j(向下)或k(向上)导航到需要注释的行。
  • 然后使用c剪切和插入文本。现在键入“#”进行注释,然后按esc反映所选行上的插入
  1. 使用命令模式
  • 使用V选择该行,然后使用j(向下)k(向上)选择所有需要注释的行,然后按:进入命令模式,看起来像“:<,>”,然后在每个选择的行开头插入“#”
:'<,'>s/^/#

1
有几个适用于编程的vim插件,例如Tcomment和nerdcommenter。
我使用Tcomment进行注释。
gcc:它将在当前行上切换注释。 v {motion} gc:它将在视觉选择的一系列行中切换注释。
例如:v3jgc将切换3行区域的注释。
这些命令可用于处理任何语言中的注释。

1
@CMS的解决方案是最符合"vim本地化"的注释/取消注释行的方法。在@CMS的第二步中,按下CtrlV之后,您还可以使用r#添加注释或x删除注释。Drew Neil的Practical Vim,第46页,很好地解释了这种技术。
另一个很好的选择是使用ex模式命令。:[range]normali##。显然,为了节省击键次数,您需要注释掉15行以上。

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