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


当前回答

如何取消注释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键时,所有选定的行都将获得指定的注释符号。

其他回答

对于这些任务,我使用了大部分时间块选择。

将光标放在第一个#字符上,按CtrlV(或按CtrlQ表示gVim),然后向下移动到最后一个注释行,然后按x,这将垂直删除所有#字符。

对于注释文本块几乎是相同的:

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

默认情况下,对于debian/ubuntu附带的精简版vim,请在第三步中键入:s/^/#(可以使用:nohl删除每行第一个字符的任何剩余突出显示)。

这里有两个小屏幕录音,供视觉参考。

注释:

取消注释:

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

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

很好的问题,但没有那么多好的答案。首先,我想说,在这里使用块插入模式不是一个简单的解决方案,只是击键太多,所以显然它必须在选定的行上工作,以提高代码编辑的性能。另一个没人提到的问题是:注释符号应该放在哪里-在行首或实际文本之前?这可能是一个品味问题,但我认为,应该将它放在文本之前,以保持代码可读:当注释符号放在最开始的一行时,它会破坏缩进代码的视觉一致性,因此看起来像一个项目符号列表。考虑到这一点,我最终得到了以下解决方案(我以#comment为例)。在我的vimrc中:

vnoremap 1 :s:^\(\s*\)\([^#\t ]\):\1#\2:e<CR>
vnoremap 2 :s:^\(\s*\)#\(\s*\):\1\2:e<CR>

键1在每个选定行的文本前(空格后)插入#。它检查是否已经有#,而不是两次插入#。并且还忽略空行。键2删除一个#。它还可以确保行右侧的注释安全。


更新:这里是一个示例,说明如何生成依赖于文件类型的切换注释命令。要了解更多信息,请阅读:http://learnvimscriptthehardway.stevelosh.com/chapters/14.html

为了使其正常工作,在.vimrc文件中放入以下行。

" build the whole regex search/replace command
function! Build()
    let b:Comment_ON='''<,''>s:^\(\s*\)\([^\t ]\):\1' . b:cs . '\2:e'
    let b:Comment_OFF='''<,''>s:^\(\s*\)' . b:cs . '\(\s*\):\1\2:e'
endfunction

" run this group on Filetype event
augroup SetCS
    autocmd!
    "default comment sign
    autocmd FileType * let b:cs='--'
    "detect file type and assign comment sign
    autocmd FileType python,ruby let b:cs='#'
    autocmd FileType c,cpp,java,javascript,php let b:cs = '\/\/'
    autocmd FileType vim let b:cs='"'
    autocmd FileType * call Build()
augroup END

vnoremap 1 :<C-u>execute b:Comment_ON<CR>
vnoremap 2 :<C-u>execute b:Comment_OFF<CR>

如何取消注释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键时,所有选定的行都将获得指定的注释符号。

注释一行(适用于所有语言):

noremap<silent>,//:调用CommentLine()<CR>

我们可以用许多行来调用它,在视觉模式下也可以。Like:要注释四行,请使用4,//,要取消注释,请使用5,/。

要取消注释A行(适用于所有语言):

noremap<silent>,/:调用UnCommentLine()<CR>

若要添加新符号[comment],请添加一个列表并在函数中添加一些行。如果您想添加一种语言,该语言的注释符号已经在其中一个列表中定义,只需在相应的列表中添加您的语言名称即可(要获得正确的名称:在vim中打开文件并使用:set ft获取您的语言的正确名称)。

CommentLine()的定义

作用注释行()让slash_ft_list=['c','cpp','java','scala','systemverilog','verilog'、'verilog_systemverilog']让hash_ft_list=[sh','ruby','python','csh','sconf','fstab','perl']让perct_ft_list=['tex']让mail_ft_list=['mail']让quote_ft_list=['vim']如果(索引(slash_ft_list,&ft)!=-1):规范I//elseif(索引(hash_ft_list,&ft)!=-1):规范I#elseif(索引(perct_ft_list,&ft)!=-1):标准I%elseif(索引(mail_ft_list,&ft)!=-1):规范I>elseif(索引(quote_ft_list,&ft)!=-1):规范I“结束符端函数

UnCommentLine()的定义

作用取消注释行()让slash_ft_list=['c','cpp','java','scala','systemverilog','verilog'、'verilog_systemverilog']让hash_ft_list=[sh','ruby','python','csh','sconf','fstab','perl']让perct_ft_list=['tex']让mail_ft_list=['mail']让quote_ft_list=['vim']如果(索引(slash_ft_list,&ft)!=-1):标准^2xelseif(索引(hash_ft_list,&ft)!=-1):标准^xelseif(索引(perct_ft_list,&ft)!=-1):标准^xelseif(索引(mail_ft_list,&ft)!=-1):标准^xelseif(索引(quote_ft_list,&ft)!=-1):标准^x结束符端函数