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


当前回答

下面是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删除注释。

其他回答

视觉和Shift-I不适合我。

在没有任何插件的情况下工作最简单的是


选择块-V,然后选择j或k或任何相关运动(不要使用箭头键):)然后点击:它提示命令:“<,”>至注释使用#-`s/^/#/`使用`//`-`s/^/\/\//`取消注释使用#-`s/^#//`使用`//`-`s/^\/\//`


再平面化-

“<,”>-应用于视觉块

s-替代品

^-以开头

在/add字符#之后,在这种情况下,\/\/转义为//


使现代化

我编写了一个函数,用<Space><Space>注释和取消注释当前行

适用于接下来的10行,例如10<Space><Space>

将其粘贴到.vimrc

function CommentUncomment()
  let line = getline('.')
  if line[:1] == "//"
      norm ^2x
  else 
      norm I//
  endif
endfunction

nnoremap <Space><Space> :call CommentUncomment()<CR>

我是这样做的:

转到要注释掉的第一行的第一个字符。在GVIM中按Ctrl+q或在VIM中按Ctrl+v,然后向下选择要注释的行上的第一个字符。然后按c,并添加注释字符。

解压缩的方式相同,只需键入空格而不是注释字符。

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

使用Control-V选择文本矩形:转到第一个#字符,键入Ctrl+V,向右移动一次,然后向下移动,直到注释结束。现在键入x:删除所有#字符,后跟一个空格。

我个人想评论一下Visual Studio。我在工作中已经习惯了它,以至于它占据了我的肌肉记忆(使用vsvim)。使用shift+v选择所需的行,然后按ctrl+k,ctrl+c进行注释,或按ctrl+k,ctrl+u取消注释。

:vnoremap <C-k><C-c> :norm i//<Cr>
:vnoremap <C-k><C-u> :s/\/\///g<Cr>:noh<Cr>