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

键入要在选择中应用的命令

: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

其他回答

如果您已经知道行号,那么n,ms/#//将起作用。

是的,这个问题已经有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

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

切换注释

如果你只需要切换评论,我宁愿使用commenttary.vim by tpope。

安装

病菌:

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-commentary.git

vim插头:

Plug 'tpope/vim-commentary'

Vundle公司:

Plugin 'tpope/vim-commentary'

进一步定制

将其添加到.virc文件:noremap<leader>/:Comments<cr>

现在,您可以通过按Leader+/来切换评论,就像Sublime和Atom一样。

@CMS的解决方案是注释输入/输出行的最“vim原生”方式。在@CMS的第二步中,在CtrlV之后,您还可以使用r#添加注释或使用x删除注释。Drew Neil的《实用Vim》(第46页)很好地解释了这一技术。

另一个好的选择是使用ex模式命令[范围]归一化##⌴。显然,要用这个保存击键,您需要注释掉15+行。

如何取消注释vi中的以下三行:

#code code
#code
#code code code

将光标放在左上角的#符号上,然后按CtrlV。这将使您进入视觉块模式。按下向下箭头或J三次以选择所有三条线。然后按D。所有评论都会消失。要撤消,请按U。

如何注释vi中的以下三行:

code code
code
code code code

将光标放在左上角的字符上,按CtrlV。这将使您进入视觉块模式。按↓ 或J三次以选择所有三条线。然后按:

I//Esc键

这是大写的I、//和Escape。

按ESC键时,所有选定的行都将获得指定的注释符号。