In vim, impedire che il cursore torni indietro quando esco dalla modalità di modifica?


9

In verità, se entro e esco dalla modalità di modifica senza fare nulla, il cursore finisce con un carattere a sinistra. E se entro e esco dalla modalità di aggiunta, il cursore si sposta in avanti e poi all'indietro.

Un modo per configurare vim in modo da lasciare il cursore solo in questi casi?

Idealmente, voglio solo entrare sempre in modalità accodamento, ma senza spostare il cursore quando entro o esco dalla modalità.

(Attualmente di solito utilizzo la modalità di inserimento perché non confonde la posizione del mio punto di inserimento al momento dell'entrata. Cioè, tranne quando devo aggiungere alla fine della riga, nel qual caso giuro su VIM di comportarmi in modo così arcaico , premere Esc e accedere alla modalità di aggiunta.)


1
Le risposte a questa domanda sono buone. Voglio solo sottolineare che se sono giusti nei loro presupposti che usi i per passare alla modalità di modifica, questo è ciò che sta causando lo spostamento all'indietro. Se usi 'a' (non A) funzionerà come previsto.
Johnny,

@johnny Non penso che lo farà. Di solito sono in modalità "normale", muovendo il file e roba del genere. Quando ho bisogno di fare una modifica, posiziono prima il cursore, quindi premo "a" e poi scopro di averlo posizionato in modo errato, perché si sposta verso destra. Dato che trascorro il 99% del mio tempo di editing in editor moderni, non ho alcuna possibilità di ricordare di posizionare un carattere a sinistra prima di premere "a". Ecco perché speravo in una macro o qualcosa del genere.
Roman,

È una questione di abitudini. È davvero fastidioso, ma solo i primi anni. Potrai finalmente imparare a stampa io asenza pensarci, e può essere ancora s, S, ci", ecc invece del limitato ie a.
Luc Hermitte,

1
Capisco la tua frustrazione ma. Prova invece a pensare a quello che stai facendo. Chiediti se c'è un modo migliore per farlo (piuttosto che usare Vim come un normale texteditor, cioè). Ho scoperto con Vim che esiste sempre un modo migliore, il modo Vim di fare le cose. Possiamo aiutare, ma dobbiamo sapere cosa stai facendo quando si verificano problemi. Ad esempio, vai in modalità di modifica quando vuoi eliminare qualcosa? No, c'è una "x" per eliminare i personaggi. Vuoi sostituire un personaggio, poi c'è 'r'. Pensa solo a ciò che vuoi ottenere.
Johnny,

@johnny Capisco di cosa stai parlando, ma richiede troppo riapprendimento per avere un senso per me. Trascorro il 99% del mio tempo di editing in Visual Studio e lo adoro. So solo che non lo imparerò di nuovo, quindi inutile perdere tempo.
Roman,

Risposte:


9

Questa domanda viene posta frequentemente tra i nuovi utenti vi / Vim e la risposta è che mentre è in modalità normale, il cursore è sempre "su" un carattere, ma in modalità inserimento il cursore è sempre "tra" due caratteri (ricorda, la fine -of-line è un personaggio). Non puoi davvero vederlo illustrato anche nella console Vim, ma nella GUI noterai che il cursore diventa una barra tra due caratteri quando si entra nella modalità di inserimento, anziché un blocco su un carattere quando si è in modalità normale.

Quindi quello che stai vedendo non è necessariamente il cursore che sposta indietro di un carattere quando lasci la modalità di inserimento, ma semplicemente si sposta su un personaggio. L'unica direzione sicura del movimento è a sinistra (o indietro). Pertanto, hai più di un modo per accedere alla modalità di inserimento:

  • "a" entra nella modalità di inserimento con il cursore "tra" il carattere su cui si trovava il cursore e il carattere successivo a destra.
  • "i" entra nella modalità di inserimento con il cursore "tra" il carattere su cui si trovava il cursore e il carattere precedente a sinistra.

Alcune persone hanno fatto sforzi per sopprimere questo "movimento" che non gli piace, ma inevitabilmente interferisce con i plugin e altri script Vim che vogliono eseguire in futuro.

Il mio consiglio è di abituarmi a usare i comandi "a" e "i" (e "A" e "I") nelle circostanze appropriate.

Anche i comandi "o" e "O" sono utili per l'apprendimento. Vedere:

:help a
:help i
:help A
:help I
:help o
:help O

Modifica: se sei ancora determinato a modificare questo comportamento, prova questo suggerimento: Impedisci all'evasione di spostare il cursore di un carattere a sinistra


1
Capisco quello che stai dicendo, ma "i" / "Esc" / "i" / "Esc" causa l'effettivo movimento netto complessivo del cursore. Penso davvero che VIM non sia semplicemente per me.
Roman,

2
@romkyns: penso che dovresti fare ainvece di usare i.
In pausa fino a nuovo avviso.

1
@Dennis ha concordato, "a" è un po 'meglio perché consente al punto di inserimento prima del primo carattere e dopo l'ultimo carattere di una riga - che "i" non consente arbitrariamente. Ma ci ho provato; quello che succede è che ho sempre smarrito il cursore prima di premere "a" - quindi devo spostare immediatamente il cursore di una posizione a sinistra. Ogni singola volta. Si è stancato, quindi sono passato a "i".
Roman,

@Heptite Potresti forse indicarmi un'implementazione così imperfetta di qualcosa che reprime il movimento? Le possibilità che io voglia usare plugin o altri script in futuro sono essenzialmente zero.
Roman,

1
@romkyns, (non) funziona in entrambi i modi. La rimappatura <esc>impedirà infatti alla maggior parte dei plug- <esc>in di funzionare correttamente, ma continuerà anche a infastidirti quando utilizzerai altre funzionalità standard che tornano alla modalità normale allo stesso modo <esc>. Imparare a usare la chiave giusta al volo è la soluzione che scala / funziona a lungo termine.
Luc Hermitte,

1

Penso che per carati intendi il tuo cursore e se stai usando "i" questo inserirà direttamente dove si trova il tuo cursore, "a" (che credo tu stia cercando) sposta il cursore di un carattere a destra. Inoltre, maiusc-i (I) andrà all'inizio della linea e maiusc-a (A) andrà fino alla fine della linea.

Se ho frainteso la tua domanda, mi scuso.


1

Poiché la rimappatura <ESC>è considerata "rischiosa", mi limito a combinare con uno degli approcci Evita la chiave di escape e nel mio ho .vimrc:

 inoremap ii <ESC>l

Nota: assicurarsi che non ci siano caratteri di spazio alla fine della riga.

Semplice, ma completamente certificato come "funziona bene per me" in quanto è esattamente ciò che altrimenti avrei dovuto digitare a mano.

Indipendentemente dal fatto che io usi ao icontinuo a far retrocedere il comportamento del cursore e questo mi infastidisce il più delle volte, allora la prossima cosa che voglio digitare è d$cancellare fino alla fine di una riga, ecc.


Soluzione incredibilmente semplice. Meglio mi sono imbattuto.
Tyler Collier,

1

Ecco la mia soluzione:

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

È divertente. La stessa domanda esiste su tutti e tre i siti: SO, SU, Unix + Linux.


Non lo trovo divertente :) Fortunatamente ho trovato un editor che non mi fa impazzire (diakonos), quindi questo non è più un problema. Tuttavia, votato per coloro che amano Vim.
Roman,
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.