2010-06-09 7 views
33

Quando apro una nuova riga (tramite 'o') il mio cursore salta a una posizione rientrata correttamente nella riga successiva. D'altra parte, l'inserimento della modalità di inserimento mentre il mio cursore si trova su una riga vuota non sposta il cursore sulla posizione rientrata correttamente.Vim: rientro intelligente quando si accede alla modalità di inserimento su una riga vuota?

Come faccio a fare virgola indentare correttamente il mio cursore quando si accede alla modalità di inserimento (tramite i) su una riga vuota?

risposta

64

cc sostituirà il contenuto della linea corrente e inserire la modalità di inserimento al rientro corretto - così su una riga vuota farà esattamente quello che stai cercando.

credo che il comportamento di i che descrivi è corretto perché ci sono molti casi di utilizzo in cui si desidera da inserire in quella posizione specifica su una riga vuota, piuttosto che saltare ovunque vim indovina che vuoi inserire.

+1

Beh, la mia soluzione farà sì che "io" si comporti in questo modo solo quando la linea è vuota, quindi solo un caso d'uso. "i" si comporterà normalmente in tutte le altre situazioni. Detto questo, cc è incorporato e più appropriato. Accettando –

+0

ciò che amo di Vim è per quanto tempo lo usi, puoi ancora imparare cose nuove ogni giorno. Io uso dd, yy e c con altri modificatori estesamente ogni giorno, non mi è mai capitato di provare cc. +1 –

+0

Per me, questo non funziona * se c'è una riga vuota * tra il lin precedente e e la linea che vuoi indentare. (cioè hai premuto 'o' due volte, perché vuoi spaziatura tra la riga precedente e la sezione successiva del codice.) Mi piacerebbe comunque vedere un modo rapido per saltare in modalità di inserimento, al livello di rientro del * linea precedente del codice effettivo *. – ELLIOTTCABLE

13

Beh, in realtà non era così male come pensavo. Un modo per consentire questo è quello di aggiungere quanto segue al vostro ~/.vimrc

"smart indent when entering insert mode with i on empty lines 
function! IndentWithI() 
    if len(getline('.')) == 0 
     return "\"_ccO" 
    else 
     return "i" 
    endif 
endfunction 
nnoremap <expr> i IndentWithI() 

Esso controlla semplicemente per una riga vuota quando si preme 'i' dalla modalità di inserimento. Se si è effettivamente su una linea vuota, la cancellerà e ne aprirà una nuova, sfruttando efficacemente il comportamento di "linea aperta" funzionante.

Nota: "_ prima del cc fa in modo che il vostro registro non venga spazzato

+0

bello. mi ha sempre infastidito. – michaelmichael

+1

C'è un bug nel codice corrente. In 'return" \ "_ ccO" ', il' O' deve essere rimosso, altrimenti scriverà un letterale 'O' in modalità di inserimento (l'ho modificato, ma i ritardanti dei revisori non lo hanno respinto. 'ddO', ma in seguito qualcuno ha modificato il post per sostituire' dd' da 'cc' ma ha dimenticato di rimuovere' O'.) – pcworld

+0

Ho scoperto che 'ccO' non ha funzionato, ma' ddko' ha fatto (elimina linea corrente, vai alla riga precedente, aggiungi una nuova riga.) –

7

Su una riga vuota, per inserire correttamente la modalità di inserimento rientrata, è sufficiente utilizzare s.

Nota che s è sinonimo di cl, quindi se sei non in realtà su una riga vuota, si finisce nel eliminazione di un singolo carattere e non rientro. In tal caso, è meglio usare cc, come suggerito da sml circa 18 mesi fa. Ma ho spesso migliorato il mio punteggio in VimGolf usando questa scorciatoia, quindi ho pensato di parlarne. ;)

+2

Grazie per il suggerimento! Sto ancora imparando cose su Vim ogni giorno. –

+0

@ DaneO'Connor siamo tutti! :) – Enrico

Problemi correlati