我在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
假设我想取消注释第一个定义中的所有行。。。端部。在Vim中有什么有效的方法可以做到这一点?
总的来说,我正在寻找一种简单、流畅的方式来注释和取消注释行。这里我处理的是Ruby代码,但可能是JavaScript(//)或Haml(-#)。
所有这些方法中最快、最直观的方法是重新映射()行的逐步注释,然后()逐步取消注释。尝试一下,你就不会再回去了。
在Ruby或Bash中,使用2空间缩进:
map ) I# <Esc>j
map ( k^2x
在C/C++或PHP中,使用4空间缩进:
map ) I// <Esc>j
map ( k^4x
缺点是你在句子移动时会丢失(和)(但das可以在其中填充),而且你偶尔会在处理长段时使用select and replace或CtrlV。但这很罕见。
对于C样式,长注释最好用以下方式处理:
set cindent
set formatoptions=tcqr
…这与使用V[move]gq重新进行单词换行结合得很好。
是的,这个问题已经有33个(大部分是重复的)答案。
下面是另一种在Vim中注释行的方法:运动。基本思想是使用与键入yip删除段落或键入dj删除2行相同的方法注释或取消注释行。
这种方法可以让您执行以下操作:
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>
(请参阅有关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
修改上面的正则表达式以适合您的口味,即#应该在哪里:
有时我会被推到一个远程盒子里,我的插件和.vimrc无法帮助我,或者有时NerdCommenter会出错(例如嵌入HTML中的JavaScript)。
在这些情况下,一种低技术的替代方法是内置的norm命令,它只在指定范围内的每一行运行任意vim命令。例如:
评论#:
1. visually select the text rows (using V as usual)
2. :norm i#
这将在每行的开头插入“#”。请注意,当您键入:范围将被填充,因此它看起来真的像:'<,'>norm i#
取消注释#:
1. visually select the text as before (or type gv to re-select the previous selection)
2. :norm x
这将删除每行的第一个字符。如果我使用了一个2个字符的注释,比如//,那么我只需要:norm xx来删除这两个字符。
如果注释如OP问题中那样缩进,那么您可以这样锚定删除:
:norm ^x
意思是“转到第一个非空格字符,然后删除一个字符”。请注意,与块选择不同,即使注释有不均匀的缩进,此技术也有效!
注意:由于norm实际上只是执行常规的vim命令,所以您不限于注释,还可以对每一行进行一些复杂的编辑。如果需要将转义符作为命令序列的一部分,请键入ctrl-v,然后按转义键(或者更简单,只需录制一个快速宏,然后使用norm在每行上执行该宏)。
注2:如果您发现自己经常使用规范,当然也可以添加映射。例如,在~/.vimrc中放入以下行可以让您在进行视觉选择后键入ctrl-n而不是:norm
vnoremap <C-n> :norm
注意3:裸骨vim有时没有编译规范命令,因此请确保使用增强版本,即通常为/usr/bin/vim,而不是/bin/vi
(感谢@Manbroski和@rakslice对本答案的改进)