2012-04-28 13 views
9

ho set autoindent
vado a una linea, premere A e <CR> che mi viene alla riga successiva e inserisce un rientro. Tuttavia se premo Esc il cursore salta all'inizio della linea e il rientro è sparito.
Devo andare in giro e premere le schede per tornare al punto giusto.Come si conserva trattino dopo aver premuto Esc in Vim

So che l'aiuto dice:

If you do not type anything on the new line except <BS> or CTRL-D and then type 
<Esc>, CTRL-O or <CR>, the indent is deleted again. 

C'è un modo per disattivare questo, o almeno una soluzione alternativa?

+1

Argh. +1 a questo, è davvero fastidioso. Andiamo, VIM. Non siamo più nel 1985, abbiamo gigabyte di RAM e terabyte di storage, possiamo risparmiare qualche byte di spazi extra su righe vuote nei nostri file di testo per risparmiare qualche problema al programmatore. – QuadrupleA

risposta

3

OK, l'ho capito.

in base alla risposta del Edan Maor, S o cc dovrebbe entrare in modalità inserimento con il corretto livello di rientro.
... tranne quando non lo fa :)

Questo funziona in due circostanze.

  • quando cindent è impostato, si inserirà trattino sulla base di regole di formattazione C
    Questo può risultare fastidioso quando la modifica dei file non C-like.
  • quando è impostato indentexpr.

Ho trovato che la soluzione migliore è quella di avere questo è il mio .vimrc

set autoindent 
set indentexpr=GetIndent() 

function GetIndent() 
    let lnum = prevnonblank(v:lnum - 1) 
    let ind = indent(lnum) 
    return ind 
endfunction 

Ora, quando si preme S o cc, si inserirà lo stesso trattino come sulla non precedente riga vuota.

+0

Ho downvoted questa risposta per errore 10 ore fa (la mia intenzione era di revocarla), e ora non sono in grado di cambiare il mio voto finché la risposta non viene modificata. :( –

+0

@EmanueleNatale np, l'ho modificato ora – mihai

+0

Grazie, vota la modifica. –

1

Un modo semplice è quello di premere '.' (o qualsiasi carattere), scappa, quindi premere x per rimuovere il carattere. Il trattino dovrebbe essere conservato.

+0

Non mi piace, ma se non c'è modo migliore ... Immagino di essere bloccato con questo – mihai

1

digitare il testo e premere == in modalità normale a quella linea

6

Ho avuto questo problema esatto fino a due giorni fa.

Non v'è alcun modo per disattivare questo, ma per fortuna, non c'è bisogno di, perché invece:

Enter modalità di inserimento con S o cc. Inserendo nuovamente la modalità di inserimento con S entrerà in modalità di inserimento con il giusto livello di indentazione, rendendo il fatto che Vim ha cancellato i rientri senza importanza.

Nota: Ho scoperto che questo trucco ha funzionato per me in molti posti. Ma per qualche ragione, lo ha fatto non funziona con i file Python. Immagino che sia qualcosa a che fare con il tipo di file Python che incasina le sue proprie funzioni di indentazione o qualcosa del genere.

Modifica:

Un altro trucco, è possibile definire cpoptions in un modo che, se siete su una linea con un rientro e sposta il cursore, sarà preservare il trattino. Questo non risolverà il tuo problema con lo subito, ma è un problema correlato che potrebbe anche darti fastidio.

+0

S o cc ... non funziona (se ho già premuto Esc). Sono ancora bloccato all'inizio della linea. C'è un'impostazione specifica per questo? – mihai

+0

No, dovrebbe funzionare immediatamente. È necessario avere il rientro automatico, che presumo tu faccia dalla domanda. –

1

Può valere la pena notare che con i plugin adeguati S e cc sembra funzionare di nuovo correttamente. È molto probabile che la modalità Python risolva questo problema.

https://github.com/klen/python-mode

0

ho avuto voglia di ottenere lo stesso effetto, ma perché voglio the plugin showing indent per funzionare correttamente. Questa è la mia soluzione: ho trovato che <enter> in modalità normale è quasi inutile. Sposta il cursore solo di una riga verso il basso, che potrebbe essere raggiunto da j.

così ho aggiunto questo nel mio .vimrc:

nmap <cr> o.<c-h><esc> 

Ogni volta che ho bisogno di una riga vuota per il suo rientro, userei <enter> invece.

2

Considerare che uso "o" per iniziare una nuova riga. Aggiungo sotto config in _vimrc (notare che ho ': set autoindent')

" ugly hack to start newline and keep indent 
nnoremap o ox<BS> 
nnoremap O Ox<BS> 
Problemi correlati