我在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

假设我想取消注释第一个定义中的所有行。。。端部。在Vim中有什么有效的方法可以做到这一点?

总的来说,我正在寻找一种简单、流畅的方式来注释和取消注释行。这里我处理的是Ruby代码,但可能是JavaScript(//)或Haml(-#)。


当前回答

我使用NERD评论员脚本。它允许您在代码中轻松注释、取消注释或切换注释。

如评论中所述:

对于任何对用法感到困惑的人,默认的前导是“\”,所以10\cc将注释十行,10\cu将取消注释这十行

其他回答

我标记第一行和最后一行(ma和mb),然后做:‘a,‘bs/^#//

你可以使用tpope的vim评论(https://github.com/tpope/vim-commentary)您可以按如下方式使用它:

按进入视觉模式

'v'

然后按

'j' repeatedly or e.g 4j to select 4 row

现在,您所要做的选择就是输入键:

'gc'

这将注释掉所有选择,以取消注释repead键:

'gc'

要注释vim中的块:

按Esc键(退出编辑或其他模式)点击ctrl+v(视觉块模式)使用↑/↓ 箭头键选择所需的线条(它不会突出显示所有内容-这很好!)Shift+i(大写i)插入所需的文本,例如%按Esc键


要取消注释vim中的块:

按Esc键(退出编辑或其他模式)点击ctrl+v(视觉块模式)使用↑/↓ 箭头键选择要取消注释的行。如果要选择多个字符,请使用一种或组合以下方法:使用左/右箭头键选择更多文本要选择文本块,请使用shift+←/→ 箭头键您可以重复按下下面的删除键,就像常规的删除按钮按d或x删除字符,必要时重复

是的,这个问题已经有33个(大部分是重复的)答案。

下面是另一种在Vim中注释行的方法:运动。基本思想是使用与键入yip删除段落或键入dj删除2行相同的方法注释或取消注释行。

这种方法可以让您执行以下操作:

ccj注释接下来的2行,cuk取消注释;cci{注释一个块,cui{取消注释;ccip注释整个段落,cuip取消注释。ccG将所有内容注释到最后一行,cugg将所有内容取消注释到第一行。

您只需要2个对运动进行操作的函数,以及每个函数的2个映射。首先,映射:

nnoremap <silent> cc  :set opfunc=CommentOut<cr>g@
vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
nnoremap <silent> cu  :set opfunc=Uncomment<cr>g@
vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

(请参阅有关g@运算符和operatorfunc变量的手册。)

现在功能如下:

function! CommentOut(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^/#/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^/#/\<cr>'["
  endif
endfunction

function! Uncomment(type, ...)
  if a:0
    silent exe "normal!  :'<,'>s/^\\(\\s*\\)#/\\1/\<cr>`<"
  else
    silent exe "normal!  :'[,']s/^\\(\\s*\\)#/\\1/\<cr>`["
  endif
endfunction

修改上面的正则表达式以适合您的口味,即#应该在哪里:

尽管这个问题已经有了很多答案,但我仍然认为我会对我写的一个小插件大声叫好:commentify。

Commentify使用commentstring设置来决定如何注释掉代码块,因此您不必在配置中保留不同注释类型的映射,并且支持基于行的注释(例如,//)和块注释(例如/**/)。

它还为注释和取消注释块映射了相同的快捷方式(默认为ctrl+c),因此您不必记住两个映射或一组复杂的命令。