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

时间:2009-11-04 21:06:33

标签: 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

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

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

50 个答案:

答案 0 :(得分:2113)

对于那些我大部分时间都在使用的任务block selection

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

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

  1. 首先,转到要评论的第一行,按 Ctrl V 。这将使编辑器处于VISUAL BLOCK模式。
  2. 然后使用箭头键并选择直到最后一行
  3. 现在按 Shift I ,这会将编辑器置于INSERT模式,然后按。这将向第一行添加哈希。
  4. 然后按 Esc (给它一秒钟),它将在所有其他选定行上插入#个字符。
  5. 对于debian / ubuntu默认附带的精简版vim,请改为在第三步中键入: s/^/#

    以下是两个用于视觉参考的小屏幕录像。

    注释: Comment

    取消注释: Uncomment

答案 1 :(得分:741)

注释掉vim中的块:

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

取消注释vim中的块:

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

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

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

  • d x 删除字符,必要时重复

答案 2 :(得分:280)

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

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

评论 #

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

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

取消注释 #

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

这会删除每一行的第一个字符。如果我使用了诸如//之类的2-char评论,那么我只需要:norm xx来删除这两个字符。

如果评论是按照OP的问题缩进的,那么你可以像这样锚定你的删除:

:norm ^x

表示&#34;转到第一个非空格字符,然后删除一个字符&#34;。请注意,与块选择不同,即使注释具有不均匀的缩进,此技术仍然有效!

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

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

vnoremap <C-n> :norm

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

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

答案 3 :(得分:163)

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

comments中所述:

  

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

答案 4 :(得分:113)

我的.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>

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

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

答案 5 :(得分:101)

指定要在vim中评论的行:

显示行号:

:set number

然后

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

或者这个:

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

答案 6 :(得分:51)

我是这样做的:

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

  2. 在GVIM中按 Ctrl + q 或在VIM中按 Ctrl + v ,然后按下选择行上的第一个字符以注释掉。

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

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

答案 7 :(得分:28)

我已经为我的.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静态函数/映射更慢地减慢了Vim的启动速度,但这只是我的偏好。我也试图保持简单和高效。如果您确实使用自动命令,则需要确保将它们放在自动命令组中,否则回调会在每个文件加载时多次添加到文件类型,并导致大量性能下降。

答案 8 :(得分:26)

切换评论

如果你需要的只是切换评论,我宁愿选择commentary.vim tpope

enter image description here

安装

病原:

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

VIM-插头:

Plug 'tpope/vim-commentary'

Vundle:

Plugin 'tpope/vim-commentary'

进一步定制

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

您现在可以按Leader + /切换评论,就像Sublime和Atom一样。

答案 9 :(得分:22)

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

答案 10 :(得分:14)

以下是我.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 删除注释。

答案 11 :(得分:10)

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

评论:

如果该行在开头没有制表符/空格:
ctrl + V然后jjj然后shift + I (cappital i)然后//然后esc esc
如果该行在开头有标签/空格,您仍然可以执行上述操作或交换c
ctrl + V然后jjj然后c然后//然后esc esc

取消注释:

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

如果行的开头有标签/空格,那么您将其间隔esc ctrl + V然后jjj然后ll (lower cap L)然后c然后space然后esc

答案 12 :(得分:9)

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

#code code
#code
#code code code

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

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

code code
code
code code code

将光标放在左上角的字符上,按 Ctrl V 。这使您处于可视阻止模式。按 J 三次以选择所有三行。然后按:

/ / ESC

这是一个资本I,//和Escape。

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

答案 13 :(得分:9)

在我前面有30个答案时,我会尝试提供一个更简单的解决方案:在行的开头插入#。然后沿着一条线按住点(.)。要重复,请执行j.j.等...要取消注释,请移除#(您可以点击{{1}在x上方,并使用#k等进行反向...

答案 14 :(得分:9)

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

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

答案 15 :(得分:7)

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

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

这种方法可以让你做到:

  • ccj对下两行进行评论,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>

