如何在Vim上使用autoclose插件时自动关闭匹配的引号?

时间:2011-12-22 08:34:35

标签: vim autocomplete quotes

我使用这个autoclose.vim插件,因为我想要自动关闭功能。

在编辑HTML时使用Omnicompletion,这就是我得到的。

<p id="

请注意初始引号...

输入一些数据后,我继续关闭引号,这是输出(注意第三个不正确的双引号):

<p id="sometext""

我知道我可以使用ToggleAutoCloseMappings切换插件。 我还想删除现有的引号并使用autoclose插件打开一些引号然后它可能会有所帮助。

更优雅的解决方案是在不切换插件的情况下关闭现有的引号(它不必自动关闭)。

如何告诉它自动关闭匹配的报价?

2 个答案:

答案 0 :(得分:1)

我建议使用以下两种解决方案之一:

  1. 最简单的一个:在完成后插入引号时使用<C-v>"
  2. 使用<expr>映射,尝试检查情况并仅在需要时运行该插件。

    " Put to ~/.vim/after/plugin/autoclose.vim
    let g:old_quote_rhs=substitute(maparg('"', 'i'), '<[^>]*>', '\=eval(''"\''.submatch(0).''"'')', 'g')
    inoremap <expr> " (HasUnclosedQuote() ? '"' : g:old_quote_rhs)
    

    最棘手的部分是正确编写函数HasUnclosedQuote。这是一个简单的实现,仅适用于同一行上未闭合的引号:

    function HasUnclosedQuote()
        return getline('.')[:(col('.')-1)]!~#'\v^%([^"]+|\"%(\\.|[^"\\]+)*\")*$'
    endfunction
    

答案 1 :(得分:0)

该插件仅识别已明确输入的引号。当您从自动完成(或注册粘贴)引入引号时,这不会被识别,因此会产生重复的引用。

我想除了在插件处于活动状态时避免插入这些不完整的引用片段,你几乎无能为力。