我在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,这将#垂直删除所有字符.
对于评论文本块几乎是相同的:
VISUAL BLOCK模式.INSERT模式,然后按#.这将向第一行添加哈希.#在所有其他选定的行上插入一个字符.对于debian/ubuntu默认附带的精简版vim,请输入: s/^/#第三步.
这是两个用于视觉参考的小屏幕录音.
ame*_*lia 776
%
如果要选择多个字符,请使用一个或组合这些方法:
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对此答案的改进)
Man*_*ron 171
我使用NERD Commenter脚本.它可以让您轻松评论,取消注释或切换代码中的注释.
如评论中所述:
对于任何对使用感到困惑的人,默认的领导者是"\"所以10\cc将评论十行,10\cu将取消注释这十行
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取消注释一行(在正常模式和可视模式下都可以).
(我多年前从某个网站偷了它,所以我不能完全解释它是如何工作的:).有一个评论说明.)
小智 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)
Mar*_*cin 56
我是这样做的:
转到要注释掉的第一行的第一个字符.
命中Ctrl+ q在GVIM或Ctrl+ v在VIM,然后再往上选择行第一个字符注释掉.
然后按c,并添加注释字符.
取消注释以相同的方式工作,只需键入空格而不是注释字符.
小智 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的启动速度,但这只是我的偏好.我也试图保持简单和高效.如果您确实使用自动命令,则需要确保将它们放在自动命令组中,否则回调会在每个文件加载时多次添加到文件类型,并导致大量性能下降.
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一样.
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删除注释.
And*_*ndy 13
我使用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
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 模式的更多详细信息,请查看这里。
我喜欢使用tcomment插件:http://www.vim.org/scripts/script.php? script_id = 1173
我已经映射了gc和gcc来评论一行或突出显示的代码块.它检测文件类型并且工作得很好.
如何在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,所有选定的行都将获得您指定的注释符号.
在我之前有30个答案,我将尝试提供一个更简单的解决方案:#在行的开头插入一个.然后沿着一条线按下dot(.).要重复,做j,.,j,.,等...要取消注释,删除#(你能打到x过#),并使用反向做k,.等...
是的,这个问题已经有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)
修改上面的正则表达式,以满足您#应该在哪里的品味:
一些常规的 Vim 命令不适用于我在 Windows 上的设置。 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
Run Code Online (Sandbox Code Playgroud)
以下方法删除#符号并保留缩进。
方法
将光标移至第一个注释(箭头或h, j, k, l)。然后应用以下技术之一:
视觉块模式(更快)
代换
:s/#//将哈希值替换为空:s/# //包含空格(可选):norm命令
在 VISUAL 模式下突出显示文本:Shift + v
输入命令+:
:norm ^x删除第一个非空白字符:norm ^xx包含空格(可选)Enter
g模式
:g/#/norm! ^x。:g/#/norm! ^xx包含空格(可选)dgn
\# Enterdgn......结果
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)
也可以看看
+:在视觉模式下输入并创建:'<,'>提示。
有这个改变生活的插件tpope叫做vim-commentary
https://github.com/tpope/vim-commentary
这个插件提供:
用法:
:<,'>:<,'>Commentary并按Enter。我使用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)
"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?上的人那里得到了原始代码。并做了一些小更改(更改了快捷键,并在#后面添加了一个空格)。
从这里答案中的想法开始,我启动了自己的评论功能。它可以打开和关闭评论。它可以处理诸如//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)
您可以通过 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)
如果您无法安装插件但仍希望注释字符遵循现有的缩进级别,则此答案最有用。
这个答案在这里是为了 1) 显示正确的代码粘贴到 a.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>
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,检查第一行是否被注释,如果是,请尝试取消注释所有突出显示的行,如果没有,则为每行添加额外的注释字符层。这是我想要的行为;我不只是想让它切换块中的每一行是否被注释,所以在问了 关于这个主题的多个问题后,它对我来说非常适合。
视觉,Shift-I并没有为我工作。
没有任何插件的最简单的工作是
选择块 -V然后j或k或任何相关动作(不要使用箭头键):)
然后点击:它提示命令:'<,'>
评论
Using # - `s/^/#/`
Using `//` - `s/^/\/\//`
Run Code Online (Sandbox Code Playgroud)
取消注释
Using # - `s/^#//`
Using `//` - `s/^\/\//`
Run Code Online (Sandbox Code Playgroud)
说明——
'<,'> - 适用于视觉块
s - 代替
^ - 以。。开始
在这种情况下为转义/添加字符后#\/\///
| 归档时间: |
|
| 查看次数: |
828344 次 |
| 最近记录: |