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


当前回答

通过mark命令标记文本区域,例如ma和mbtype命令::'a,'bg/(.*)/s////\1/

您可以在http://bknpk.ddns.net/my_web/VIM/vim_shell_cmd_on_block.html

其他回答

我在.vimrc文件中添加了一个简单的插件,它工作得很好,可以很容易地扩展。您只需向comment_map及其注释引线添加一个新的文件类型。

我添加了一个普通模式和视觉模式的映射,但您可以重新映射到任何您喜欢的模式。我只希望有一个“切换”样式的函数。一个熊具有多个映射等。

let s:comment_map = { 
    \   "c": '\/\/',
    \   "cpp": '\/\/',
    \   "go": '\/\/',
    \   "java": '\/\/',
    \   "javascript": '\/\/',
    \   "lua": '--',
    \   "scala": '\/\/',
    \   "php": '\/\/',
    \   "python": '#',
    \   "ruby": '#',
    \   "rust": '\/\/',
    \   "sh": '#',
    \   "desktop": '#',
    \   "fstab": '#',
    \   "conf": '#',
    \   "profile": '#',
    \   "bashrc": '#',
    \   "bash_profile": '#',
    \   "mail": '>',
    \   "eml": '>',
    \   "bat": 'REM',
    \   "ahk": ';',
    \   "vim": '"',
    \   "tex": '%',
    \ }

function! ToggleComment()
    if has_key(s:comment_map, &filetype)
        let comment_leader = s:comment_map[&filetype]
        if getline('.') =~ "^\\s*" . comment_leader . " " 
            " Uncomment the line
            execute "silent s/^\\(\\s*\\)" . comment_leader . " /\\1/"
        else 
            if getline('.') =~ "^\\s*" . comment_leader
                " Uncomment the line
                execute "silent s/^\\(\\s*\\)" . comment_leader . "/\\1/"
            else
                " Comment the line
                execute "silent s/^\\(\\s*\\)/\\1" . comment_leader . " /"
            end
        end
    else
        echo "No comment leader found for filetype"
    end
endfunction


nnoremap <leader><Space> :call ToggleComment()<cr>
vnoremap <leader><Space> :call ToggleComment()<cr>

注:

我没有对文件类型/加载使用任何回调或挂钩,因为我发现它们比.vimrc静态函数/map更慢Vim的启动速度,但这只是我的偏好。我也试图保持它的简单和性能。如果确实使用了自动命令,则需要确保将它们放入自动命令组中,否则每次加载文件时,回调都会多次添加到文件类型中,从而导致性能下降。

我标记第一行和最后一行(ma和mb),然后做:‘a,‘bs/^#//

我使用vim多个光标。

要选择区域,请按0(它是零,而不是字母“o”)转到要注释掉的区域的第一行或最后一行的第一个字符。然后按V键并使用J、K或上下箭头键选择区域。然后按CtrlN将虚拟光标放在选择的每一行上。然后按I键同时编辑选择的每一行。

我使用vim 7.4,这对我有用。假设我们正在注释/取消注释3行。

要注释:

如果行的开头没有制表符/空格:ctrl+V然后jjj然后shift+I(capital I)然后//然后esc esc如果该行的开头有制表符/空格,您仍然可以执行上述操作或替换为c:ctrl+V然后jjj然后c然后//然后esc esc取消注释:

如果行的开头没有制表符/空格:ctrl+V,然后jjj,然后ll(下限L),然后c

如果行的开头有制表符/空格,则将一个空格加上escctrl+V,然后jjj,然后ll(下限L),然后c,然后空格,然后esc

我个人想评论一下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>