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


当前回答

有几个vim插件,如Tcomment和nerdcommeter。

我使用tcomment进行评论。

gcc:它将切换当前行上的注释。v{motion}gc:它将切换注释可视选择的一系列行

示例:v3jgc将切换3行区域。

这些命令可用于处理任何语言的注释。

其他回答

我个人不喜欢注释“切换”功能,因为它会破坏代码中已经包含的注释。此外,我希望注释字符始终显示在最左边,这样我可以很容易地看到注释块。此外,我希望这是嵌套的(如果我首先注释掉一个块,然后是一个封闭块)。因此,我稍微改变了其中一个解决方案。我使用F5注释,使用Shift-F5取消注释。此外,我在s/命令末尾添加了/g:

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 = '"'
autocmd FileType nasm             let b:comment_leader = ';'

function! CommentLine()
    execute ':silent! s/^\(.*\)/' . b:comment_leader . ' \1/g'
endfunction

function! UncommentLine()
    execute ':silent! s/^' . b:comment_leader . ' //g'
endfunction

map <F5> :call CommentLine()<CR>
map <S-F5> :call UncommentLine()<CR>

此解决方案映射到注释和?取消注释(使用单个映射切换注释太复杂,无法正确实现)。它从VIM的内置注释字符串选项中获取注释字符串,如果声明了filetype plugin on,则从/usr/share/VIM/VIM*/ftplugin/*.VIM等文件填充注释字符串。

filetype plugin on
autocmd FileType * let b:comment = split(&commentstring, '%s', 1)
autocmd FileType * execute "map <silent> <Leader>/ :normal 0i" . b:comment[0] . "<C-O>$" . b:comment[1] . "<C-O>0<CR>"
autocmd FileType * execute "map <silent> <Leader>? :normal $" . repeat('x', strlen(b:comment[1])) . "0" . strlen(b:comment[0]) . "x<CR>"

一些常规的Vim命令不适用于我在Windows上的设置。Ctrl+v和Ctrl+q是其中的一些。后来我发现以下方法可以取消注释行。

鉴于

一些缩进的注释

   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim

以下方法删除#符号并保留缩进。

方法

将光标移动到第一条注释(箭头或h、j、k、l)。然后应用以下技术之一:

视觉块模式(更快)

Ctrl+Shift+v进入视觉块模式js来选择垂直线。l包括水平字符(可选)x删除块

搜索/替换+Regex

选择具有常规视觉模式的文本,即Shift+v类型:。您将得到提示“<,”>。键入regex,例如s/#//将哈希值替换为空。(可选:键入s/#//以包含空格)。进来

:norm命令

选择具有常规视觉模式的文本,即Shift+v类型:。您将得到提示“<,”>。发出命令。键入:norm ^x以删除第一个非空白字符和下一个字符。(可选:如果不缩进,请尝试:norm x,或:norm ^xx以包含空格)。进来

g模式

选择具有常规视觉模式的文本,即Shift+v类型:。您将得到提示“<,”>。发出命令。键入g/#/nom^x。(可选:键入g/#/nom!^xx以包含空格)。进来

后果

    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim

另请参见

关于删除缩进的评论的帖子关于如何快速评论Vim的帖子Primagen的g命令教程。VimTrick的注释代码教程

我使用Jasmeet Singh Anand的comments.vim(在vim.org上找到),

它适用于C、C++、Java、PHP[2345]、proc、CSS、HTML、htm、XML、XHTML、vim、vimrc、SQL、sh、ksh、csh、Perl、tex、fortran、ml、caml、ocaml、vhdl、haskel和普通文件

它在正常和可视模式下对不同源文件中的行进行注释和取消注释

用法:

CtrlC注释单行CtrlX取消注释单行ShiftV并选择多行,然后CtrlC对所选多行进行注释ShiftV并选择多行,然后CtrlX取消注释所选多行

" comments
augroup comment_like_a_boss
    autocmd!
    autocmd FileType c,cpp,go                let b:comment_leader = '// '
    autocmd FileType ruby,python             let b:comment_leader = '# '
    autocmd FileType conf,fstab,sh,bash,tmux 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>norm ^i<C-r>=b:comment_leader<CR><CR>
noremap <silent> ,uc :<C-b>silent <C-e>norm ^xx<CR>