Perché `ESC` sposta il cursore indietro in vim?


62

In realtà, quando premo ESCper tornare alla modalità di comando, il cursore sposta un carattere a sinistra. Questo non è ciò che mi auguro, a volte colpisco immediatamente lper tornare in quel punto, forse per eliminare un personaggio.

C'è una ragione per questo comportamento? È utile per un modello di utilizzo che mi manca?


1
Non l'ho mai notato fino ad ora ... e uso Vim ogni giorno. Non ho idea del perché, ma sono interessato a sentire le risposte.
gabe.

5
quando torni alla modalità di inserimento, puoi premere 'a' per aggiungere invece di 'i' per inserire. Tornerai quindi alla posizione in cui ti trovavi prima di premere Esc.
penguin359,

Risposte:


40

Nella modalità di inserimento, il cursore si trova tra i caratteri o prima del primo o dopo l'ultimo carattere. In modalità normale, il cursore si trova sopra un carattere (le nuove righe non sono caratteri per questo scopo). Ciò è in qualche modo insolito: la maggior parte degli editor posiziona sempre il cursore tra i caratteri e la maggior parte dei comandi agisce sul carattere dopo (non, a rigore, sotto ) il cursore. Ciò è forse in parte dovuto al fatto che prima delle GUI, i terminali di testo mostravano sempre il cursore su un carattere (sottolineatura o blocco, forse lampeggiante). Questa astrazione non riesce in modalità inserimento perché richiede un'altra posizione (pali vs recinzioni).

