2011-12-22 62 views
1

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

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

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

<p id="

注意初始报价...

输入一些数据后,我proceded关闭引号,这是输出

<p id="sometext""

我意识到我可以用ToggleAutoCloseMappings切换插件。 我还想过删除现有的引号并用autoclose插件打开一些引号。

一个更优雅的解决方案是关闭现有的引号而不切换插件(它不必自动关闭)。

回答

-1

该插件只识别已明确输入的引号。当您从自动完成(或注册粘贴)引入报价时,不会识别该报价,因此会导致重复报价。

我想你可以做的事情很少,除非在插件处于活动状态时避免插入这些不完整的引用片段。

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