将vim变量插入文本以实现评论快捷方式

3
我有一个简单的目标:将我从未使用过以杀死vim命令Ctrl-C映射到自动在行首插入正确字符,根据文件类型注释该行。
我想我可以使用autocommand来识别文件类型,并在打开文件时设置vim变量为正确的注释字符。所以我尝试了以下内容:
" Control C, which is NEVER used. Now comments out lines!
autocmd BufNewFile,BufRead *.c let CommentChar = "//"
autocmd BufNewFile,BufRead *.py let CommentChar = "#"
map <C-C> mwI:echo &CommentChar<Esc>`wll

那张地图标记了我的当前位置,进入插入模式并移到行首,输出该点的注释字符,进入命令模式,回到设置的标记,向右移动两个字符以弥补插入的注释字符(假设是C风格注释)。
斜体部分是我遇到问题的部分;它只是作为一个占位符来表示我想要做什么。你能帮我想办法实现吗?如果您使用strlen(CommentChar)来向右移动正确的空格数,则可以获得额外的奖励分数!如果您在可视模式下还能说明如何进行块样式注释,则可获得额外的高分!!
我对vim脚本仍然比较新手;我的.vimrc只有98行,所以如果您能解释您提供的任何答案,请帮忙解释一下!谢谢。
2个回答

5
您可以在此处使用<C-r>
noremap <C-c> mwI<C-r>=g:CommentChar<CR><Esc>`wll

请参考:h i_CTRL-R

同时,还可以查看NERDCommenter插件,使用该插件后,映射将如下所示:

" By default, NERDCommenter uses /* ... */ comments for c code.
" Make it use // instead
let NERD_c_alt_style=1
noremap <C-c> :call NERDComment(0, "norm")<CR>

您不需要自己定义注释字符。


= 寄存器真的很棒 :)` - Benoit
谢谢你解释这一切。我之前读过i_CTRL-R,但是没有理解它。多亏了你,我的小脚本现在可以工作了(但是我改成了`w:exe "normal ".strlen(CommentChar)."l"<CR>以便将光标放回正确的位置)。还要感谢你,我放弃了自己的脚本,现在使用NERDCommenter!但至少在这个过程中,我学到了更多关于vim的知识。 - physicsmichael

3

我从Vim技巧维基上找到了这个技巧,并且自己也使用它。唯一的缺点是它会在行末添加一个空格,可能是因为我忽略了某些小细节。

" Set comment characters for common languages
autocmd FileType python,sh,bash,zsh,ruby,perl,muttrc let StartComment="#" | let EndComment=""
autocmd FileType html let StartComment="<!--" | let EndComment="-->"
autocmd FileType php,cpp,javascript let StartComment="//" | let EndComment=""
autocmd FileType c,css let StartComment="/*" | let EndComment="*/"
autocmd FileType vim let StartComment="\"" | let EndComment=""
autocmd FileType ini let StartComment=";" | let EndComment=""

" Toggle comments on a visual block
function! CommentLines()
    try
        execute ":s@^".g:StartComment." @\@g"
        execute ":s@ ".g:EndComment."$@@g"
    catch
        execute ":s@^@".g:StartComment." @g"
        execute ":s@$@ ".g:EndComment."@g"
    endtry
endfunction

" Comment conveniently
vmap <Leader>c :call CommentLines()<CR>

2
感谢您采用了开始注释和结束注释的思维方式。这种方式在其他任务中也会非常有用。 - physicsmichael
真希望我可以两次点赞!顺便说一下,在执行行中@字符之前和之后硬编码的空格导致了这些空格。只需将其移除,如果您喜欢,还可以在实际的StartComment和EndComment变量中添加补偿空格。 - Magnus
我发现一个小改进非常有用:使用b:StartComment和b:EndComment(在初始化和使用时都要使用)。这使您可以在不同的缓冲区中具有不同的值。如果您打开了使用不同注释字符的多个文件类型,则这一点非常重要。 - Matthew

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