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


当前回答

我喜欢使用tcomment插件:http://www.vim.org/scripts/script.php?script_id=1173

我已经将gc和gcc映射为注释一行或高亮显示的代码块。它可以检测文件类型,工作非常好。

其他回答

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

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

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

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

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

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

注释:

取消注释:

我使用EnhancedCommentify。它评论了我所需要的一切(编程语言、脚本、配置文件)。我将其用于视觉模式绑定。只需选择要评论的文本,然后按co/cc/cd。

vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR> 
:g/.spare[1-9].*/,+2s/^/\/\//

上面的代码将注释掉所有包含“备用”的行以及其后的一个数字,再加上它将从找到的行中注释两行。有关更多此类用途,请访问:http://vim.wikia.com/wiki/Search_and_replace#Details

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

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

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

我的.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来取消注释一行(在正常模式和视觉模式下都有效)。

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