映射/宏到'巧妙'自动创建vim中的撇号对(并忽略收缩)

时间:2013-01-21 08:44:41

标签: vim

我目前正在使用closepairs来满足我的自动关闭需求,而且效果非常好。但是,有一个警告 - 撇号。别误会我的意思,我需要一直关闭撇号。我不想只是禁用它们。但每当我输入纯文本时,只要有任何收缩(我,不,不能)......这些撇号都会被制作出来。

现在我可以输入以尽快删除它们,但每次都这样做有点不切实际。

有没有人知道我怎么可能修改closepairs脚本只能自动关闭单引号/撇号,如果它们是单词的开头?也就是说,它们前面有一个空格字符?

以下是当前代码:

inoremap <expr> " <SID>pairquotes('"')
inoremap <expr> ' <SID>pairquotes("'")
function! s:pairquotes(pair)
    let l:col = col('.')
        let l:line = getline('.')
        let l:chr = l:line[l:col-1]
        if a:pair == l:chr
            return "\<right>"
        else
            return a:pair.a:pair."\<left>"
endf

2 个答案:

答案 0 :(得分:3)

我不知道密码,但AutoClose - Inserts matching bracket, paren, brace or quote插件处理得很好。您可以在Vim Tips Wiki上找到插件备选列表。

答案 1 :(得分:0)

你确定只想在空白之后自动完成吗?在这种情况下,function('string')之类的内容在括号后不会自动完成。

无论如何,您可以针对某些正则表达式检查前一个字符。例如,要避免在字母后自动完成:

function! s:pairquotes(pair)
    let l:line = getline('.')
    let l:col = col('.')
    let l:chr = l:line[l:col - 1]
    let l:prev = l:line[l:col - 2]

    if l:chr == a:pair
        return "\<right>"
    elseif l:prev !~ "[A-Za-z]"
        return a:pair . a:pair . "\<left>"
    else
        return a:pair
    endif
endfunction

请注意,即使使用这个保守的示例也存在异常,例如在Python中键入r'regex',因此定义特定于文件类型的行为也可能有意义。