3

我有一个简单的目标:映射 Ctrl-C,一个我认为我从来没有用来杀死 vim 的命令,自动在行首插入正确的字符以根据文件的文件类型。

我想我可以使用自动命令来识别文件类型,并在文件打开时将 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-master 的额外奖励积分,包括如果您处于可视模式,如何进行块式注释!

我对 vim 脚本还是很陌生;我的 .vimrc 仅有 98 行长,所以如果你能帮助我解释你提供的任何答案!谢谢。

4

2 回答 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>

而且您不必自己定义注释字符。

于 2010-10-06T06:16:08.517 回答
3

我在某个时候将它从 vim 提示 wiki 中删除并自己使用。唯一的缺点是它出于某种原因在行尾添加了一个空格,这可能是我忽略的一些小东西。

" 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>
于 2010-10-06T13:56:04.857 回答