(请参阅有关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

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

答案 16 :(得分:6)

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

答案 17 :(得分:6)

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

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

答案 18 :(得分:5)

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

答案 19 :(得分:4)

now = pendulum.now() future = now.add(years=10, weeks=5) delta = future - now delta.in_words() >>>'10 years 1 month 4 days' 名为tpope

的生活改变插件

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

此插件提供

  • 理智
  • 正确缩进评论
  • 不会注释掉空/不必要的行

<强>用法

  • 通过Vundle(或我猜的病原体)安装。
  • 突出显示您的文字,然后按,其显示为vim-commentary
  • 在此处输入评论:<,'>,然后按输入
  • 动臂。你做完了。

答案 20 :(得分:4)

这个答案是1)显示正确的代码,粘贴到.vimrc以获取vim 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>

工作原理:

  • 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,这可以确保我们不必逃避我们的()1,它们指的是我们用我们制作的群组{ {1}}。基本上,我们匹配以任意数量的空格开头的行,然后是我们的注释字符,后跟任意数量的空格,我们只保留第一组空格。同样,如果我们在该行上没有评论字符,()会让我们无声地失败。

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

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

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

无论如何,希望这会有所帮助。这将使用call function()vV突出显示任何内容,检查第一行是否已注释,如果是,请尝试取消注释所有突出显示的行,如果没有,请添加额外的行每行的注释字符层。这是我理想的行为;我不只是想让它切换块中的每一行是否被评论,所以在asking multiple关于这个主题的问题之后,它对我来说非常适合。

答案 21 :(得分:4)

我结合了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/\([^ ]\)/' . b:comment_leader . ' \1/'
    execute ':silent! s/^\( *\)' . b:comment_leader . ' \?' . b:comment_leader . ' \?/\1/'
endfunction
map <F7> :call CommentToggle()<CR>

答案 22 :(得分:4)

Visual 和 Shift-I 对我不起作用。

无需任何插件即可运行的最简单


  1. 选择块 - V 然后 jk(不要使用箭头键):)

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

    评论

    Using #  - `s/^/#/` 
    
    Using `//` - `s/^/\/\//`
    

    取消注释

    Using #  - `s/^#//` 
    
    Using `//` - `s/^\/\//`
    

说明 -

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

s - 替代

^ - 以

开头

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

答案 23 :(得分:4)

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

答案 24 :(得分:3)

从这里的答案中的想法开始,我开始自己的评论功能。 它会打开和关闭评论。它可以处理//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>

答案 25 :(得分:3)

这是基于C-v后面跟I方法的基本单线程。

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

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

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

E.g。如果选择了以下文本:

1
2

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

//1
//2

答案 26 :(得分:3)

我使用comments.vim from Jasmeet Singh Anand(在vim.org上找到),

适用于C,C ++,Java,PHP [2345],proc,CSS,HTML,htm,XML,XHTML,vim,vimrc,SQL,sh,ksh,csh,Perl,tex,fortran,ml,caml ,ocaml,vhdl,haskel和普通文件

它在普通和可视模式下对不同源文件中的行进行注释和取消注释

用法:

  • Ctrl C 评论一行
  • Ctrl X 取消评论一行
  • Shift V 并选择多行,然后 Ctrl C 来评论选定的多行
  • Shift V 并选择多行,然后 Ctrl X 取消对所选多行的注释< / LI>

答案 27 :(得分:3)

最快,最直观的方法是重新映射)以便对行进行逐行评论,然后(重新进行取消注释。尝试一下,你就不会回去了。

Ruby Bash 中,有2个空格缩进:

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

C / C ++ PHP 中,有4个空格缩进:

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

缺点是你因为句子移动而丢失了()(但是das可以在那里填写),而且你偶尔也会选择和替换 Ctrl V 用于处理长节。但这种情况非常罕见。

对于C风格,长评论最好用以下方式处理:

set cindent
set formatoptions=tcqr

...这与使用V[move]gq重做自动翻译相结合。

答案 28 :(得分:2)

您可以使用tpope(https://github.com/tpope/vim-commentary)的vim-comment,您可以按照以下方式使用它:

进入可视模式
'v'

然后按

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

现在您只需输入键即可完成选择:

'gc'

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

'gc'

答案 29 :(得分:2)

我使用vim-multiple-cursors

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

答案 30 :(得分:2)

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

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

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

这是//评论,但你可以轻松地适应其他角色。您可以使用autocmd将领导者设置为jqno建议。

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

答案 31 :(得分:1)

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

答案 32 :(得分:1)

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

使用/ * ... * /

进行评论

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

<c-V>}

在选择中键入要应用的命令

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

命令如下::'<,'>norm i /* ^[$a */

详见(i *)。

取消注释/ * ... * /

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

<c-V>}

