在 Vim 编辑器中,注释代码是日常开发中的常见操作,掌握高效的注释命令能显著提升编程效率,Vim 本身没有内置的“通用注释命令”,但结合其强大的模式切换和自定义功能,可以通过多种方式实现注释操作,包括手动注释、利用插件、映射快捷键等,以下将详细介绍不同场景下的注释方法及实用技巧。

基础注释方法:手动插入注释符
对于简单的单行或多行注释,最直接的方式是手动输入注释符号,不同编程语言的注释符号不同,常见如下:
语言类型 | 单行注释符 | 多行注释符(起始/结束) |
---|---|---|
C/C++ | // | |
Java/JavaScript | // | |
Python | 无(多行用三引号) | |
HTML/XML | 无(单行即多行) | |
CSS | // | // |
Shell/Bash | 无 |
操作步骤:
- 进入普通模式(按
Esc
),然后按i
或a
进入插入模式,手动输入注释符。 - 若需批量注释,可先选中要注释的行(普通模式下按
Shift+V
进入可视模式,上下移动选择行),然后按 进入命令行模式,输入normal i//
(针对 C/C++ 等语言),按回车即可为选中行添加 前缀。
示例:
对 3-5 行添加 注释:
- 普通模式下,按
3G
跳转到第 3 行,Shift+V
选择,按j
扩展到第 5 行。 - 按 ,输入
normal i//
,回车后第 3-5 行每行开头会添加 。
利用 Vim 自定义命令实现高效注释
通过在 .vimrc
配置文件中定义命令,可以创建针对特定语言的注释快捷方式,为 C/C++ 定义注释命令:

" 在 .vimrc 中添加以下内容 function! ToggleComment() if getline('.') =~ '^\s*//' " 如果当前行以 // 开头,则删除注释 s/^\s*\/\/\s*// else " 否则添加注释 s/^/\/\/ / endif endfunction nnoremap <Leader>c :call ToggleComment()<CR>
功能说明:
<Leader>c
是自定义快捷键(默认\c
),在普通模式下按下后会切换当前行的注释状态(有注释则删除,无则添加)。^\s*//
匹配行首的 (允许前面有空格),s/
是替换命令。
扩展为多行注释:
若需对多行操作,可修改函数为:
function! ToggleCommentRange() let l:line_start = line("'<") let l:line_end = line("'>") for l:lnum in range(l:line_start, l:line_end) let l:line = getline(l:lnum) if l:line =~ '^\s*//' call setline(l:lnum, substitute(l:line, '^\s*\/\/\s*', '', '')) else call setline(l:lnum, substitute(l:line, '^', '// ', '')) endif endfor endfunction vnoremap <Leader>c :call ToggleCommentRange()<CR>
使用方法:
可视模式下选中多行,按 <Leader>c
即可批量切换注释状态。
使用插件实现自动化注释
对于复杂项目,手动定义命令可能不够灵活,此时可借助插件实现智能注释,推荐插件:NERDCommenter 和 vim-commentary。

NERDCommenter
功能丰富,支持多种注释风格,安装后可通过快捷键操作:
快捷键 | 功能说明 |
---|---|
<Leader>cc |
注释当前行或选中行 |
<Leader>cu |
取消注释 |
<Leader>c<space> |
切换注释状态(注释/取消注释) |
<Leader>cs |
以 风格注释(C 系语言) |
<Leader>ci |
智能注释(根据语言选择符号) |
配置示例(.vimrc):
" 让 NERDCommenter 支持空行注释 let NERDCommentEmptyLines = 1 " 注释时保留缩进 let NERDDefaultAlign = 'left'
vim-commentary
轻量级插件,操作更简单,核心命令是 gcc
(注释当前行)和 gc
(结合 motion 使用)。
快捷键 | 功能说明 |
---|---|
gcc |
切换当前行注释状态 |
5gc |
注释当前行及后续 4 行(共 5 行) |
gcap |
注释当前段落(a=around paragraph) |
安装(通过 vim-plug):
Plug 'tpope/vim-commentary'
不同语言下的注释注意事项
-
Python:
- 单行注释用 ,多行注释建议用三引号 或 (但需注意,Python 实际不将三引号视为注释,而是字符串字面量)。
- 插件可自动识别 ,但需避免在代码中混用注释风格。
-
HTML/XML:
- 注释格式为
<!-- -->
,插件如 NERDCommenter 会自动适配。 - 需注意注释中不能嵌套 ,否则可能导致解析错误。
- 注释格式为
-
Shell/Bash:
- 仅支持 注释,多行需逐行添加。
- 在脚本中, 后的代码不会执行,但需避免在字符串中误用。
进阶技巧:结合宏实现批量注释
对于重复性注释任务,可录制宏:
- 普通模式下,按
qa
开始录制宏(存储到寄存器a
)。 - 对当前行执行注释操作(如
i// <Esc>
)。 - 移动到下一行(
j
),按q
停止录制。 - 输入
@a
执行宏, 重复执行最后一次宏。
示例:为 10 行代码添加注释:
- 录制宏:
qa→i// <Esc>→j→q
。 - 执行:
10@a
(对后续 10 行执行宏)。
相关问答 FAQs
Q1: 如何在 Vim 中为选中的代码块添加多行注释(如 C 语言的 )?
A1: 使用 NERDCommenter 插件,可视模式下选中代码块,按 <Leader>cs
即可自动用 包裹选中内容,若手动实现,可在 .vimrc
中定义函数:
function! CommentBlock() let l:start = line("'<") let l:end = line("'>") call append(l:end, ' */') call append(l:start-1, '/*') endfunction vnoremap <Leader>cb :call CommentBlock()<CR>
使用时选中代码块,按 <Leader>cb
即可在选中内容上下添加 和 。
Q2: 使用 vim-commentary 插件时,如何避免注释掉代码中的 URL 或字符串中的特殊字符?
A2: vim-commentary 默认会注释整行,若需精确控制,可在普通模式下使用 gc
结合 motion,gcG
注释到文件尾,或 gc}
注释到段落尾,对于 URL 或字符串,建议手动选择范围(可视模式)后按 gc
,或修改插件配置:
" 在 .vimrc 中添加,使注释仅作用于行首/行尾 let g:commentary_delimiters = { \ 'c': '//', \ 'cpp': '//', \ 'python': '#', \ }
这样插件会严格按照指定符号注释,避免误判字符串内容。