2013-08-01 7 views
6

In questo momento sto giocando con i completamenti automatici in vim e mi sono risolto su supertab per gestire i miei completamenti. Anche se sta funzionando molto bene e (penso) esattamente come è stato progettato, mi piacerebbe sapere come cambiare qualcosa.Come annullare in modo efficiente un completamento automatico in vim

In primo luogo, sto correndo 7.3.429 su Ubuntu 12.04LTS con

set completeopt=menuone,preview,longest 

in modo da avere bash-tipo il completamento automatico con supertab, e di default completo.

Supponiamo Ho il seguente nel mio file:

aaabbbcccddd 
aaabbccddeef 
aaabbcddeeff 

Se digito aa e ha colpito Tab, quindi vim si rese conto che aaabb è la stringa più lunga comune tra le partite, quindi inserisce aaabb e visualizza un menu contenente le tre opzioni. Se volessi davvero una di quelle opzioni, allora tutto va bene. Ma forse volevo davvero il aaaaazzzzz, ma non mi ero reso conto di non averlo ancora digitato.

C'è un buon modo per dire a vim: "Oh, mi dispiace, non volevo finire il conto alla rovescia, per favore, fai finta di non averlo fatto".

In questo momento, le opzioni evidente per me sono:

  1. Hit Tab o Maiusc +Tab abbastanza volte per tornare alla mia iniziale. Ma se ci sono molte parole simili, specialmente fino a lunghezze diverse, questo è fastidioso.
  2. Colpire backspace tuttavia molte volte necessario, o qualche altra cancellazione ingenua. Ma questi sono sicuramente tratti chiave inutili.
  3. Hit Esc + u ottenere un annullamento, ma questo annulla la mia intera parola (o più se ho digitato rapidamente). Questo è assolutamente inaccettabile. E dopo, devo inserire nuovamente la modalità di inserimento e ridigitare. Schifoso.
  4. Hit Ctrl + U per annullare senza lasciare la modalità di inserimento. Ma questo ha anche la tendenza a rimuovere troppo.
  5. Hit Ctrl + W per eliminare l'ultima parola. Mentre riesco a farlo senza uscire dalla modalità di inserimento, devo ancora ridigitare. Questo è il migliore che ho trovato finora.

Se non avessi longest abilitato, quindi ho potuto utilizzare Ctrl +E, che si chiude il menu senza inserire qualsiasi altra cosa. Ma da quando è attivo più a lungo, interrompe il completamento automatico ma lascia la corrispondenza comune più lunga inserita.

Sicuramente ci deve essere un modo migliore per farlo.

risposta

2

Ci sono 2 modi nativi per farlo in vim. Se sai bene che l'elemento non è nel menu di completamento, puoi usare <c-y>. <c-y> accetta la corrispondenza corrente che, se non ti sei spostato, qualsiasi completamento ti rimanderà solo al testo che hai inserito. (Secondo modo) Tuttavia, se ti sei spostato nel menu di completamento, puoi spostarti finché non torni al testo originale.

Tuttavia, immagino che non sia troppo difficile accettare semplicemente la corrispondenza più lunga e modificare la parola. È inoltre possibile utilizzare <c-g>u per suddividere il blocco di annullamento lavorando nel mapping <tab>. Anche se questo potrebbe rompere la storia più di quanto tu voglia.

+0

Grazie. Non ho provato . Ma lo ammetto, sono confuso. Leggendo la documentazione, non interpreto affatto la "corrispondenza corrente" come il testo pre-longestamente inserito e pre-inserito. Soprattutto quando sembra indicare che dovrebbe essere quello che annulla il completamento. Sto leggendo la documentazione molto male? – mixedmath

+0

Capisco perché sei confuso riguardo a '' tuttavia devi leggere solo un po 'oltre: fine completamento, torna a ciò che era lì prima di selezionare una corrispondenza (cosa era stata digitata o la più lunga stringa comune). –

2

Questo è difficile, ma ho avuto lo stesso problema e ho implementato qualcosa. Il rovescio della medaglia è che ho dovuto sovraccaricare qualsiasi trigger di completamento (incorporato e personalizzato) per invocare innanzitutto una funzione personalizzata che imposta un segno all'inizio del completamento.Quindi mappo <Esc> in modalità di inserimento (con menu popup visibile) per eliminare il testo fino a quel punto.

function! s:SetUndo() 
    call setpos("'\"", getpos('.')) 
    return '' 
endfunction 
inoremap <expr> <SID>(CompleteStart) <SID>SetUndo() 
function! s:UndoLongest() 
     " After a completion, the line must be the same and the column must be 
     " larger than before. 
     if line("'\"") == line('.') && col("'\"") < col('.') 
      return "\<C-\>\<C-o>dg`\"" 
     endif 
    endif 
    return '' 
endfunction 
imap <expr> <Esc>  pumvisible() ? <SID>UndoLongest() : '<Esc>' 

inoremap <script> <C-x><C-n> <SID>(CompleteStart)<C-x><C-n> 
inoremap <script> <C-x><C-p> <SID>(CompleteStart)<C-x><C-p> 
...