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


当前回答

这是一个基于C-v的基本单线图,然后是上面概述的I方法。

此命令(:Comment)将所选字符串添加到任何选定行的开头。

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

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

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

1
2

然后运行this::Comment//,结果将是:

//1
//2

其他回答

我使用vim多个光标。

要选择区域,请按0(它是零,而不是字母“o”)转到要注释掉的区域的第一行或最后一行的第一个字符。然后按V键并使用J、K或上下箭头键选择区域。然后按CtrlN将虚拟光标放在选择的每一行上。然后按I键同时编辑选择的每一行。

我喜欢/*…*/(安西评论),所以这是我给你的诀窍。当然,您可以调整它以适应不同的情况。


注释/**/

选择文本(转到开始,开始视觉块,用}跳转):

<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 */

最好将其保存为.vimrc中的一些map或@reg,因为它需要大量输入。如果您喜欢单个/*和*/而不是整个块,请使用:

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

将其保存在一个寄存器中,记录,例如,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在每个选定的行中重复应用相同的命令。命令只需插入一个/*,找到该行的结尾,然后插入*/

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

(ii*)它还使用规范在每一行重复搜索/替换。搜索空格/*空格,然后不替换。之后,找到行的结尾,返回两个单词,右对齐一个字母,删除到末尾。

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

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

v}di/*  */<esc>hhhp

(iv*)中间的任何位置,向后查找a/*,删除它;查找转发的*/,将其删除。

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

我是这样做的:

转到要注释掉的第一行的第一个字符。在GVIM中按Ctrl+q或在VIM中按Ctrl+v,然后向下选择要注释的行上的第一个字符。然后按c,并添加注释字符。

解压缩的方式相同,只需键入空格而不是注释字符。

使用Control-V选择文本矩形:转到第一个#字符,键入Ctrl+V,向右移动一次,然后向下移动,直到注释结束。现在键入x:删除所有#字符,后跟一个空格。

我的.vimrc中有以下内容:

" Commenting blocks of code.
augroup commenting_blocks_of_code
  autocmd!
  autocmd FileType c,cpp,java,scala let b:comment_leader = '// '
  autocmd FileType sh,ruby,python   let b:comment_leader = '# '
  autocmd FileType conf,fstab       let b:comment_leader = '# '
  autocmd FileType tex              let b:comment_leader = '% '
  autocmd FileType mail             let b:comment_leader = '> '
  autocmd FileType vim              let b:comment_leader = '" '
augroup END
noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:nohlsearch<CR>
noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:nohlsearch<CR>

现在,您可以键入cc来注释一行,键入cu来取消注释一行(在正常模式和视觉模式下都有效)。

(多年前我从某个网站上偷了它,所以我无法完全解释它是如何工作的:)。有一条注释对其进行了解释。)