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

Eth*_*han 1081 vim comments

我在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
Run Code Online (Sandbox Code Playgroud)

假设我想取消注释第一def ... end部分中的所有行.在Vim中这样做的有效方法是什么?

一般来说,我正在寻找一种简单流畅的方式来评论和取消注释.在这里,我正在处理Ruby代码,但它可能是JavaScript(//)或Haml(-#).

CMS*_*CMS 2322

对于那些任务,我使用大部分时间块选择.

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

对于评论文本块几乎是相同的:

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

对于debian/ubuntu默认附带的精简版vim,请输入: s/^/#第三步.

这是两个用于视觉参考的小屏幕录音.

评论: 评论

取消注释: 取消注释

  • 默认情况下它是CTRL + V. gvim的windows版本使用Ctrl + Q,因为Ctrl + V已经用于粘贴. (83认同)
  • 您可以单击Esc两次以不等待该秒;) (72认同)
  • 这不适合我.Shift-I进入简单的插入模式. (33认同)
  • 你会怎么用'//'来做这件事? (24认同)
  • @amindfv Ctrl + V,`n`(其中n是num行 - 1),j,`n`(其中n num注释字符序列的长度为1),l,x. (8认同)
  • @Samaursa - 这对非缩进代码更有效.+1 (6认同)
  • 对于那些“shif-i”不适合他们的人:您应该按“ESC”来查看其他行中粘贴的文本。 (6认同)
  • @ michael.bartnett:很好!此外,对于其他任何人:请注意,您可以使用箭头键而不是`(n-1)-l`移动光标 (5认同)
  • 如果“shift-i”进入常规单行插入模式,则意味着您还没有完成!我有同样的问题。如果您按照这些步骤操作,似乎只有视觉块的第一行获得了注释,这很好。添加评论后,***按 esc 两次***,其余行也会神奇地获得评论!:) (5认同)
  • 为什么它只在Visual Block中工作,而不是在Visual Line模式下?选择有什么不同?仅使用线模式编辑第一行. (4认同)
  • 为什么在以可视模式插入后更新文本这么慢?这是当前vim中的临时错误吗? (4认同)
  • 我需要两次击中'Esc`. (3认同)
  • 这绝对应该是公认的答案.没有插件或外部脚本,只是vim的嵌入式电源 (3认同)
  • @Geremia你是对的。编辑第一行后,按 ESC 退出插入模式,然后您将看到它已应用于所选行的其余部分。(双 ESC 应该可以) (3认同)
  • 取消注释做`:s/^#/` (2认同)
  • @AustinTruong如果你想插入另一个字符串,只需在第二步中输入而不是`#`.它可以是你想要的任何东西. (2认同)
  • Ctrl + V为+1; 老实说,这是我认为ViM缺失的崇高唯一的事情之一.男孩,我错了. (2认同)
  • 有任何简单的方法可以升级“精简版”吗?我使用的是MacBook Air,不能使用“ shift I”。 (2认同)
  • 反过来将使用shift +"X"来移除可视块中的第一行. (2认同)
  • @Geremia 它对我不起作用,因为我有只使用“V”的习惯。您应该首先使用“Ctrl”+“V”。 (2认同)

ame*_*lia 776

在vim中注释掉块:

  • Esc(退出编辑或其他模式)
  • 点击ctrl+ v(视觉块模式)
  • 使用向上/向下箭头键选择你想要的行(它不会突出显示所有内容 - 没关系!)
  • Shift+ i(资本I)
  • 插入你想要的文字,即 %
  • EscEsc