在选择中键入要应用的命令

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

命令如下::'<,'>norm :s-\s*/\*\s*-^M$bbld$

有关详细信息,请参阅(ii *)。

结果

效果是逐行评论:

Comment block
Comment block
Comment block

成为(反之亦然):

/* Comment block */
/* Comment block */
/* Comment block */

最好将其保存为map中的@reg.vimrc,因为键入的内容很多。如果您希望整个块只有一个/**/,请使用:

使用单个/ * * /整个块进行评论

通过记录qc,然后在段落的开头发表评论,将其保存在注册表中:

v}di/*  */<esc>hhhp

并且不要再忘记q,以完成记录。

详见(iii *)。

从块中取消注释单个/ * * /

将其保存在注册表中,例如@u。将光标放在块内的任何位置,然后:

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

通过完成q命令保存寄存器。

有关详细信息,请参阅(iv *)。

结果

效果是多行的单一评论:

Comment block
Comment block
Comment block

成为(反之亦然):

/* Comment block
Comment block
Comment block */

<强>说明

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

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

(ii *)它还使用norm在每一行重复搜索/替换。搜索spaces /* spaces并替换为空。在那之后,找到行的结尾,后面两个单词,右边一个字母,删除到最后。

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

(iii *)v}选择段落,删除它,插入评论打开和关闭,移到中间并粘贴已删除的块。

v}di/*  */<esc>hhhp

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

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

答案 33 :(得分:1)

我在Windows上的设置无法使用一些常规的Vim命令。其中有 Ctrl + v Ctrl + q 。后来我发现以下方法可以有效地取消注释行。

给予

一些缩进的评论

   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim
   # Practice in Vim

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

方法

将光标移动到第一个注释(箭头或 h j k l )< / p>

特殊视觉模式(更快)

  • Ctrl + Shift + v 进入特殊的视觉模式
  • j s选择垂直线。
  • l 包括水平字符(可选)
  • x 删除该区块

