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


当前回答

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

其他回答

所有这些方法中最快、最直观的方法是重新映射()行的逐步注释,然后()逐步取消注释。尝试一下,你就不会再回去了。

在Ruby或Bash中,使用2空间缩进:

map ) I# <Esc>j
map ( k^2x

在C/C++或PHP中,使用4空间缩进:

map ) I//  <Esc>j
map ( k^4x

缺点是你在句子移动时会丢失(和)(但das可以在其中填充),而且你偶尔会在处理长段时使用select and replace或CtrlV。但这很罕见。

对于C样式,长注释最好用以下方式处理:

set cindent
set formatoptions=tcqr

…这与使用V[move]gq重新进行单词换行结合得很好。

下面是my.vimrc的一部分:

"insert and remove comments in visual and normal mode
vmap ,ic :s/^/#/g<CR>:let @/ = ""<CR>
map  ,ic :s/^/#/g<CR>:let @/ = ""<CR>
vmap ,rc :s/^#//g<CR>:let @/ = ""<CR>
map  ,rc :s/^#//g<CR>:let @/ = ""<CR>

在正常和视觉模式下,我可以按,ic插入注释,按,rc删除注释。

我使用NERD评论员脚本。它允许您在代码中轻松注释、取消注释或切换注释。

如评论中所述:

对于任何对用法感到困惑的人,默认的前导是“\”,所以10\cc将注释十行,10\cu将取消注释这十行

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

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

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

从这里的答案中的想法开始,我开始了自己的评论功能。它可以打开和关闭评论。它可以处理//打印(“蓝色”)等事情//这个东西是蓝色的,只是切换第一条评论。此外,它在第一个非空白处添加注释和一个空格,而不是在行的开头。另外,在注释和缩进行时,它不会不必要地复制空白,而是使用缩放(:h\zs表示帮助)来避免这种额外的工作。希望它能帮助一些极简主义者。欢迎提出建议。

" these lines are needed for ToggleComment()
autocmd FileType c,cpp,java      let b:comment_leader = '//'
autocmd FileType arduino         let b:comment_leader = '//'
autocmd FileType sh,ruby,python  let b:comment_leader = '#'
autocmd FileType zsh             let b:comment_leader = '#'
autocmd FileType conf,fstab      let b:comment_leader = '#'
autocmd FileType matlab,tex      let b:comment_leader = '%'
autocmd FileType vim             let b:comment_leader = '"'

" l:pos   --> cursor position
" l:space --> how many spaces we will use b:comment_leader + ' '

function! ToggleComment()
    if exists('b:comment_leader')
        let l:pos = col('.')
        let l:space = ( &ft =~ '\v(c|cpp|java|arduino)' ? '3' : '2' )
        if getline('.') =~ '\v(\s*|\t*)' .b:comment_leader
            let l:space -= ( getline('.') =~ '\v.*\zs' . b:comment_leader . '(\s+|\t+)@!' ?  1 : 0 )
            execute 'silent s,\v^(\s*|\t*)\zs' .b:comment_leader.'[ ]?,,g'
            let l:pos -= l:space
        else
            exec 'normal! 0i' .b:comment_leader .' '
            let l:pos += l:space
        endif
        call cursor(line("."), l:pos)
    else
        echo 'no comment leader found for filetype'
    end
endfunction

nnoremap <Leader>t :call ToggleComment()<CR>
inoremap <Leader>t <C-o>:call ToggleComment()<CR>
xnoremap <Leader>t :'<,'>call ToggleComment()<CR>