我在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( -#
) .
30 回答
使用Control-V选择文本的矩形:转到第一个
#
字符,键入Ctrl V,向右移动一次,然后向下移动,直到注释结束 . 现在输入x
:您将删除所有#
字符,后跟一个空格 .这是我
.vimrc
的一部分:在正常和可视模式下,这可以让我按,ic插入注释,然后按rc删除注释 .
这个答案在这里1)显示正确的代码粘贴到
.vimrc
以获取vim 7.4+
进行块注释/取消注释,同时在可视模式下保持缩进级别1个快捷方式,2)解释它 .这是代码:
这个怎么运作:
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
,这是指我们用()
制作的组 . 基本上,我们匹配一行以任何数量的空格开头,然后我们的注释字符后跟任意数量的空格,我们只保留第一组空格 . 同样,如果我们在该行上没有注释字符,e
让我们无声地失败 .let l:line=getpos("'<")[1]
:这设置了一个变量,就像我们使用注释字符一样,但l
指的是本地范围(此函数的本地范围) . 在这种情况下,getpos()
获取我们突出显示的开始位置,[1]
表示我们只关心行号,而不是列号等其他内容 .if match(getline(l:line), '^\s*'.b:commentChar)>-1
:你知道if
是如何工作的 .match()
检查第一件事是否包含第二件事,因此我们 grab 我们开始突出显示的行,并检查它是否以空格开头,后跟我们的注释字符 .match()
返回此为真的索引,如果未找到匹配则返回-1
. 由于if
评估所有非零数字为真,我们必须比较输出以查看它是否大于-1 .vim
中的比较如果为false则返回0,如果为真则返回1,这是if
想要正确评估的内容 .vnoremap <silent> <C-r> :<C-u>call Comment()<cr><cr>
:vnoremap
表示在可视模式下映射以下命令,但不要更改可能以其他方式使用的任何其他命令 . 基本上,如果你是一个vim新手,总是使用noremap
来确保你不会破坏东西 .<silent>
表示"I don't want your words, just your actions"并告诉它不要在命令行中打印任何内容 .<C-r>
是我们要映射的东西,在这种情况下是ctrl r(请注意,在这种映射的正常模式下,你仍然可以正常使用C-r用于"redo") .C-u
有点令人困惑,但基本上它确保你不会忘记你的视觉突出显示(根据this answer它使你的命令以'<,'>
开始,这是我们想要的) .call
这里只是告诉vim执行我们命名的函数,<cr>
指的是按enter
按钮 . 我们必须打一次实际上调用函数(否则我们只是在命令行上键入call function()
,我们必须再次点击它以让我们的替代品一直通过(不确定为什么,但无论如何) .无论如何,希望这会有所帮助 . 这将使用
v
,V
或C-v
突出显示任何内容,检查第一行是否被注释,如果是,则尝试取消注释所有突出显示的行,如果没有,则为每行添加额外的注释字符层 . 这是我理想的行为;我不只是想让它切换块中的每一行是否都被评论过,所以在关于这个主题的问题之后,它对我来说是完美的 .这是基于
C-v
的基本单线程,后面是I
方法 .This command (:Comment) adds a chosen string to the beginning of any selected lines.
将此行添加到
.vimrc
以创建一个接受单个参数的命令,并将参数放在当前选择中每行的开头 .例如 . 如果选择以下文本:
并运行:
:Comment //
,结果将是:在我前面有30个答案,我将尝试提供一个更简单的解决方案:在行的开头插入一个
#
. 然后沿着一条线按下点(.
) . 要重复,请执行j
,.
,j
,.
等...要取消注释,请删除#
(可以通过#
点击x
),然后使用k
,.
等执行相反操作...我使用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
您可以使用tpope(https://github.com/tpope/vim-commentary)的vim-comment来使用它,如下所示:
按下进入可视模式
然后按
现在您只需输入键即可完成选择:
这将注释掉所有选择,取消注释重复键:
有时我被绑在一个远程盒子里,我的插件和.vimrc无法帮助我,或者有时候NerdCommenter弄错了(例如嵌入HTML中的JavaScript) .
在这些情况下,一个低技术替代方案是内置
norm
命令,它只在指定范围内的每一行运行任意vim命令 . 例如:Commenting with
#
:这会在每行的开头插入"#" . 请注意,当您键入:范围将被填充,所以它看起来真的像
:'<,'>norm i#
Uncommenting
#
:这将删除每一行的第一个字符 . 如果我使用了诸如//之类的2-char注释,那么我只需要
:norm xx
删除两个字符 .如果评论在OP的问题中缩进,那么您可以锚定您的删除,如下所示:
这意味着“转到第一个非空格字符,然后删除一个字符” . 请注意,与块选择不同,即使注释具有不均匀的缩进,此技术也可以工作!
注意:由于
norm
实际上只是执行常规vim命令,因此您不仅限于注释,还可以对每一行进行一些复杂的编辑 . 如果您需要将转义字符作为命令序列的一部分,请键入ctrl-v然后点击转义键(或者更简单,只需记录一个快速宏,然后使用norm在每一行上执行该宏) .注意2:如果你发现自己经常使用
norm
,你当然也可以添加一个映射 . 例如,将以下行放在〜/ .vimrc中,可以在进行视觉选择后键入ctrl-n
而不是:norm
注3:Bare-bones vim有时没有编译成
norm
命令,所以一定要使用增强版本,即通常是/ usr / bin / vim,而不是/ bin / vi(感谢@Manbroski和@rakslice对此答案的改进)
这个简单的片段来自我的.vimrc:
它适用于// - 评论,但您可以轻松地适应其他角色 . 您可以使用autocmd将领导者设置为jqno建议 .
这是一种非常简单有效的方式,可以自然地使用范围和视觉模式 .
一世为此使用vim-multiple-cursors .
要选择区域,请按0(它为零,不是字母"o")转到要注释掉的区域的第一行或最后一行的第一个字符 . 然后按V并使用J,K或向上和向下箭头键选择区域 .
然后按CtrlN将虚拟光标放在选择的每一行上 .
然后按I同时编辑选择的每一行 .
我的
.vimrc
中有以下内容:现在,您可以键入
,cc
来注释一行,使用,cu
来取消注释一行(在正常模式和可视模式下都可以) .(我多年前从某个网站偷了它,所以我不能完全解释它是如何工作的:) . 有一个comment在哪里解释 . )
我是这样做的:
转到要注释掉的第一行的第一个字符 .
在GVIM中按Ctrl键q或在VIM中按Ctrl键,然后向下键选择要注释掉的行上的第一个字符 .
然后按c,添加注释字符 .
取消注释以相同的方式工作,只需键入空格而不是注释字符 .
我结合了Phil和jqno的回答,并用空格做了无聊的评论:
从这里的答案中的想法开始,我开始了自己的评论功能 . 它会打开和关闭评论 . 它可以处理像
//print('blue'); //this thing is blue
之类的东西,只是切换第一条评论 . 此外,它在第一个非空白区域添加注释和单个空格,而不是在行的开头 . 另外,它不会不必要地复制空白,但是在评论和缩进行时使用缩放(:h \ zs求助)来避免这种额外的工作 . 希望它有助于一些极简主义者 . 欢迎提出建议 .我使用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和普通文件
它在正常和可视模式下对不同源文件中的行进行注释和取消注释
用法:
CtrlC到 comment 单行
CtrlX到 un-comment 单行
ShiftV并选择多行,然后按CtrlC注释所选的多行
ShiftV并选择多行,然后按CtrlX取消注释选定的多行
我喜欢使用tcomment插件:http://www.vim.org/scripts/script.php?script_id=1173
我已经映射了gc和gcc来注释一行或突出显示的代码块 . 它检测文件类型并且工作得很好 .
是的,这个问题已经有33个(主要是重复的)答案 .
这是另一种如何在Vim中注释掉行的方法: motions . 基本思想是使用与通过键入
yip
或通过键入dj
删除2行来删除段落相同的方法来注释或取消注释行 .这种方法可以让你做到这样的事情:
ccj
评论下两行,并cuk
取消注释;cci{
将一个块注释掉,并cui{
取消注释;ccip
评论整个段落,cuip
取消注释 .ccG
将所有内容评论到最后一行,并cugg
取消注释到第一行的所有内容 .您只需要 operate over motions 的2个函数,以及每个函数的2个映射 . 首先,映射:
(请参阅有关
g@
运算符和operatorfunc
变量的手册 . )而现在的功能:
修改上面的正则表达式,以满足您对
#
应该在哪里的品味:How to uncomment the following three lines in vi:
将光标放在左上角的
#
符号上,然后按CtrlV . 这使您处于可视阻止模式 . 按向下箭头或J三次以选择所有三条线 . 然后按D.所有评论都消失了 . 要撤消,请按U.How to comment the following three lines in vi:
将光标放在左上角的字符上,按CtrlV . 这使您处于可视阻止模式 . 按↓或J三次以选择所有三条线 . 然后按:
I // Esc键
这是资本I,//和Escape .
按ESC键时,所有选定的行将获得您指定的注释符号 .
Specify which lines to comment in vim:
显示行号:
然后
或这个:
我用的是NERD Commenter script . 它可以让您轻松评论,取消注释或切换代码中的注释 .
如_111761中所述:
对于那些我大部分时间都在使用block selection的任务 .
将光标放在第一个
#
字符上,按CtrlV(或CtrlQ表示gVim),然后向下直到最后一个注释行并按x,这将垂直删除所有#
字符 .对于评论文本块几乎是相同的:
首先,转到要评论的第一行,按CtrlV . 这将使编辑器处于
VISUAL BLOCK
模式 .然后使用箭头键和选择直到最后一行
现在按ShiftI,将编辑器置于
INSERT
模式,然后按# . 这将向第一行添加哈希 .然后按Esc(给它一秒钟),它将在所有其他选定行上插入
#
字符 .对于默认情况下随debian / ubuntu一起提供的精简版vim,请在第三步中键入
: s/^/#
.这是两个用于视觉参考的小屏幕录制 .
评论:
取消注释:
它们中最快捷,最直观的方法是将
)
重新映射为行的逐行注释,然后重新编号(
以便取消注释 . 尝试一下,你就不会回去了 .在 Ruby 或 Bash 中,有2个空格的缩进:
在 C/C++ 或 PHP 中,有4个空格的缩进:
缺点是你会因为句子移动而丢失
(
和)
(但是das
可以在那里填写),并且你偶尔会回到选择和替换或CtrlV来处理长段 . 但这种情况非常罕见 .对于C风格,长评论最好用以下方式处理:
...结合使用
V[move]gq
来重做自动换行 .我已经想出了一个简单的添加到我的.vimrc文件,该文件运行良好,可以轻松扩展 . 您只需向comment_map及其评论 Headers 添加新的文件类型即可 .
我添加了正常和可视模式的映射,但您可以重新映射到您喜欢的任何内容 . 我更喜欢只有'切换'风格的功能 . 一个熊有多个映射等 .
注意:
我't use any callbacks or hooks into the file types/loading, because I find they slow down Vim'的启动比
.vimrc
静态函数/映射更多,但's just my preference. I'也试图保持简单和高效 . 如果您确实使用自动命令,则需要确保将它们放在自动命令组中,否则回调会在每个文件加载时多次添加到文件类型,从而导致性能大幅下降 .如果您已经知道行号,那么
n,ms/# //
将起作用 .我用EnhancedCommentify . 它评论我需要的一切(编程语言,脚本,配置文件) . 我使用它与视觉模式绑定 . 只需选择要评论的文本,然后按co / cc / cd即可 .
这个改变生命的插件由
tpope
称为vim-commentary
https://github.com/tpope/vim-commentary
This plugin provides :
理智
正确缩进评论
不会注释掉空/不必要的行
Usage :
通过Vundle安装(或者我想是病原体) .
突出显示您的文字并按:这将显示为
:<,'>
在此处输入评论
:<,'>Commentary
并按Enter键 .轰隆 . 你做完了 .
在vim中注释掉块:
按Esc(退出编辑或其他模式)
点击ctrl v(可视块模式)
使用向上/向下箭头键选择你想要的行(它赢了't highlight everything - it' s OK!)
Shift i(资本I)
插入您想要的文字,即
%
按EscEsc
要取消注释vim中的块:
按Esc(退出编辑或其他模式)
点击ctrl v(可视块模式)
使用↑/↓箭头键选择要取消注释的行 .
如果要选择多个字符,请使用一个或组合这些方法:
使用左/右箭头键选择更多文本
选择文本块使用shift←/→箭头键
你可以反复按下面的删除键,就像常规的删除按钮一样
如有必要,请按d或x删除字符
我标记了第一行和最后一行(ma和mb),然后执行:'a,'bs / ^#//
切换评论
如果你需要的只是 toggle comments ,我宁愿和commentary.vim一起去commentary.vim .
安装
病原:
VIM插头:
Vundle:
进一步定制
将其添加到.vimrc文件中:
noremap <leader>/ :Commentary<cr>
您现在可以按
Leader
/
切换注释,就像Sublime和Atom一样 .我使用Tim Pope的vim-commentary插件 .