搜索/替换+正则表达式

  • 选择具有常规视觉模式的文本,即 Shift + v
  • 输入:。您将得到此提示'<,'>
  • 输入正则表达式,例如s/#//将哈希值替换为空。
    (可选:键入s/# //来包含空格)。
  • 输入

g模式

  • 以常规视觉模式选择文本,即 Shift + v
  • 输入:。您将得到此提示'<,'>
  • 发出命令。输入g/#/norm! ^x
    (可选:键入g/#/norm! ^xx来包含空格)。
  • 输入

结果

    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim
    Practice in Vim

另请参见

  • Primeagen的g命令中的tutorial
  • Post关于删除缩进的注释
  • Post,了解如何快速对视频添加评论

答案 34 :(得分:1)

即使这个问题已经有很多答案,我仍然认为我会对我写的一个小插件大加赞赏:commentify

Commentify使用commentstring设置来决定如何注释掉一段代码,因此您不必在配置中保留不同注释类型的映射,并且支持基于行的注释(例如, //)并阻止评论(例如/* */)。

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

答案 35 :(得分:0)

在VIM中:

1-按下v进入视觉模式。

2-使用箭头选择要注释的块。

3-按:

4-类型's/^/#'

要删除评论,只需将步骤4替换为:

4-类型's/^#//'

答案 36 :(得分:0)

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

上面的代码将注释掉所有包含“备用”的行,并在其后加上一个数字,再加上找到该行的两行。 有关更多此类用途,请访问:http://vim.wikia.com/wiki/Search_and_replace#Details

答案 37 :(得分:0)

要取消注释整个文件:

  1. Esc 退出插入模式
  2. g g 转到第一行的第一个字符
  3. ctrl + V ctrl + shift + < kbd> v 选择当前字符
  4. G shift + g 转到最后一行
  5. x 删除选择

答案 38 :(得分:0)

我通常会这么做

if [[ 1 == 0 ]] ; then

stuff to comment out

fi

对于我来说,这比上面提到的大多数其他技术都容易记住。

答案 39 :(得分:0)

简短
使用注释符号(例如 #//)作为第一个字符且不缩进,通过按 .(点)快速注释非连续行使用 gI(大写 i)

编辑后


我现在意识到(多年后),按 gI (大写 i)会将光标置于插入模式下的第 1 列(意思是:在行首,无论是单词还是非单词字符) .

插入注释符号(如 #)并按 escape - 现在可以在按键盘上的 .(点)。

与按 0i 或仅按 I 不同的是,它将注释符号放置在第一个单词字符处,部分还带有不需要的缩进

答案 40 :(得分:0)

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

答案 41 :(得分:0)

评论A行(适用于所有语言):

  • noremap <silent> ,// :call CommentLine() <CR>

我们可以使用 行数 来调用它,也可以在 可视模式 中调用它,它可以正常工作。例如:要评论四行,请使用 4,// 并取消注释使用 4,/

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

  • noremap <silent> ,/ :call UnCommentLine() <CR>

如果您想添加新符号[评论] ,则在功能中添加列表并添加一些。如果要添加已在其中一个列表中定义的 注释符号 的语言,只需在相应列表中添加您的语言名称(要获取正确的名称:< strong>在vim中打开文件并使用:set ft 获取正确的语言名称)。

  

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

  

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

答案 42 :(得分:0)

:%s​​ / ^ / \ / \ / / g

删除字符和之间的sapces 使用此命令评论.C或CPP文件

答案 43 :(得分:0)

此解决方案映射/评论和?取消注释(使用单一映射进行注释切换太复杂,无法正确实现)。它需要来自VIM内置commentstring选项的评论字符串,如果声明/usr/share/vim/vim*/ftplugin/*.vim,则会从filetype plugin on等文件填充。

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>"

答案 44 :(得分:0)

我个人不喜欢评论“切换”功能,因为它会破坏已经包含在代码中的评论。另外,我想让评论字符出现在最左边,所以我可以很容易地看到评论块。此外,我希望这可以嵌套工作(如果我首先注释掉一个块,然后是一个封闭的块)。 因此,我略微改变了其中一个解决方案。我使用 F5 进行评论,并使用 Shift - F5 取消注释。另外,我在s /命令的末尾添加了一个/ g:

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>

答案 45 :(得分:0)

@ CMS的解决方案是评论进/出行最“vim native”的方式。在@ CMS的第二步中,在 Ctrl V 之后,您还可以使用 r 添加注释或 x 删除它们。 Drew Neil的Practical Vim,第46页,很好地解释了这种技术。

另一个好的选择是使用ex模式命令。 [范围] 正常 。显然,为了保存这个按键,你需要注释掉15行以上。

答案 46 :(得分:0)

有几个vim插件,如Tcomment和nerdcommenter可用。

我使用tcomment进行评论。

gcc:它将切换当前行的评论。 v {motion} gc:它会切换评论一系列视觉选择的行

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

这些命令可用于处理任何语言的评论。

答案 47 :(得分:0)

"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行。

我从What's the most elegant way of commenting / uncommenting blocks of ruby code in Vim?上的人处获得了原始代码,并进行了一些小改动(更改了快捷键,并在#后添加了空格)。

答案 48 :(得分:-1)

通过标记命令标记文本区域,例如ma和mb type命令: :&#39; A,&#39; BG /(.*)/小号//// \ 1 /

你可以在这里看到这种测试操作的一个例子 http://bknpk.ddns.net/my_web/VIM/vim_shell_cmd_on_block.html

答案 49 :(得分:-2)

ctrl + v 然后使用选择要评论的行数。然后按 shift + I ,按然后按 ESC 。这将注释掉您选择的行数。

取消注释行相反。