如何在Vim中注释掉Python代码块

208
我想知道在Vim中是否有任何键映射,可以使我缩进某些代码行(无论这些行是否在可视模式下选择,或者位于当前光标位置上方/下方的n行)。
因此,基本上需要转换以下内容:
def my_fun(x, y):
    return x + y
to
#def my_fun(x, y):
#    return x + y

我可以使用#"""来注释相关行,同样地,如果给定的行已被注释,我也希望使用相同的按键映射取消注释。


不需要重新发明轮子,有一个适用于多种语言的插件tComment可以帮助您进行代码注释和取消注释。 - Meow
13个回答

448

步骤1: 跳转到您要评论的第一行的第一列。

初始状态

步骤2: 按下:Ctrl+v,选择您要注释的行:

选择行

步骤3: Shift-I#空格键(进入左侧插入模式,输入要插入的字符。选定的内容将消失,但所有其内部的行将在步骤4之后被修改。)

注释

步骤4: Esc

<Esc>


4
这种方式对这些行进行注释非常好。有没有取消注释的方法?Shift-I # <ESC>不起作用了(可能是我做错了)。 - Rishabh Manocha
49
使用可视化块(Ctrl-V)选择所有添加的#,然后键入x以删除它们。 - theosp
5
请记住,Shift+I 的意思是“插入到行中第一个非空格处”,因此它不能用于删除。使用 Ctrl+V 进行可视化选择,标记要修改的字符,然后使用 “x” 删除所选区域中的一个字符,最终删除了“#”字符。有关更多信息,请在 vim 中查看“:h I”和“:h CTRL-V”。 - the Tin Man
5
在Windows上,Ctrl-V可能无法使用。请改用Ctrl-Q。 - AZ.
3
要删除2个字符(如果插入了“#”),请将光标定位于要修改的顶行,按Ctrl-v进入可视块模式,按j(或下箭头)突出显示要修改的所有行,按l(或右箭头)突出显示2个字符宽度(每列按一次以突出显示),然后按d键删除突出显示的文本。 - thinkmassive
显示剩余9条评论

79

手动的一种方式

:set number
:10,12s/^/#

4
但是,你如何将它们移除呢? - Charlie Parker
18
@CharlieParker::10,12s/^#// - bstpierre
2
点赞这个旧校的答案 :) - mlv

57

您可以将以下映射添加到您的 .vimrc 文件中:

vnoremap <silent> # :s/^/#/<cr>:noh<cr>
vnoremap <silent> -# :s/^#//<cr>:noh<cr>

使用以下代码突出显示您的区块:

Shift+v

#用于注释第一列中的代码。

-#以同样的方式取消注释。


8
简单即是精华!谢谢你! - I159
2
@architectonic 只有在可视模式下才有效果,而且'#'在可视模式下未被绑定。http://vimdoc.sourceforge.net/htmldoc/visual.html#visual-operators - cdated
1
我稍作修改: Ctrl + k 用于注释 “vnoremap <silent> <C-k> :s#^###<cr>:noh<cr>” Ctrl + u 用于取消注释: “vnoremap <silent> <C-u> :s#^###<cr>:noh<cr>” - Pradip Das
2
@JonathanHartley 在这种情况下,您不必使用“/”作为分隔符,而“#”就可以了。因此,:s/^/#/ 和 :s/^#// 是等效的替换。所以用 '#' 替换行首,用 '' 替换第一列的 '#'。 <cr>:noh<cr> 只是清除搜索字符串,这样在完成后就不会有任何高亮显示的内容。 - cdated
2
@JonathanHartley,老实说,我只是按照一种模式而已,没有考虑太多。现在我很惊讶#和/没有更早地出现。根据常识改变了答案。谢谢! - cdated
显示剩余6条评论

35

使用快捷键 ShiftV 高亮您的代码块。

使用命令:norm i#(小写字母 "i")将选定的块注释掉。

要取消注释,需要再次选择代码块,并使用命令:norm ^x取消注释。

:norm 命令为每个选定的行执行一个操作。注释将在每行开头插入一个 #,而取消注释将删除该 #


使用最新的Vim和简单的配置,在可视模式下选择行(使用Shift+v),然后使用:norm i#只会更改第一个选定的行。这对我来说很有效,可以将389到391行注释掉::389,391norm i # - mmell

27

我通常会选中一个视觉块 (<C-V>),然后用搜索和替换功能将第一个字符替换为:

:'<,'>s/^/#

当选定一个可视块并进入命令模式时,会自动在命令行上放置 '<,'>。然后我可以通过扫出相同的可视块来取消注释该块:

:'<,'>s/^#//

18

有一些好的插件可以帮助注释或取消注释行。例如The NERD Commenter

The NERD Commenter 的示例快捷键:

[count]|<Leader>|cc |NERDCommenterComment|
Comment out the current line or text selected in visual mode.

[count]|<Leader>|cu |NERDCommenterUncomment|
Uncomments the selected line(s).

完整的文档位于此处


10
没有需要插件或映射。尝试使用内置的“norm”命令,它可以在每个选定的行上执行任何您想要的内容。 添加 # 注释
1. shift V to visually select lines
2. :norm i#

删除 # 注释

1. visually select region as before
2. :norm x

如果您的评论是有缩进的,您可以使用:norm ^x命令。请注意,这些只是普通的vim命令,前面加上“:norm”指令来对每一行执行它们。更详细的回答在这里的一些答案中使用“norm”命令。参考:What's a quick way to comment/uncomment lines in Vim?

10

我在我的.vimrc文件中有以下几行代码:

" comment line, selection with Ctrl-N,Ctrl-N
au BufEnter *.py nnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N><C-N>    <C-O>mn<C-O>:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>gv`n

" uncomment line, selection with Ctrl-N,N
au BufEnter *.py nnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>:s/^#$//ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N>n     <C-O>mn<C-O>:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR><C-O>:s/^#$//ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>gv:s/#\n/\r/ge<CR>:noh<CR>gv`n

这些快捷方式会保留您的光标位置和评论,只要评论以 # 开头(#后面有一个空格)。例如:

# variable x
x = 0

评论后:

# variable x
#x = 0

取消注释后:

# variable x
x = 0

不错,但我认为你最好使用更简单的s/^/#/正则表达式。我更喜欢注释字符出现在行的开头...但更重要的是,“注释注释”真的非常重要。我还会删除au BufEnter *.py,因为#注释足够通用,可以默认在所有缓冲区中使用命令。 - travc

6

NERDcommenter 是一个出色的评论插件,它自动检测多种文件类型及其相关的注释字符。使用 Pathogen 安装非常简单。

使用 <leader>cc 进行注释。使用 <leader>cu 取消注释。使用 <leader>c<space> 切换注释。

(在 vim 中,默认的 <leader> 键是 \)


5

有很多适用于vim的评论插件,其中许多都是多语言的,不仅仅是python。如果您使用像 Vundle 这样的插件管理器,则可以通过以下方式搜索它们(一旦安装了Vundle):

:PluginSearch comment

你会得到一个结果窗口。或者你可以直接在vim-scripts中搜索评论插件

如其他答案所述,NERDCommenter 是一个不错的插件 - 想了解更多使用信息,请参见此答案。注意:常用的<leader>键是\。例如,要注释一行,请输入:\cc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接