要在vim中取消注释块:

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

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

    • 使用左/右箭头键选择更多文本
    • 选择文本块使用shift+ / 箭头键
    • 您可以反复按下面的删除键,就像常规删除按钮一样

  • 如有必要,请反复按dx删除字符

  • @amelia:评论快捷方式对我不起作用.Shift + i带我进入插入模式.它取决于vim版本吗? (27认同)
  • 我对此答案唯一的问题是它告诉你使用*箭头键*. (22认同)
  • 首先启用注释对我来说不起作用,但在阅读后再次工作正常:1.确保使用Ctrl-V,而不是V用于选择2.插入时它将显示为您只修改一行3.当你最后点击Esc时会发生所有插入 (11认同)
  • 为什么需要一秒钟? (7认同)
  • 两次击中Esc.:) (4认同)
  • 你们大多数人都需要学习如何阅读.我使用的时间比我记忆中的长,所以它肯定适用于ViM 7.2和7.4.也许你期望ViM表现得与众不同?在按Esc之前,字符仅出现在第一行是正常的.也许您的终端没有发送密钥(通常使用箭头键,尤其是通过SSH)? (4认同)
  • 这个答案在VIM 7.2中似乎不起作用(即OS X 10.6.8上的默认Vim).但是,它在VIM 7.4中有效:) (2认同)
  • @ user3527975我在同一条船上.之前的海报说它在vim 7.2中不起作用.这也是我在我的集​​群上所拥有的. (2认同)
  • @user3527975 它对我有用,你最后按 Esc 了吗? (2认同)
  • 我希望这个答案会得到推广。就目前而言,这就像您是否询问我如何从表中获取所有行,有人发布了指向ORM的链接,并说只需安装此命令并使用此命令。 (2认同)
  • 在 RHEL 6 上使用 Vim 7.2 - 这不起作用。仅在第一行插入命令 (2认同)
  • @ConorPatrick 正在等待查看您是否将 Esc 与其他任何东西结合使用 (2认同)
  • 这完全不适用于MacVim 8.0.点击shit-i将其置于插入模式并仅修复光标所在的行.两次击中esc不会改变任何东西 (2认同)

Mag*_*nus 312

有时候我被绑在一个远程盒子里,我的插件和.vimrc无法帮助我,或者有时候NerdCommenter错了(例如嵌入HTML中的JavaScript).

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

评论 #:

1. visually select the text rows (using V as usual)
2. :norm i#
Run Code Online (Sandbox Code Playgroud)

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

取消注释 #:

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

这将删除每行的第一个字符.如果我使用了诸如//之类的2-char注释,那么我只是:norm xx删除两个字符.

如果评论在OP的问题中缩进,那么您可以锚定您的删除,如下所示:

:norm ^x
Run Code Online (Sandbox Code Playgroud)

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

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

注意2:如果你发现自己经常使用,你当然也可以添加一个映射norm.例如,把下面的行的〜/ .vimrc允许您键入ctrl-n,而不是:norm让你的视觉选择后

vnoremap <C-n> :norm
Run Code Online (Sandbox Code Playgroud)