Il passaggio da una modalità all'altra deve spostare il cursore di mezzo carattere, per così dire. Il icomando si sposta a sinistra, per posizionare il cursore prima del carattere sopra. Il acomando si sposta a destra. L'uscita dalla modalità di inserimento (premendo Esc) sposta il cursore a sinistra, se possibile (se si trova all'inizio della riga, viene invece spostato a destra).

Suppongo che il Esccomportamento abbia un senso. Spesso, stai digitando alla fine della riga e non ci si Escpuò che andare a sinistra. Quindi il comportamento generale è il comportamento più comune.

Pensa al personaggio sotto il cursore come l'ultimo personaggio interessante e al comando Inserisci come a. Puoi ripetere a Escsenza muovere il cursore, tranne per il fatto che verrai urtato di una posizione a destra se inizi all'inizio di una linea non vuota.


21

Visivamente, ha più senso in gvim:

Durante la modifica, il cursore si trova tra i caratteri:
inserisci qui la descrizione dell'immagine

In modalità normale, si trova sopra l'ultimo carattere:
inserisci qui la descrizione dell'immagine

Quindi in realtà non tornare indietro un personaggio, solo di essere tra i r e sad essere in r


1
Grande immagine. Ad essere sincero, sono nel campo che dice che il personaggio mdovrebbe rimanere evidenziato quando torna alla modalità normale ...
Steven Lu

Ops. i collegamenti alle immagini ora sono morti.
Steven Lu

1
collegamenti immagine ora morti.
Steven Lu,

1
Sì, l'hosting manuale delle tue immagini è sia più lavoro sia meno affidabile rispetto al semplice utilizzo dello strumento nell'editor di markdown su questo sito.
Steven Lu,

1
C'è di nuovo tutto a posto con loro? È "Cursore" ciò che hanno digitato e il tuo testo menziona "j"
poige

15

Questo comportamento è modificabile come indicato qui , ma fermati e pensa a cosa sta succedendo per un secondo. Quando ci si trova in modalità inserimento, in realtà non ci si trova sopra un personaggio ma TRA essi. Quando inserisci qualcosa, il cursore salta alla fine di ciò che hai inserito in modo che la prossima cosa inserita sarà dopo. Ora pensa a se hai appena digitato una lettera, quindi volevi farci qualcosa. Colpirebbe Escposizionerebbe il cursore di selezione direttamente sull'ultimo carattere inserito. Se non lo facesse, in realtà sarebbe piuttosto imbarazzante.

La situazione a cui probabilmente stai pensando è quando ti trovi in ​​modalità inserimento spostandoti come se fossi in modalità normale e poi cambi. In quel caso il cursore sembra tornare indietro di un carattere, ma se la pensi in questo modo mostra che eri in modalità inserimento e l'ultima cosa che hai fatto NON è stata inserire. Forse dovresti passare più tempo in modalità normale?


15
Questo non ha senso per me. Come si spiega il comportamento all'indietro dei tasti ripetuti ie dei ESCtasti?
Warren Young,

4
Entrare in modalità inserimento, non inserire nulla, quindi lasciarlo non è un test equo. Perché dovresti essere in modalità inserimento se non inserissi qualcosa? Se inserisci qualcosa, tornare alla modalità normale ti lascia con il carattere che hai inserito selezionato. Molto intuitivo.
Caleb,

4
Non si tratta di "giusto", si tratta di potere esplicativo. Se la tua teoria dell'operazione non spiega tutto il comportamento, o è incompleta o il comportamento di vi è incoerente. Preferisco credere che vi sia perfetto in ogni modo e quindi coerente. :)
Warren Young,

9
@Warren Il comportamento "camminare all'indietro" iseguito da ESCè una funzione di ied è completamente indipendente da ESC; in particolare, quando colpisci istai chiedendo a Vim di inserire un personaggio, che per definizione significa "inserire un personaggio prima di quello in cui mi trovo", al contrario del aquale è "aggiungi un personaggio dopo questo".
Kromey,

3
In generale, dopo ogni cambiamento, quando lascio quel cambiamento, ho finito con quel cambiamento, e la prossima cosa che vorrei fare probabilmente implica fare un cambiamento diverso. Quindi, per me, dopo aver lasciato la modalità di inserimento (non importa come l'ho inserito), generalmente preferirei che il cursore si trovi sul carattere successivo , quindi sono pronto per il mio prossimo cambiamento, piuttosto che essere pronto a cambiare ciò che ho appena inserito.
Kyle Strand,

6

Digita Alt+ Lper tornare alla modalità di comando.

Non richiede alcun cambio di modifica o modifica della configurazione di VIM. Funziona perché sulla maggior parte degli emulatori di terminali Alt+ KEYinvia un Escseguito da KEY(su xterm potrebbe essere necessario aggiungere una Xterm*metaSendsEscape: truelinea nel file ~ / .Xdefaults). Tale comportamento ti consente persino di "creare" altre combinazioni di modalità di inserimento che funzionano immediatamente, come Alt+ Sa Backspace.

A proposito, avere il cursore sopra il personaggio che hai appena scritto può essere molto scomodo. Ad esempio, Escdwnon eliminerà la parola seguendo il testo che hai appena inserito.


L'inconveniente a cui ti riferisci può essere evitato digitando sempre uno spazio in modalità inserimento prima della fuga. Quindi il cursore che lascia la modalità di inserimento viene posizionato sopra lo spazio e puoi digitare Esc d eper eliminare la parola in primo piano. Sono tornato al comportamento predefinito perché sentivo che cambiava altri comportamenti già codificati nella mia testa.
mljrg,

4

Ecco la mia soluzione

È una versione più concisa della soluzione offerta sulla pagina wiki di questo .

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

+1 anche qui, per aver citato la pagina wiki, anche se l'utente non stava effettivamente chiedendo un modo per cambiare questo comportamento.
Kyle Strand,

Noterai che se scavi abbastanza in Vim che molti plugin si basano sul comportamento predefinito (leggermente non intuitivo), quindi se vedi alcune cose che mangiano o mangiano casualmente un singolo personaggio, ciò potrebbe essere causato da questo. Non uso questo autocommand da solo; funziona bene, però.
Steven Lu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.