什么是在Vim中评论/取消注释行的快速方法?

What's a quick way to comment/uncomment lines in Vim?

我在vi中打开了一个Ruby代码文件,有几行用#注释掉:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

假设我想取消对第一个def ... end部分中所有行的注释。在Vim中有什么有效的方法可以做到这一点?

一般来说,我在寻找一种简单易行的方式来评论和取消注释行。这里我处理的是Ruby代码,但它可以是javascript(//或haml(-#)。

  • 最被接受的答案是2009年,简单地说,你应该安装一个插件,它可以精确地完成问题的要求。当然,如果您不想安装插件或修补配置,VIM当然不适合您,因为VIM是相当简单的。
  • 接受的答案应该更改为其中一个答案,该答案有关于如何在不使用插件的情况下完成注释/注释块的详细说明。当前接受的答案基本上只是指向第三方插件的链接。


对于这些任务,我使用大多数时间块选择。

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

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

  • 首先,转到要注释的第一行,按ctrlv。这将使编辑器处于VISUAL BLOCK模式。
  • 然后使用箭头键并选择直到最后一行
  • 现在按shifti,将编辑器置于INSERT模式,然后按 。这将向第一行添加哈希。
  • 然后按esc(给它一秒钟),它将在所有其他选中的行上插入一个#字符。
  • 默认情况下,对于debian/ubuntu附带的精简版vim,在第三步中键入: s/^/#

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

    评论:Comment

    Uncomment:Uncomment

    • 默认为ctrl+v。Windows版本的gvim使用ctrl+q,因为ctrl+v已经用于粘贴。
    • @Samaursa-这对于非缩进代码更好。+ 1
    • 注意:注释仅适用于单字符注释
    • @amindfv ctrl+v,n(其中n是数字行-1),j,n(其中n是注释字符序列长度的数字-1),l,x。
    • @迈克尔.巴特内特:很好!另外,对于其他任何人:请注意,您可以使用箭头键移动光标,而不是使用(n-1)-l
    • 您将如何使用"//"?
    • 取消对:s/^#/的注释
    • 我需要打两次Esc
    • @如果要插入另一个字符串,只需在第二步中键入该字符串而不是#。它可以是你想要的任何东西。
    • 这个答案在VIM 7.2(即OS X 10.6.8上的默认VIM)中似乎不起作用。但是,它在VIM 7.4中确实有效:)
    • 转到行的开头,按&171;ctrl-v&187;,转到要注释的最后一行,按&171;i&187;,输入注释,按&171;esc&187;。与:按&171;v&187;,转到要注释的最后一行,按热键。最后一个要快得多,而且因为Vim是关于速度的,所以它肯定应该有一些评论。
    • +1对于ctrl+v来说,老实说,这是我认为Vim失踪的唯一原因之一。男孩是我错了。
    • 您可以单击Esc两次以不等待该秒;)
    • 为什么它只在可视块中工作,而不是在可视行模式中?选择有什么不同?仅使用行模式编辑第一行。
    • 为什么它在以可视模式插入后更新文本如此缓慢?这是当前VIM中的临时错误吗?
    • @Austint和6+其他人,找Vim 7.4试试Michael。Bartnett的评论你会发现"J"和"L"只是箭头键。
    • 我也在想,入侵者。因为我试着在这个答案和@magnus的答案之间练习
    • 我也有同样的问题@thomasahle,我认为它不起作用,因为我一直在解决。我在本地集群的tmux中运行vi。
    • @伊桑:从民意来看,你可能想把这个改成公认的答案。
    • 这对我不起作用。shift-i进入了简单插入模式。
    • 有什么简单的升级"精简版"的方法吗?我用的是MacBook Air,不能用shift I
    • 类似指南:stackoverflow.com/a/2561497/1695680
    • 基本的操作系统用户:万神殿终端将ctrl+v映射到粘贴,这可能导致这个答案在第一次尝试时不起作用。可以通过运行gsettings set org.pantheon.terminal.settings natural-copy-paste false或禁用dconf-editor中的等效设置来关闭此(延迟)映射。
    • 要设置单个"快速转义",可以将此行添加到.vimrc文件:set timeoutlen=1000 ttimeoutlen=0
    • @Alexander您可以通过卸载当前VIM版本和(在APT系统上)使用apt-get install vim-nox获得VIM的完整版本。
    • 六羟甲基三聚氰胺六甲醚。。。。我们如何将它存储在我们的vimrc中,让您不考虑语言而发表评论?那将是一个有趣的下午的工作…
    • 这里窗户上的gvim上的CTRL-V
    • 相反,使用shift+"x"删除可视块中的第一行。
    • @Austin只是在线条中添加了//,而避开了s/^/\/\/两倍的反斜杠。
    • 为什么使用shift+I?我认为最好使用change命令cs,而不是shift+i
    • 传言是真的,vim拥有一切,插件通常只是vim函数的包装器。
    • 如果这不适用于Windows,请查看pjerald.blogspot.in/2010/08/&hellip;
    • 仅供将来参考:视觉块模式下的shift-I文档可在:help v_b_I中找到。
    • 这应该是公认的答案。没有插件或外部脚本,只有Vim的嵌入式功能
    • 在插入部分使用退格键时,这似乎不起作用。
    • @Lucidbrot您可以在第三步使用c代替insert。
    • 这对视觉块模式的重新映射命令有效吗?例如v。对我来说没用


    要在VIM中注释块,请执行以下操作:

    • esc(退出编辑或其他模式)
    • 点击ctrl+vbkbd(可视块模式)
    • 使用上/下箭头键选择所需的行(它不会突出显示所有内容-没关系!)
    • shift+(大写I)
    • 插入所需文本,即%
    • escxKBDesc

    要取消VIM中的块注释:

    • esc(退出编辑或其他模式)
    • 点击ctrl+vbkbd(可视块模式)
    • 使用/箭头键选择要取消注释的行。

      如果要选择多个字符,请使用一个或组合这些方法:

      • 使用左/右箭头键选择更多文本
      • 要选择文本块,请使用shift+/箭头键
      • 您可以重复按下下面的删除键,就像普通的删除按钮一样。

    • dx删除字符,必要时重复

    • 这个答案在VIM 7.2(即OS X 10.6.8上的默认VIM)中似乎不起作用。但是,它在VIM 7.4中确实有效:)
    • @阿米莉亚:评论的捷径对我不起作用。shift+i带我进入插入模式。是否取决于VIM版本?
    • @用户3527975我在同一条船上。之前的海报说它在VIM 7.2中不起作用。这也是我在集群中所拥有的。
    • @用户3527975它正在为我工作,你到底按了Esc吗?
    • 它不起作用!VIM 7.4
    • @Strawahattuffy是的,我按了Esc
    • @代理我正在Windows中使用gvim 7.4,它对我有效。
    • 我希望这个答案能被提升。正如目前的情况一样,如果您问我如何从表中获取所有行,并且有人发布了一个指向ORM的链接,并说只需安装这个并使用这个命令。
    • 为什么需要一秒钟?
    • @用户3527975它可能取决于另一个评论者指出的版本。但是,您确实希望处于插入模式,因为目的是插入注释文本(或删除注释文本)。遵循其他步骤后会发生什么?
    • @ConorPatrick Dunno,但这里有一个start stackoverflow.com/questions/9341768/vim-response-quite-slow
    • 在RHEL 6上使用VIM 7.2-这不起作用。只在第一行插入命令
    • 这个答案唯一的问题是它告诉你使用箭头键。
    • 按Esc键两次。:)
    • @ConorPatrick,它在等着看你是不是在把电子稳定控制系统和其他装置结合起来使用。
    • @aaronalphonsus编辑了答案,删除了等待反映您反馈的评论。
    • 您需要使用esc,而不是ctrl+c(两次),否则它只会更改第一行。
    • 起初,启用评论对我不起作用,但在阅读之后,它再次起作用:1。确保对选择2使用ctrl-v,而不是v。插入时,它将显示为仅修改一行3。所有插入都发生在最后按Esc键时
    • @追逐它是一个特色。按两次Esc,您会看到它会立即插入字符。
    • 你们中的大多数人也需要学习如何阅读。我用这个的时间比我记忆中的要长,所以它肯定能和VIM 7.2和7.4一起使用。也许你希望Vim表现得不同?正常情况下,在按Esc键之前,字符只出现在第一行。也许您的终端没有发送密钥(典型的是箭头键,特别是通过ssh)?
    • @shxfee:我认为人们应该知道内置的方式,但也不要忽视插件可以为您的个人开发环境提供什么。插件方法使"该死的简单的东西"变得更简单。这只是我经常做的一项任务,我会从任何改进中受益。在textObject上使用操作符与真正的vim方式(例如gcip是不同的)。这就是为什么我使用VIM,不是因为它有可视块模式,也就是矩形块选择:现在大多数编辑器都提供这种模式。
    • 在Macvim 8.0中,这完全不适用于我。点击狗屎-我把它放入插入模式,只修复光标所在的行。两次按Esc不会改变任何东西
    • 对我来说,箭头键不起作用,我使用的是jabbd和kabbd,它起作用(macvim)。
    • 为什么这不适用于V班?我更多地使用shift-v方式,总是忘记


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

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

    #评论:

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

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

    #的注释:

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

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

    如果注释缩进为OP问题中的注释,则可以这样锚定删除:

    1
    :norm ^x

    这意味着"转到第一个非空格字符,然后删除一个字符"。请注意,与块选择不同,即使注释的缩进不均匀,此技术也可以工作!

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

    注2:如果您经常使用norm,当然也可以添加一个映射。例如,在~/.vimrc中输入以下行,在进行可视化选择后,您可以键入ctrl-n,而不是:norm

    1
    vnoremap <C-n> :norm

    注3:bare bones vim有时没有编译norm命令,因此一定要使用增强的版本,即通常的/usr/bin/vim,而不是/bin/vi

    (感谢@manbroski和@rakslite对本答案的改进)

    • 我认为这是一种方法,直到我滚动阅读这个答案stackoverflow.com/a/1676690/850996。使用ctrl+v的块选择(而不是使用shift+v的行选择)可以更好地控制注释字符插入的位置。
    • @shyam ctrl-v技术与特殊的只选择块命令相结合是大多数其他答案所推荐的;但是我个人发现我所描述的"norm"技术更简单,因为除了norm命令本身,它不引入任何新的语法,所以我可以重用我已经知道的关于vim的内容。
    • 对于取消缩进块的注释,可以使用:norm ^x。这种方法通常具有处理区域选择的优点(例如,vi{将在花括号内选择)。这种文本对象选择器不适用于Visual Block
    • 这是否只适用于某些版本的vim?我正试图在7.2的CentOS框中执行此操作,它按预期显示:'<,'>norm i#,但当我按Enter键时,它不会对所选行进行任何更改。
    • 啊,我刚想出来——在Centos 6上,/bin/vi是vim 7.2,但它和/usr/bin/vim是不同的版本,而且它的功能已经关闭了。
    • 您还可以选择行,然后选择:s/^/或:s/^或:s@^@/……等等(所有这些都将类似地变为:'<,'>s…)
    • 这是迄今为止最好的答案。尤其是与vip结合选择一整段。
    • 注意,normnormal的缩写。


    我使用书呆子的评论脚本。它允许您在代码中轻松地注释、取消注释或切换注释。

    如评论所述:

    for anyone who is confused by the usage, default leader is"\" so 10\cc will comment ten lines and 10\cu will uncomment those ten lines

    • 对于任何对用法感到困惑的人,默认的前导是"",因此10 cc将注释10行,10 cu将取消注释这10行。
    • 真的?这是公认的答案?它甚至不能回答这个问题!
    • 很有趣!我读了医生的书,发现有一个"性感评论"——只需使用"cs"。对于Ruby,它将使用=begin=end来注释多行,而不是散列标记。
    • 我认为使用VIM不是最快的方法,因为它需要安装一个插件。最好的答案已经得到了更多的选票,但还没有被标记为解决方案。
    • 不要停在这里。大多数投票结果都在下面,不需要任何插件。stackoverflow.com/a/15588798/2117868和stackoverflow.com/a/1676690/2117868


    我的电子文档中有以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    " Commenting blocks of code.
    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 = '" '
    noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:nohlsearch<CR>
    noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:nohlsearch<CR>

    现在,您可以键入,cc来注释一行,键入,cu来取消注释一行(在正常和可视模式下都有效)。

    (许多年前我从某个网站上偷了它,所以我不能完全解释它是如何工作的。)这里有一个解释。)

    • 我应该使用什么快捷方式?我不能完全确定VIM代码本身!
    • 在正常或可视模式下,使用"、cc"(3个字符序列)注释当前行,使用"、cu"取消注释当前行。
    • 我喜欢它:谢谢!从旁注来看,我觉得不难解释。a)它重新映射一个命令(非递归地[参见此](stackoverflow.com/questions/3776117/&hellip;)因此现在,当您按下时,请抄送:…事情被执行了。b)现在这基本上是一个SED(s/what/to what/where)命令,根据您打开的文件类型将^(行首)更改为正确设置的注释字符c),对于静默的内容,它们只抑制命令的输出。d):nohlsearch阻止它突出显示SED搜索
    • 注意,这不是加载自动命令的正确方法。它们应该在一个augroup中,否则它们将被多次添加到vim中并导致大量的减速。请参阅:learnvimscriptthehardway.stevelosh.com/chapters/14.html。我已经把我的答案加到这个问题上了。
    • 很好。这是我在选择块时如何(取消)注释的问题的实际答案。
    • 我的版本是gist.github.com/bad ptr/c880141ad3a68e4e4bc0/&hellip;
    • 对于未列出的文件类型,默认为//的my mod,使用(默认为\ )而不是,,并在任何缩进后添加/删除注释字符:gist.github.com/zonidjan/7fc11c2e9574c84383a87a8fcbe4b1ca


    指定在VIM中要注释的行:

    显示行号:

    1
    :set number

    然后

    1
    :5,17s/^/#/     this will comment out line 5-17

    或者:

    1
    :%s/^/#/        will comment out all lines in file

    • 因为您只需要更改每行的第一个字符,所以末尾不需要"g"
    • 嵌入式设备上的一些VIM(如OpenWRT)没有视觉模式。所以这太棒了:)
    • 你能解释一下为什么:%s/^/#/g会把所有的行都注释掉吗?我想知道百分比符号%
    • 要取消这些行的注释,您可以编写:5,17s/^#/
    • 伟大的!它非常适合块选择,如:va{varfor ruby。
    • @搜索和替换字符串中的bin%表示全局搜索(与特定行相反)。
    • 就我而言,这是正确的答案,谢谢


    我是这样做的:

  • 转到要注释的第一行的第一个字符。

  • 点击gvim中的ctrl+q或vim中的ctrl+v,然后向下选择要注释的行中的第一个字符。

  • 然后按c,并添加注释字符。

  • 注释的工作方式相同,只需键入空格而不是注释字符。

    • c也删除第一个字符。CMS的回答是正确的,即按下I,然后键入注释字符,然后输入Esc(这在Windows VIM上)。
    • 这是有效的,除了在第三步需要按"r",而不是按"c"。
    • 或者,你可以在按下c后按两次Esc,这样就可以实现这个技巧了。
    • 所有这些选项都会破坏行中的第一个字符。


    我已经为我的.vimrc文件添加了一个简单的附件,它工作得很好,并且可以很容易地扩展。只需将新的文件类型添加到注释映射及其注释前导。

    我添加了一个到正常和视觉模式的映射,但是你可以重新映射到你喜欢的任何东西。我只喜欢"切换"样式的功能。一个熊有多个映射等。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    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的启动速度,但这只是我的偏好。我也试着保持它的简单和性能。如果确实使用了自动命令,则需要确保将它们放入自动命令组中,否则将回调添加到文件类型中,每次加载文件多次,并导致性能下降。

    • 我对Vim完全陌生,我应该按什么按钮来切换映射函数?底部的声明是什么?
    • 您可以用<,>等键替换。然后按,空格键,它将切换该行的注释状态。leader不管你的leader是什么,vim的默认值是,但是你可以设置你自己的,比如"let mapleader="。
    • 很好的回答是,一个恼人的问题是,评论块已经有了一些评论,将把评论换成未评论的行。eg的qtcreator仅在所有非空行都有前导注释时删除注释,否则添加前导注释。
    • 我使用\zs\zeregex技巧制作了一个稍微不同的版本,代码变得更小了。你可以在这里看到


    切换注释

    如果你只需要切换注释,我宁愿用tpope的commentary.vim。

    enter image description here

    安装

    病菌:

    1
    2
    cd ~/.vim/bundle
    git clone git://github.com/tpope/vim-commentary.git

    VIM插头:

    1
    Plug 'tpope/vim-commentary'

    Vundle:

    1
    Plugin 'tpope/vim-commentary'

    进一步定制

    把这个加到你的.vimrc文件中:noremap / :Commentary

    现在,您可以按Leader/,就像sublime和atom一样,切换注释。

    • 谢谢!将来某个时候,它会支持HTML内部的CSS注释吗?


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


    以下是我的电子文档的一部分。

    1
    2
    3
    4
    5
    "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删除注释。

    • 这对初学者学习如何编写自己的.vimrc非常有帮助。
    • map包括正常和可视模式,因此您不需要vmap
    • 更好的地方在江户十一〔三〕里。
    • 也可以使用icrc


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

    评论:

    如果行的开头没有制表符/空格:ctrl + Vjjjshift + I (cappital i)//esc esc。如果行的开头有制表符/空格,您仍然可以执行上述操作或交换cctrl + Vjjjc//esc esc。不予置评:

    如果行的开头没有制表符/空格:ctrl + Vjjjll (lower cap L)c

    如果行的开头有制表符/空格,那么您可以将一个空格放在上方,并将EDOCX1[34]ctrl + Vjjjll (lower cap L)cspaceesc


    如何在vi中取消以下三行的注释:

    1
    2
    3
    #code code
    #code
    #code code code

    将光标放在左上角的#符号上,然后按ctrlv。这将使您进入可视块模式。按三次向下箭头或j选择所有三行。然后按d。所有的评论都消失了。要撤消,请按u

    如何在vi中评论以下三行:

    1
    2
    3
    code code
    code
    code code code

    将光标放在左上角字符上,按ctrlv。这将使您进入可视块模式。按三次j选择所有三行。然后按:

    YKBD//SCAKBD

    这是一个大写的I,//,和逃跑。

    当您按esc时,所有选定的行都将得到您指定的注释符号。

    • 如果您错过了"左上角"散列,您可以按O以在可视模式下将光标移动到"另一侧"。
    • 我觉得这个最好用。不需要任何第三方,只需使用本机VIM
    • 最佳答案,简单,无任何第三方


    我喜欢使用tcomment插件:http://www.vim.org/scripts/script.php?Script PTId=1173

    我已经将gc和gcc映射到注释行或突出显示的代码块。它可以检测文件类型并非常好地工作。


    前面有30个答案,我将尝试给出一个更简单的解决方案:在行首插入一个#。然后沿直线向下按DOT(.)。重复一下,做j.j.等,取消注释,去掉#(你可以在#上打x,用k.等做反向……

    • 这是一个非常简单的答案,即使初学者也能理解和使用。然而,在大量评论中,它的工作相当缓慢。为了解决这个问题,您可以将I#j写入缓冲区,例如,c,然后执行10@c,或者任何适合您的行数。


    是的,这个问题已经有33个(大部分是重复的)答案了。

    下面是如何在vim:motions中注释行的另一种方法。其基本思想是,使用与通过键入yip或通过键入dj删除2行的方法相同的方法,对行进行注释或取消注释。

    这种方法将允许您执行以下操作:

    • ccj将下2行注释掉,cuk将它们取消注释;

    • cci{对封锁进行评论,cui{对封锁进行取消注释;

    • ccip对整个段落进行注释,cuip取消注释。

    • ccG将所有内容注释到最后一行,cugg将所有内容取消注释到第一行。

    您所需要的只是两个在运动上运行的函数,以及每个函数的两个映射。首先,映射:

    1
    2
    3
    4
    nnoremap <silent> cc  :set opfunc=CommentOut<cr>g@
    vnoremap <silent> cc  :<c-u>call  CommentOut(visualmode(), 1)<cr>
    nnoremap <silent> cu  :set opfunc=Uncomment<cr>g@
    vnoremap <silent> cu  :<c-u>call  Uncomment(visualmode(), 1)<cr>

    (请参阅有关g@运算符和operatorfunc变量的手册。)

    现在的功能是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function! CommentOut(type, ...)
      if a:0
        silent exe"normal!  :'<,'>s/^/#/\<cr>`<"
      else
        silent exe"normal!  :'[,']s/^/#/\<cr>'["
      endif
    endfunction

    function! Uncomment(type, ...)
      if a:0
        silent exe"normal!  :'<,'>s/^\\(\\s*\\)#/\\1/\<cr>`<"
      else
        silent exe"normal!  :'[,']s/^\\(\\s*\\)#/\\1/\<cr>`["
      endif
    endfunction

    修改上面的正则表达式,以适应您对#应该在哪里的口味:

    • "全新的[…]动作"似乎有点过头了:T撘comment和VIM commentary插件,这两个插件都比这个答案早,允许您使用动作进行评论。
    • 好东西!投票赞成的(我还认为我可能会开始使用这种方法,而不是以前使用的插件,因此感谢您编写它!)


    我使用EnhancedCommentify。它评论了我所需要的一切(编程语言、脚本、配置文件)。我将它与可视模式绑定一起使用。只需选择要评论的文本,然后按co/cc/cd。

    1
    2
    3
    vmap co :call EnhancedCommentify('','guess')<CR>
    vmap cc :call EnhancedCommentify('','comment')<CR>
    vmap cd :call EnhancedCommentify('','decomment')<CR>

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


    如果你已经知道行号,那么n,ms/# //就可以了。

    • 实际上应该是:n,ms/^s.//因为您可能有前导空格,并且可能不会在哈希后面加一个


    我使用TimPope的VIM注释插件。


    有一个由tpope开发的改变生命的插件,叫做vim-commentary

    https://github.com/tpope/vim-评论

    此插件提供:

    • 神志正常
    • 适当缩进的注释
    • 不注释空/不必要的行

    用途:

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

    • vim-commentary(像所有tpope的插件一样)有成为惯用vim的好处。gc表示"评论",gcap表示"评论一段",等等。


    我把菲尔和JQNO的回答结合起来,用空格做了一些不连贯的评论:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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 = '"'
    function! CommentToggle()
        execute ':silent! s/\([^ ]\)/' . b:comment_leader . ' \1/'
        execute ':silent! s/^\( *\)' . b:comment_leader . ' \?' . b:comment_leader . ' \?/\1/'
    endfunction
    map <F7> :call CommentToggle()<CR>

    这里有一个基于C-v的基本单衬层,然后是上面概述的I方法。

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

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

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

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

    1
    2
    1
    2

    你运行这个::Comment //,结果是:

    1
    2
    //1
    //2

    我使用jasmet singh anand的comments.vim(在vim.org上找到)。

    它使用C、C++、Java、PHP(2345)、PRC、CSS、HTML、HTM、XML、XHTML、VIM、VIMRC、SQL、SH、KSH、CSH、Perl、TEX、FORTRAN、ML、CAML、OCAML、VHDL、Haskeland普通文件。

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

    用途:

    • ctrlc用于注释一行
    • ctrlx取消注释一行
    • shiftv并选择多行,然后ctrlv对所选多行进行注释。
    • shiftv并选择多行,然后ctrlx取消对所选多行的注释。


    从这里的答案开始,我开始了自己的评论功能。它打开和关闭注释。它可以处理像//print('blue'); //this thing is blue这样的事情,只需切换第一条注释。此外,它还添加了注释和一个空格,第一个非空格就在其中,而不是行首。另外,在注释和缩进行时,它不会不必要地复制空白,而是使用缩放(:hzs作为帮助)来避免这项额外工作。希望它能帮助一些极简主义者。欢迎提出建议。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    " 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>

    • 我已经做了一个稍微不同的版本,你的解决方案,也恢复光标位置,我想你的意见。吉瑟布论
    • 酷。你可以编辑我的帖子并添加你的解决方案(因为相似)!
    • 它已经改变以避免反斜杠C、CPP、Java和替换中使用另一个分隔符来避免E48。此外,对于Java、CPP的间距变化,因为注释有三个字符,//Plus空间,这是由L:Suffic来完成的。


    这里的答案是:1)显示粘贴到.vimrc中的正确代码,以使vim 7.4+在保持缩进级别的同时,在视觉模式下使用1个快捷方式进行块注释/取消注释;2)解释它。好的。

    代码如下:好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    let b:commentChar='//'
    autocmd BufNewFile,BufReadPost *.[ch]    let b:commentChar='//'
    autocmd BufNewFile,BufReadPost *.cpp    let b:commentChar='//'
    autocmd BufNewFile,BufReadPost *.py    let b:commentChar='#'
    autocmd BufNewFile,BufReadPost *.*sh    let b:commentChar='#'
    function! Docomment ()
     "make comments on all the lines we've grabbed

      execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e'
    endfunction
    function! Uncomment ()
     "uncomment on all our lines

      execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e'
    endfunction
    function! Comment ()
     "does the first line begin with a comment?

      let l:line=getpos("'<")[1]
     "if there's a match

      if match(getline(l:line), '^\s*'.b:commentChar)>-1
        call Uncomment()
      else
        call Docomment()
      endif
    endfunction
    vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>

    它是如何工作的:好的。

    • let b:commentChar='//':这会在vim中创建一个变量。这里的b是指作用域,在本例中,作用域包含在缓冲区中,表示当前打开的文件。您的注释字符是字符串,需要用引号括起来,引号不是切换注释时将被替换的内容的一部分。好的。

    • autocmd BufNewFile,BufReadPost *...:自动命令在不同的事情上触发,在这种情况下,当一个新的文件或读取的文件以某个扩展名结束时触发。一旦触发,执行以下命令,允许我们根据文件类型更改commentChar。还有其他的方法可以做到这一点,但对新手(像我一样)来说,它们更容易混淆。好的。

    • function! Docomment():函数以function开始,以endfunction结束。函数必须以大写开头。!确保此函数用此版本的Docomment()覆盖任何以前定义为Docomment()的函数。没有!,我有错误,但这可能是因为我通过vim命令行定义了新的函数。好的。

    • execute '''<,''>s/^\s*/&'.escape(b:commentChar, '\/').' /e':执行调用命令。在这种情况下,我们正在执行substitute,它可以取一个范围(默认为当前行),例如整个缓冲区的%,突出显示部分的'<,'>^\s*是regex,用于匹配行的开头,后跟任意数量的空白,然后将其附加到(由于&)。这里的.用于字符串连接,因为escape()不能用引号括起来。escape()允许您通过在\/前面加一个\来转义commentChar中与参数匹配的字符。在此之后,我们再次连接到substitute字符串的末尾,该字符串具有e标志。这面旗子让我们安静地失败,也就是说,如果我们在一条给定的线上找不到匹配,我们就不会为此大喊大叫。作为一个整体,这一行让我们在第一个文本前面放一个注释字符,后面跟一个空格,这意味着我们保持缩进水平。好的。

    • 埃多克斯一〔28〕号:这和我们上次的一次大长命令很相似。唯一的一个是,我们有\v,它确保我们不必逃离(),和1,它是指我们用()创建的组。基本上,我们匹配的是一行,从任意数量的空白开始,然后是注释字符,然后是任意数量的空白,我们只保留第一组空白。同样,如果我们没有评论角色,那么e会让我们安静地失败。好的。

    • let l:line=getpos("'<")[1]:这设置了一个变量,就像我们在注释字符中设置的那样,但是l是指本地范围(此函数的本地范围)。在本例中,getpos()得到突出显示的开始位置,而[1]意味着我们只关心行号,而不关心列号等其他内容。好的。

    • if match(getline(l:line), '^\s*'.b:commentChar)>-1:你知道if是如何工作的。match()检查第一件事是否包含第二件事,因此我们抓取开始突出显示的行,并检查它是否以空格开头,后面跟着注释字符。match()返回其为真的索引,如果未找到匹配项,则返回-1。由于if将所有非零数字都计算为真,因此我们必须比较输出,以查看它是否大于-1。vim中的比较如果为假则返回0,如果为真则返回1,这是if希望看到正确评估的结果。好的。

    • vnoremap :call Comment()vnoremap表示在可视模式下映射以下命令,但不要递归映射(也就是说,不要更改任何其他可能以其他方式使用的命令)。基本上,如果你是一个VIM新手,一定要用noremap来确保你不会弄坏东西。的意思是"我不想要你的话,只是你的行动",并告诉它不要把任何东西打印到命令行。是我们要映射的东西,在本例中是ctrl+r(注意,在正常模式下,使用此映射,您仍然可以正常使用c-r来"重做")。C-u有点让人困惑,但基本上它可以确保你不会忘记你的视觉突出显示(根据这个答案,它使你的命令从'<,'>开始,这是我们想要的)。call这里只告诉vim执行我们命名的函数,指点击enter按钮。我们必须点击一次才能真正调用函数(否则我们只是在命令行上键入call function()),我们必须再次点击它才能让我们的替代者一路通过(不确定原因,但无论如何)。好的。

    无论如何,希望这能有所帮助。这将获取用vvC-v突出显示的任何内容,检查第一行是否有注释,如果有,尝试取消所有突出显示的行的注释,如果没有,则向每行添加一层注释字符。这是我所期望的行为;我不只是想让它切换块中的每一行是否被注释,所以在对主题提出多个问题后,它对我来说非常适用。好的。好啊。


    它们中最快速、最直观的方法是重新映射),用于对行进行逐行注释,然后重新映射(,用于逐行注释。试试看,你就不会回去了。

    在Ruby或Bash中,有两个空格缩进:

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

    在C/C++或PHP中,具有4个空间缩进:

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

    缺点是句子移动丢失了()(但das可以在这里填充),并且偶尔会退回到select和replace或ctrlvbkbd来处理长段。但这很罕见。

    对于C-Style,长注释最好处理:

    1
    2
    set cindent
    set formatoptions=tcqr

    …它与使用V[move]gq重新包装单词结合得很好。


    为此,我使用VIM多个光标。

  • 要选择区域,请按0转到要注释的区域第一行或最后一行的第一个字符(它是零,而不是字母"O")。然后按v并使用jk或上下箭头键选择区域。
  • 然后按ctrlxkykbdn,在选择的每一行上放置一个虚拟光标。
  • 然后按iakbd同时编辑所选内容的每一行。
    • 它在这里不起作用,当我按CtrlN时,它选择下面的行。
    • @Gerep是否安装了VIM多个光标?如果是,您有最新版本的VIM多个游标吗?是否通过按0移动到要注释掉/取消注释的第一行或最后一行的第一个字符?然后,在按下CtrlN之前,您是否选择了使用视觉模式(按VCtrlV进入视觉模式,然后按JK选择了所有要注释的行?
    • 哦!!!!我真的很抱歉,我认为Vim多个光标是一个内置的功能,它现在可以工作了,谢谢=)
    • 只为我工作:\di#。谢谢你的建议。


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

    1
    2
    3
    4
    5
    6
    function! CommentToggle()
        execute ':silent! s/\([^ ]\)/\/\/ \1/'
        execute ':silent! s/^\( *\)\/\/ \/\/ /\1/'
    endfunction

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

    它是用于//-注释的,但是您可以很容易地为其他字符调整它。您可以使用autoCmd设置一个领导人,如jqno建议的。

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


    你可以使用vim commentary by tpope(https://github.com/tpope/vim-commentary),你可以使用它如下:

    按进入视觉模式

    1
    'v'

    然后按

    1
    'j' repeatedly or e.g 4j to select 4 row

    现在,您所要做的就是输入键:

    1
    'gc'

    这将注释掉所有选择,取消注释重复键:

    1
    'gc'

    取消对整个文件的注释:

  • esc退出插入模式
  • gg转到第一行的第一个字符
  • ctrl+vctrl+shift+vbkbd选择当前字符
  • gshift+g转到最后一行
  • 删除所选内容

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

    1
    2
    vnoremap 1 :s:^\(\s*\)\([^#\t ]\):\1#\2:e<CR>
    vnoremap 2 :s:^\(\s*\)#\(\s*\):\1\2:e<CR>

    1在每个选定行的文本(空白后)之前插入#。它检查是否已经有#,不插入#两次。也忽略了空行。键2删除一个#。它还保持了对行右侧的评论的安全性。

    更新:下面是一个例子,如何使文件类型相关的切换注释命令。要了解有关这些内容的更多信息,请阅读:http://learnvimscriptthehardway.stevenlosh.com/chapters/14.html

    为了使其正常工作,请将以下行放入您的.vimrc文件中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    " 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>

    • 块插入是在远程服务器上编辑文件的一个很好的解决方案。如果大多数编辑都是本地的,那么您可能会研究其他方法——代码片段(比如您的)或插件。


    我喜欢/* ... */(c-ansi注释),所以这里是我给你的诀窍。当然,您可以将其调整为在不同的情况下使用。

    用/*注释…*/

    选择文本(转到开始,开始视觉块,使用}跳转):

    1
    <c-V>}

    键入要在所选内容中应用的命令

    1
    :norm i/* <c-v><esc>$a */

    命令看起来像::'<,'>norm i /* ^[$a */

    详见(i*)。

    取消对/*的注释…*/

    选择文本(如前所述,或您喜欢的其他方式):

    1
    <c-V>}

    键入要在所选内容中应用的命令

    1
    :norm :s-\s*/\*\s*-<c-v><enter>$bbld$

    命令看起来像::'<,'>norm :s-\s*/\*\s*-^M$bbld$

    详见(二*)。

    结果

    效果是逐行评论:

    1
    2
    3
    Comment block
    Comment block
    Comment block

    变成(反之亦然):

    1
    2
    3
    /* Comment block */
    /* Comment block */
    /* Comment block */

    最好把它保存为你的.vimrc中的一些map@reg,因为它的类型很多。如果您喜欢单一的/**/而不是整个块,请使用:

    用单个/**/整块注释

    将其保存在登记簿中,例如,用qc记录,然后在段落开头评论:

    1
    v}di/*  */<esc>hhhp

    别忘了再做一次q,完成记录。

    详见(三*)。

    取消对块中单个/**/的注释

    把它保存在寄存器中,比如说,@u。将光标放在块内的任意位置,然后:

    1
    ?/\*<enter>xx/\*/<enter>xx

    完成q命令,保存寄存器。

    详见(四*)。

    结果

    效果是多行的单个注释:

    1
    2
    3
    Comment block
    Comment block
    Comment block

    变成(反之亦然):

    1
    2
    3
    /* Comment block
    Comment block
    Comment block */

    解释

    (i*)它通过使用norm来工作,该命令在每个选定的行中重复应用相同的命令。命令只需插入一个/*,找到该行的结尾,然后通过插入一个*/结束。

    1
    :norm i/* <c-v><esc>$a */

    (ii*)它还使用norm在每一行重复搜索/替换。搜索spaces /* spaces,不替换。在那之后,找到行尾,后面两个字,右一个字母,删去到行尾。

    1
    :norm :s-\s*/\*\s*-<c-v><enter>$bbld$

    (iii*)按v}选择段落,将其删除,插入注释打开和关闭,移动到中间并粘贴删除的块。

    1
    v}di/*  */<esc>hhhp

    (iv*)在中间的任何地方,向后找到一个/*,删除它;向前找到一个*/,删除它。

    1
    ?/\*<enter>xx/\*/<enter>xx

    尽管这个问题已经有了大量的答案,我仍然认为我会对我写的一个小插件大喊大叫:评论。

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

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


    1
    :g/.spare[1-9].*/,+2s/^/\/\//

    上面的代码将注释掉所有包含"spare"的行和一个数字,再加上它将注释发现行的另外两行。有关更多此类用途,请访问:http://vim.wikia.com/wiki/search_and_replace_details


    1
    2
    3
    "comment (cc) and uncomment (cu) code
    noremap   <silent> cc      :s,^\(\s*\)[^# \t]\@=,\1# ,e<CR>:nohls<CR>zvj
    noremap   <silent> cu      :s,^\(\s*\)# \s\@!,\1,e<CR>:nohls<CR>zvj

    您可以用注释/取消注释单个或多个行。要执行多行操作,请选择行,然后键入cc/cu快捷方式,或者键入一个数字,然后键入cc/cu,例如7cc将从光标中注释7行。

    我从那个人那里得到了原始代码,关于在vim中注释/取消注释Ruby代码块的最优雅的方式是什么?并做了一些小改动(更改了快捷键,并在后添加了一个空格)。


    @CMS的解决方案是最"vim本机"的注释输入/输出行方式。在@cms的第二步中,在ctrlv之后,您还可以使用rykbd 添加注释,或者使用xb删除注释。德鲁·尼尔(DrewNeil)的《实用维姆》(PracticalVim),第46页,很好地解释了这一技巧。

    另一个好的选择是使用一个ex模式命令。:[范围]normalbi 。显然,要用这个来保存击键,您需要注释15+行。


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

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

    我个人不喜欢注释"切换"功能,因为它会破坏已经包含在代码中的注释。另外,我希望注释字符总是出现在最左边,这样我就可以很容易地看到注释块。另外,我希望它可以嵌套工作(如果我先注释一个块,然后注释一个封闭块)。因此,我稍微改变了其中一个解决方案。我使用f5进行注释,并将f5转换为取消注释。另外,我在S/命令末尾添加了A/G:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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的内置commentstring选项中获取注释字符串,如果声明filetype plugin on,则该选项由/usr/share/vim/vim*/ftplugin/*.vim等文件填充。

    1
    2
    3
    4
    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>"

    • c修正内容。
    • @罗杰,你觉得哪条捷径更好?我个人换了/?


    :%s/^/////G

    移除字符和之间的树汁使用此命令注释.c或cpp文件


    注释行(适用于所有语言):

    • noremap ,// :call CommentLine()

    我们可以用行数来称呼它,在视觉模式下,它也可以工作。例如:要注释四行,请使用4,/,要取消注释,请使用4,/。

    取消对行的注释(对于所有语言):

    • noremap ,/ :call UnCommentLine()

    如果要添加新符号[注释],请添加列表并在函数中添加一些行。如果要添加一种语言,该语言具有已经在其中一个列表中定义的注释符号,只需将您的语言名称添加到相应的列表中(要获得正确的名称,请在vim中打开您的文件,并使用:set ft获取您的语言的正确名称)。

    Definition of CommentLine()

    function! CommentLine()
    let slash_ft_list = ['c' , 'cpp', 'java', 'scala' , 'systemverilog' , 'verilog' , 'verilog_systemverilog']
    let hash_ft_list = ['sh' , 'ruby' , 'python' , 'csh' , 'conf' , 'fstab' , 'perl']
    let perct_ft_list = ['tex']
    let mail_ft_list = ['mail']
    let quote_ft_list = ['vim']
    if (index(slash_ft_list, &ft) != -1)
    :norm I//
    elseif (index(hash_ft_list, &ft) != -1)
    :norm I#
    elseif (index(perct_ft_list, &ft) != -1)
    :norm I%
    elseif (index(mail_ft_list, &ft) != -1)
    :norm I>
    elseif (index(quote_ft_list, &ft) != -1)
    :norm I"
    endif
    endfunction

    Definition of UnCommentLine()

    function! UnCommentLine()
    let slash_ft_list = ['c' , 'cpp', 'java', 'scala' , 'systemverilog' , 'verilog' , 'verilog_systemverilog']
    let hash_ft_list = ['sh' , 'ruby' , 'python' , 'csh' , 'conf' , 'fstab' , 'perl']
    let perct_ft_list = ['tex']
    let mail_ft_list = ['mail']
    let quote_ft_list = ['vim']
    if (index(slash_ft_list, &ft) != -1)
    :norm ^2x
    elseif (index(hash_ft_list, &ft) != -1)
    :norm ^x
    elseif (index(perct_ft_list, &ft) != -1)
    :norm ^x
    elseif (index(mail_ft_list, &ft) != -1)
    :norm ^x
    elseif (index(quote_ft_list, &ft) != -1)
    :norm ^x
    endif
    endfunction


    有几个VIM插件,如tcomment和nerdcommenter可用。

    我使用tcomment进行评论。

    GCC:它将在当前行上切换注释。v motion gc:它将切换注释一系列可视选定的行。

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

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


    用mark命令标记文本区域,例如ma和mb类型命令::'a,'bg/(.*)/s//////1/

    您可以在中看到这种测试操作的示例http://bknpk.ddns.net/my_web/vim/vim_shell_cmd_on_block.html

    • 重复答案:stackoverflow.com/a/1676867/4694621


    ctrl+v,然后使用选择要注释的行数。然后按shift+iakbd,按_,然后按esc。这将注释掉您选择的行数。

    与取消注释行相反。

    • 欢迎来到StackOverflow Ravikumar。请注意,您的答案与现有答案(stackoverflow.com/a/15588798/430128)完全相同。如果你不在不提供任何新想法的情况下复制现有答案的实质内容,你的努力将更受赞赏。
    • 与其发布与其他人相同的答案,你更愿意自己尝试。