注3:Bare-bones vim有时没有norm编译到其中的命令,所以一定要使用增强版本,即通常是/ usr/bin/vim,而不是/ bin/vi

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

  • 这太棒了。我是一个狂热的宏用户。我为击键即时创建宏(通常是递归的),我什至必须重复一次。我现在只考虑宏观。我从来不知道“:正常”。我要好好利用它。 (3认同)
  • @Shyam ctrl-v技术与特殊的块选择命令相结合是大多数其他答案所推荐的; 但是我个人发现我所描述的"规范"技术更容易,因为除了norm命令本身之外它没有引入任何新的语法,所以我可以重用我已经知道的关于vim的东西. (2认同)
  • 为了取消注释缩进块,可以说`:norm ^ x`.这种方法通常具有使用区域选择的优点(例如`vi {'将在花括号内选择).这样的_text对象选择器_不适用于`Visual Block`. (2认同)
  • 到目前为止,这是最好的答案。特别是当与`vip`结合使用以选择整个段落时。 (2认同)

Man*_*ron 171

我使用NERD Commenter脚本.它可以让您轻松评论,取消注释或切换代码中的注释.

评论中所述:

对于任何对使用感到困惑的人,默认的领导者是"\"所以10\cc将评论十行,10\cu将取消注释这十行

  • **不要停在这里.**大多数投票的答案都在下面,不需要任何插件./sf/answers/1091215891/和/sf/answers/117368331/ (71认同)
  • @whirmill 我认为“最好”确实取决于用例。如果我一生中想切换一次评论,视觉块模式会更快。但是,如果我不介意安装插件,并且希望尽可能少地敲击键盘来切换注释,并且不必区分添加或删除注释之间的操作 - 那么这可能是“最佳答案”。 (4认同)

jqn*_*qno 115

我有以下内容.vimrc:

" 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>
Run Code Online (Sandbox Code Playgroud)

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

(我多年前从某个网站偷了它,所以我不能完全解释它是如何工作的:).有一个评论说明.)

  • 注意,这不是加载自动命令的正确方法.它们应该在一个augroup中,否则它们将被多次添加到vim并导致很多减速.请参阅:http://learnvimscriptthehardway.stevelosh.com/chapters/14.html.我已经添加了这个问题的答案. (13认同)
  • 我喜欢 :)!谢谢!另外,我不觉得难以解释.a)它重新映射一个命令(非递归[见这个](http://stackoverflow.com/questions/3776117/vim-what-is-the-difference-between-the-remap-noremap-nnoremap-and-vnoremap- ma)所以现在当你按下时,cc:...就会被执行.b)现在这基本上是一个sed(s/what/towhat/where)命令将^(行首)改为正确设置的注释字符关于你打开的文件类型c)对于无声的东西,他们只是抑制命令的输出.d):nohlsearch阻止它突出显示sed搜索 (8认同)
  • 我的 mod 默认为 // 对于未列出的文件类型并使用 `&lt;Leader&gt;`(默认为 `\ `)而不是 `,` 并在任何缩进后添加/删除注释字符:https://gist.github.com/zonidjan /7fc11c2e9574c84383a87a8fcbe4b1ca (2认同)

小智 110

指定要在vim中注释的行:

显示行号:

:set number
Run Code Online (Sandbox Code Playgroud)

然后

:5,17s/^/#/     this will comment out line 5-17
Run Code Online (Sandbox Code Playgroud)

或这个:

:%s/^/#/        will comment out all lines in file
Run Code Online (Sandbox Code Playgroud)

  • 要取消注释这些行,你可以写:5,17s/^#/ (17认同)
  • 由于您只是更改每行的第一个字符,因此最后不需要"g" (11认同)

Mar*_*cin 56

我是这样做的:

  1. 转到要注释掉的第一行的第一个字符.

  2. 命中Ctrl+ q在GVIM或Ctrl+ v在VIM,然后再往上选择行第一个字符注释掉.

  3. 然后按c,并添加注释字符.

取消注释以相同的方式工作,只需键入空格而不是注释字符.

  • `c`也删除了第一个字符.CMS的答案是正确的,即按"I"然后键入注释字符然后输入"Esc"(这是在Windows vim上) (43认同)
  • 这是有效的,除了'r'需要在第三步按下,而不是'c'. (5认同)

小智 31

我已经提出了一个简单的添加到我的.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>
Run Code Online (Sandbox Code Playgroud)

注意:

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

  • 您可以使用<,>等键替换<leader>.然后按,SPACE,它将切换行的注释状态.领导者是你的领导者,Vim的默认<领导者>是\,但你可以设置自己的"let mapleader =','" (2认同)

Fla*_*che 31

切换评论

如果你需要的是拨动意见我会跟宁愿去commentary.vim通过tpope.

在此输入图像描述

安装

病原:

cd ~/.vim/bundle
git clone git://github.com/tpope/vim-commentary.git
Run Code Online (Sandbox Code Playgroud)

VIM插头:

Plug 'tpope/vim-commentary'
Run Code Online (Sandbox Code Playgroud)

Vundle:

Plugin 'tpope/vim-commentary'
Run Code Online (Sandbox Code Playgroud)

进一步定制

将其添加到.vimrc文件中: noremap <leader>/ :Commentary<cr>

您现在可以通过按Leader+ 来切换注释/,就像Sublime和Atom一样.

  • 很好,谢谢!这就是我在正常模式和插入模式下使用“C-/”自定义行注释的方法:“nnoremap &lt;C-_&gt; :Commentary&lt;cr&gt;j”和“inoremap &lt;C-_&gt; &lt;Esc&gt;:Commentary&lt;cr&gt;”吉`。我不知道原因,但 vim 将 `/` 识别为 `_`,这就是我使用 `C-_` 的原因。 (3认同)

Art*_*uer 23

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


inn*_*naM 16

这是我的一部分.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>
Run Code Online (Sandbox Code Playgroud)

在正常和可视模式下,这可以让我按下,ic以插入注释并,rc删除注释.

  • `map`涵盖了普通和视觉模式,所以你不需要`vmap`行 (3认同)

And*_*ndy 13

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

评论:

如果行的开头有没有标签/空间:
ctrl + V那么jjj然后shift + I (cappital i)//然后esc esc
,如果行有标签/空间在开始的时候你仍然可以做上面或交换为c:
ctrl + V然后jjjc然后//esc esc

取消注释:

如果线必须在开始时没有标签/空间:
ctrl + V然后jjjll (lower cap L)然后c

如果线必须在开始选项卡/空间,那么你的空间一个过来,esc
ctrl + V然后jjjll (lower cap L)然后cspace然后esc


mat*_*est 12

我结合了 Phil 和 jqno 的回答,并用空格取消了评论:

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/\([^ ]\)/' . escape(b:comment_leader,'\/') . ' \1/'
    execute ':silent! s/^\( *\)' . escape(b:comment_leader,'\/') . ' \?' . escape(b:comment_leader,'\/') . ' \?/\1/'
endfunction
map <F7> :call CommentToggle()<CR>
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

让我们假设我们使用#-comments。

第一个命令s/\([^ ]\)/# \1/搜索第一个非空格字符[^ ]并将其替换为# + itself。自身替换由\(..\)搜索模式和\1替换模式中的 完成。

第二个命令s/^\( *\)# \?# \?/\1/搜索以双注释开头的行^\( *\)# \?# \?(在注释之间接受 0 或 1 个空格)并简单地用非注释部分替换那些行\( *\)(意味着前面的空格数相同)。

有关 vim 模式的更多详细信息,请查看这里


Ric*_*ick 9

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

我已经映射了gc和gcc来评论一行或突出显示的代码块.它检测文件类型并且工作得很好.


Ivo*_*ott 9

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

#code code
#code
#code code code
Run Code Online (Sandbox Code Playgroud)

将光标放在左上角的#符号上,然后按CtrlV.这使您处于可视阻止模式.按向下箭头或J三次以选择所有三条线.然后按D.所有评论都消失了.要撤消,请按U.

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

code code
code
code code code
Run Code Online (Sandbox Code Playgroud)

将光标放在左上角,按CtrlV.这使您处于可视阻止模式.按J三次以选择所有三条线.然后按:

I//Esc

这是资本I,//和Escape.

按下时ESC,所有选定的行都将获得您指定的注释符号.


ima*_*hat 9

在我之前有30个答案,我将尝试提供一个更简单的解决方案:#在行的开头插入一个.然后沿着一条线按下dot(.).要重复,做j,.,j,.,等...要取消注释,删除#(你能打到x#),并使用反向做k,.等...


n.r*_*.r. 8

是的,这个问题已经有33个(主要是重复的)答案.

这是另一种如何在Vim中评论线条的方法:运动.基本思想是使用与通过键入yip或删除2行来删除段落相同的方法来注释或取消注释行dj.

这种方法可以让你做到这样的事情:

  • ccj评论接下来的2行,并cuk取消注释;

  • cci{评论一个块,并cui{取消注释;

  • ccip评论整个段落,并cuip取消注释.

  • ccG将所有内容评论到最后一行,并cugg取消注释到第一行的所有内容.

您只需要2个在运动运行的功能,以及每个功能的2个映射.首先,映射:

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>
Run Code Online (Sandbox Code Playgroud)

(参见有关g@运算符和operatorfunc变量的手册.)

而现在的功能:

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
Run Code Online (Sandbox Code Playgroud)

修改上面的正则表达式,以满足您#应该在哪里的品味:


pyl*_*ang 8

一些常规的 Vim 命令不适用于我在 Windows 上的设置。 Ctrl + vCtrl + q其中的一些人。后来我发现以下方法可以取消注释行。

给定

一些缩进的评论

   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
Run Code Online (Sandbox Code Playgroud)

以下方法删除#符号并保留缩进。

方法

将光标移至第一个注释(箭头或h, j, k, l)。然后应用以下技术之一:

视觉块模式(更快)

  • Ctrl+ Shift+v进入 VISUAL BLOCK 模式
  • js 选择垂直线。
  • l包括水平字符(可选)
  • x删除块

代换

  • 在 VISUAL 模式下突出显示文本:Shift + v
  • 输入命令+
    • :s/#//将哈希值替换为空
    • :s/# //包含空格(可选)
  • Enter

:norm命令

  • 在 VISUAL 模式下突出显示文本:Shift + v

  • 输入命令+

    • :norm ^x删除第一个非空白字符
    • :norm ^xx包含空格(可选)
  • Enter

g模式

  • 在 VISUAL 模式下突出显示文本:Shift + v
  • 输入命令+
    • :g/#/norm! ^x
    • :g/#/norm! ^xx包含空格(可选)
  • Enter

dgn

  • 搜索符号:\# Enter
  • 删除光标下的单词:dgn
  • 重复n次:......

结果

    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
Run Code Online (Sandbox Code Playgroud)

也可以看看

  • 关于删除缩进评论的帖子
  • 发布有关如何使用 Vim 快速评论的文章
  • ThePrimeagen 的命令教程g
  • VimTrick关于注释代码的教程

+:在视觉模式下输入并创建:'<,'>提示。


uck*_*man 7

如果您已经知道行号,那么n,ms/# //就行了.


Wes*_*ger 7

有这个改变生活的插件tpope叫做vim-commentary

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

这个插件提供

  • 理智
  • 适当缩进的评论
  • 不注释掉空/不必要的行

用法

  • 通过 Vundle(或者我猜是 Pathogen)安装。
  • 突出显示您的文本并按下:它将显示为:<,'>
  • 在此处输入评论:<,'>Commentary并按Enter
  • 繁荣。你完成的芽。


qba*_*qba 6

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

vmap co :call EnhancedCommentify('','guess')<CR>
vmap cc :call EnhancedCommentify('','comment')<CR>
vmap cd :call EnhancedCommentify('','decomment')<CR> 
Run Code Online (Sandbox Code Playgroud)


SDG*_*tor 6

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


kon*_*yak 5

"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
Run Code Online (Sandbox Code Playgroud)

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

我从What's the most beautiful way of commenting / uncommenting block of ruby​​ code in Vim?上的人那里得到了原始代码。并做了一些小更改(更改了快捷键,并在#后面添加了一个空格)。


Jim*_*art 5

我使用 Tim Pope 的vim-commentary插件。


mik*_*ike 5

从这里答案中的想法开始,我启动了自己的评论功能。它可以打开和关闭评论。它可以处理诸如//print('blue'); //this thing is blue切换第一条评论之类的事情。此外,它在第一个非空白所在的位置添加注释和一个空格,而不是在行的开头。此外,它不会不必要地复制空格,而是在注释和缩进行时使用缩放(: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>
Run Code Online (Sandbox Code Playgroud)


Kin*_*mah 5

您可以通过 tpope ( https://github.com/tpope/vim-commentary )使用 vim-commentary ,您可以按如下方式使用它:

按进入可视模式

'v'
Run Code Online (Sandbox Code Playgroud)

然后按

'j' repeatedly or e.g 4j to select 4 row
Run Code Online (Sandbox Code Playgroud)

现在您所要做的就是输入键进行选择:

'gc'
Run Code Online (Sandbox Code Playgroud)

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

'gc'
Run Code Online (Sandbox Code Playgroud)


jer*_*ile 5

如果您无法安装插件但仍希望注释字符遵循现有的缩进级别,则此答案最有用。

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

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>
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  • 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*是正则表达式以匹配行的开头,后跟任意数量的空格,然后附加到(由于&)。在.这里用于字符串连接,因为escape()不能用引号包裹。escape()让你逃脱字符commentChar的参数匹配(在这种情况下,\/通过与前面加上它们)\。在此之后,我们再次连接到我们的substitute字符串的末尾,它具有e旗帜。这个标志让我们默默地失败,这意味着如果我们在给定的行上没有找到匹配项,我们就不会大喊大叫。总的来说,这一行让我们在第一个文本之前放置一个注释字符,后跟一个空格,这意味着我们保持缩进级别。

  • execute '''<,''>s/\v(^\s*)'.escape(b:commentChar, '\/').'\v\s*/\1/e': 这类似于我们上一个巨大的长命令。与此不同的是,我们有\v,它确保我们不必逃避我们的(), and 1,它指的是我们用我们的(). 基本上,我们匹配一行以任意数量的空格开头,然后是我们的注释字符,后跟任意数量的空格,我们只保留第一组空格。同样,e如果该行没有注释字符,让我们静默失败。

  • let l:line=getpos("'<")[1]: 这设置了一个变量,就像我们对注释字符所做的一样,但l指的是局部作用域(对于这个函数是局部的)。getpos()在这种情况下,获取突出显示开始的位置,以及[1]我们只关心行号,而不关心列号等其他内容的方式。

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

  • vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>:vnoremap表示在可视模式下映射以下命令,但不要递归映射(意思是不要更改可能以其他方式使用的任何其他命令)。基本上,如果您是 vim 新手,请始终使用noremap以确保您不会破坏东西。<silent>意思是“我不想要你的话,只想要你的行动”并告诉它不要在命令行打印任何东西。<C-r>是我们要映射的东西,在这种情况下是 ctrl+r(注意,在此映射的正常模式下,您仍然可以正常使用 Cr 进行“重做”)。C-u有点令人困惑,但基本上它可以确保您不会忘记您的视觉突出显示(根据这个答案,它使您的命令从'<,'>我们想要的开始)。call这里只是告诉vim执行我们命名的函数,<cr>指的是点击enter按钮。我们必须点击它一次才能实际调用该函数(否则我们只是call function()在命令行上输入,我们必须再次点击它才能让我们的替代品一直通过(不确定为什么,但无论如何)。

无论如何,希望这会有所帮助。这将采用v, V, 或突出显示的任何内容C-v,检查第一行是否被注释,如果是,请尝试取消注释所有突出显示的行,如果没有,则为每行添加额外的注释字符层。这是我想要的行为;我不只是想让它切换块中的每一行是否被注释,所以在问了 关于这个主题的多个问题后,它对我来说非常适合。


Yug*_*ari 5

视觉,Shift-I并没有为我工作。

没有任何插件的最简单的工作是


  1. 选择块 -V然后jk或任何相关动作(不要使用箭头键):)

  2. 然后点击:它提示命令:'<,'>

    评论

    Using #  - `s/^/#/` 
    
    Using `//` - `s/^/\/\//`
    
    Run Code Online (Sandbox Code Playgroud)

    取消注释

    Using #  - `s/^#//` 
    
    Using `//` - `s/^\/\//`
    
    Run Code Online (Sandbox Code Playgroud)

说明——

'<,'> - 适用于视觉块

s - 代替

^ - 以。。开始

在这种情况下为转义/添加字符后#\/\///

  • 这是我发现的最简单的方法。在这种情况下,插入命令的完整命令将是“&lt;,”&gt;s/^/#/g`。对我来说,如果不在末尾添加`/g,则表示光标移动到`'&lt;,'&gt;`范围的末尾,这是行不通的 (3认同)