【问题标题】:Insert vim variables into text for comment shortcut将 vim 变量插入文本以获取注释快捷方式
【发布时间】:2010-10-06 05:33:28
【问题描述】:

我有一个简单的目标:映射 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 大师的额外奖励积分,包括如果您处于可视模式下,如何进行块式 cmet!

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

【问题讨论】:

    标签: vim variables comments autocmd


    【解决方案1】:

    你可以在这里使用&lt;C-r&gt;

    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>
    

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

    【讨论】:

    • = 寄存器很棒 :)
    • 感谢您的解释。我读过关于 i_CTRL-R 但没有理解它。多亏了你,我的小脚本才能工作(但更改了 wll to w:exe "normal ".strlen(CommentChar)."l" 以使光标回到正确的位置)。还要感谢你,我放弃了我的脚本,现在正在使用 NERDCommenter!但至少我在这个过程中学到了更多关于 vim 的知识。
    【解决方案2】:

    我在某个时候从 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>
    

    【讨论】:

    • 感谢 StartComment 和 EndComment 的心态。这对其他任务也很有用。
    • 希望我能投票两次!顺便说一句,末尾的空格是由于 @ 字符之前和之后的执行行中的硬编码空格。只需将它们取出,如果您想在实际的 StartComment 和 EndComment 变量中添加补偿空间
    • 我发现一个有用的小改进:使用 b:StartComment 和 b:EndComment(用于初始化和使用)。这允许您在不同的缓冲区中拥有不同的值。如果您打开了多个使用不同注释字符的文件类型,这一点很重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2018-01-07
    相关资源
    最近更新 更多