2013-01-21 61 views
1

我目前使用closepairs爲我自動閉合的需要,它工作得很好。然而,有一個警告 - 撇號。不要誤解我的意思,我總是需要撇號。我不想只禁用它們。但是每當我輸入純文本,每當有任何收縮(我,不,不),...這些撇號得到。映射/宏「巧妙地」自動創建vim的撇號對(而忽略收縮)

現在我可以只輸入儘快,因爲他們可以將其刪除,但每次這樣做實在是有點不切實際。

有誰知道我怎麼可能修改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 

回答

3

我不知道closepairs,但AutoClose - Inserts matching bracket, paren, brace or quote插件處理這口井。您可以在Vim Tips Wiki上找到插件替代列表。

+0

我認爲出於某種原因autoclose導致了我的vim上的一個重大性能問題,我無法弄清楚,所以我無法使用它。即使我現在可以,我也有興趣學習如何寫我自己的。 –

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',所以它也可能是有意義的定義特定文件類型的行爲。