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


当前回答

tpope有一个改变生活的插件,叫做vim comments

https://github.com/tpope/vim-commentary

此插件提供:

神志正常正确缩进注释不注释空/不必要的行

用法:

通过Vundle(我猜是病原体)安装。突出显示文本并按:,将显示为:<,'>在此处键入注释:<,'>注释,然后按Enter键。繁荣你做的花蕾。

其他回答

有时我会被推到一个远程盒子里,我的插件和.vimrc无法帮助我,或者有时NerdCommenter会出错(例如嵌入HTML中的JavaScript)。

在这些情况下,一种低技术的替代方法是内置的norm命令,它只在指定范围内的每一行运行任意vim命令。例如:

评论#:

1. visually select the text rows (using V as usual)
2. :norm i#

这将在每行的开头插入“#”。请注意,当您键入:范围将被填充,因此它看起来真的像:'<,'>norm i#

取消注释#:

1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x

这将删除每行的第一个字符。如果我使用了一个2个字符的注释,比如//,那么我只需要:norm xx来删除这两个字符。

如果注释如OP问题中那样缩进,那么您可以这样锚定删除:

:norm ^x

意思是“转到第一个非空格字符,然后删除一个字符”。请注意,与块选择不同,即使注释有不均匀的缩进,此技术也有效!

注意:由于norm实际上只是执行常规的vim命令,所以您不限于注释,还可以对每一行进行一些复杂的编辑。如果需要将转义符作为命令序列的一部分,请键入ctrl-v,然后按转义键(或者更简单,只需录制一个快速宏,然后使用norm在每行上执行该宏)。

注2:如果您发现自己经常使用规范,当然也可以添加映射。例如,在~/.vimrc中放入以下行可以让您在进行视觉选择后键入ctrl-n而不是:norm

vnoremap <C-n> :norm

注意3:裸骨vim有时没有编译规范命令,因此请确保使用增强版本,即通常为/usr/bin/vim,而不是/bin/vi

(感谢@Manbroski和@rakslice对本答案的改进)

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

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

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

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

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

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

注释:

取消注释:

这个简单的片段来自my.vimrc:

function! CommentToggle()
    execute ':silent! s/\([^ ]\)/\/\/ \1/'
    execute ':silent! s/^\( *\)\/\/ \/\/ /\1/'
endfunction

map <F7> :call CommentToggle()<CR>

它适用于//-注释,但您可以很容易地将其改编为其他角色。您可以按照jqno的建议使用autocmd设置引线。

这是一种非常简单和有效的方式,自然地处理范围和视觉模式。

tpope有一个改变生活的插件,叫做vim comments

https://github.com/tpope/vim-commentary

此插件提供:

神志正常正确缩进注释不注释空/不必要的行

用法:

通过Vundle(我猜是病原体)安装。突出显示文本并按:,将显示为:<,'>在此处键入注释:<,'>注释,然后按Enter键。繁荣你做的花蕾。

这是一个基于C-v的基本单线图,然后是上面概述的I方法。

此命令(:Comment)将所选字符串添加到任何选定行的开头。

command! -range -nargs=1 Comment :execute "'<,'>normal! <C-v>0I" . <f-args> . "<Esc><Esc>"

将这一行添加到.vimrc中,以创建一个接受单个参数的命令,并将该参数放置在当前选择的每一行的开头。

例如,如果选择了以下文本:

1
2

然后运行this::Comment//,结果将是:

//1
//2