我在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(-#
)。
答案 0 :(得分:2113)
对于那些我大部分时间都在使用的任务block selection。
将光标放在第一个#
字符上,按 Ctrl V (或 Ctrl Q 对于gVim),然后向下直到最后一个注释行并按 x ,这将垂直删除所有#
个字符。
对于评论文本块几乎是相同的:
答案 1 :(得分:741)
%
如果要选择多个字符,请使用一个或组合这些方法:
答案 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)
我是这样做的:
转到要注释的第一行的第一个字符。
在GVIM中按 Ctrl + q 或在VIM中按 Ctrl + v ,然后按下选择行上的第一个字符以注释掉。
然后按 c ,并添加注释字符。
取消注释以相同的方式工作,只需键入空格而不是注释字符。
答案 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。
病原:
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
此插件提供:
<强>用法强>:
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
想要正确评估的内容。
if
:vnoremap <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()
,v
或V
突出显示任何内容,检查第一行是否已注释,如果是,请尝试取消注释所有突出显示的行,如果没有,请添加额外的行每行的注释字符层。这是我理想的行为;我不只是想让它切换块中的每一行是否被评论,所以在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
对我不起作用。
无需任何插件即可运行的最简单
选择块 - V
然后 j
或 k
(不要使用箭头键):)
然后点击 :
它会提示命令 :'<,'>
评论
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和普通文件
它在普通和可视模式下对不同源文件中的行进行注释和取消注释
用法:
答案 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)
答案 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>
特殊视觉模式(更快)
搜索/替换+正则表达式
:
。您将得到此提示'<,'>
。s/#//
将哈希值替换为空。s/# //
来包含空格)。 g
模式
:
。您将得到此提示'<,'>
。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
另请参见
答案 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)
要取消注释整个文件:
答案 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 。这将注释掉您选择的行数。
取消注释行相反。