Attraversare il testo in modalità Inserimento

Mentre ci si trova in modalità di inserimento in Vim, c’è un modo per attraversare il testo spostando alcuni caratteri avanti e indietro se non usando i tasti freccia?

Se premo h , j , k el durante la modalità di inserimento, i caratteri reali vengono stampati sullo schermo invece di spostarsi all’interno del testo.

Il modo in cui lo sto facendo al momento è dover ricorrere a Ctrl + [ ( Esc ) e attraversare il testo allora; ma ovviamente non è produttivo.

Sembri abusare di Vim, ma è probabile che non ti sia molto familiare.

Il modo giusto è quello di premere Esc , andare dove vuoi fare una piccola correzione, correggerlo, tornare indietro e continuare a modificare. È efficace perché Vim ha molti più movimenti del solito carattere avanti / indietro / su / giù. Dopo averne imparato di più, questo sarà più produttivo.

Ecco un paio di casi d’uso:

  • hai digitato accidentalmente “accidentalmente”. Nessun problema, la sequenza Esc F f r d A correggerà l’errore e ti riporterà dove lo hai modificato. Il movimento F f ti riporterà al primo carattere “f” incontrato. Confronta con Ctrl + <- -> -> -> -> del d End , che è praticamente lo stesso in un editor casuale, ma prende più battute di tastiera, ti fa spostare la mano dallo spazio alfanumerico della tastiera.
  • hai digitato accidentalmente "hai digitato accidentalmente", ma vuoi correggerlo a "hai intenzionalmente digitato". Quindi Esc 2 b c w cancella la parola che vuoi correggere e ti porta nella modalità di inserimento, così puoi immediatamente ridigitarla. Per tornare alla modifica, premi semplicemente A invece di Fine , per raggiungere il quale devi muovere la mano
  • hai accidentalmente digitato "mouse" invece di "mouse". Nessun problema: il buon vecchio Ctrl + W cancellerà la parola precedente senza uscire dalla modalità di inserimento. E capita di essere molto più veloce cancellare parole piccole che correggere errori in esso. Sono così abituato che ho chiuso la pagina del browser mentre stavo scrivendo questo messaggio ...
  • il conteggio delle ripetizioni è ampiamente sottoutilizzato. Prima di fare un movimento, puoi digitare un numero; e il movimento verrà ripetuto questo numero di volte. Ad esempio, 1 5 ore ti porterà indietro di 15 caratteri e 4 ti farà scorrere verso il basso di 4 righe. Inizia a usarli e ti abituerai presto e scopri che premendo 10 volte <- il tasto è meno veloce dell'approccio iterativo al cursore in movimento, quando digiti 1 2 ore , noti che hai fatto un errore e correggi subito te stesso con l .

Tuttavia, se si desidera eseguire gli attraversamenti di testo di piccole dimensioni senza uscire dalla modalità di inserimento, seguire i consigli di rson e utilizzare Ctrl + O. Ad esempio, Ctrl + O F + f ti sposterà al precedente carattere f e ti lascerà in modalità di inserimento.

In modalità di inserimento , usa Ctrl O per passare alla modalità normale per un solo comando:

 CTRL-O h move cursor left CTRL-O l move cursor right CTRL-O j move cursor down CTRL-O k move cursor up 

che è probabilmente il modo più semplice per fare ciò che vuoi ed è facile da ricordare.

Altri tasti di controllo molto utili in modalità di inserimento:

 CTRL-W delete word to the left of cursor CTRL-O D delete everything to the right of cursor CTRL-U delete everything to the left of cursor CTRL-H backspace/delete CTRL-J insert newline (easier than reaching for the return key) CTRL-T indent current line CTRL-D un-indent current line 

questi elimineranno molti switch inutili di nuovo in modalità normale.

Modalità di inserimento

Movimento

hjkl

Nonostante quanto affermato da Pavel Shved, è probabilmente più opportuno abituarsi alla modalità di inserimento di Esc- ap, ecco un esempio di mappature per una navigazione veloce all’interno della modalità di inserimento:

 " provide hjkl movements in Insert mode via the  modifier key inoremap  h inoremap  j inoremap  k inoremap  l 

Ciò renderà Alt + h in modalità Insert un carattere a sinistra, Alt + j giù e così via, analogamente a h j k l in modalità Normale.

Devi copiare quel codice nel tuo file vimrc per caricarlo ogni volta che avvii vim (puoi aprirlo digitando :new $myvimrc inizia in modalità Normale).

Qualsiasi movimento in modalità normale

Poiché il tasto di modifica Alt non è mappato (per qualcosa di importante) per impostazione predefinita, è ansible allo stesso modo tirare le altre (o tutte) funzionalità dalla modalità Normale alla modalità Inserisci. Per esempio:
Spostarsi all’inizio della parola corrente con Alt + b :

 inoremap  b inoremap  w 

(Altri usi di Alt in modalità Insert)

Vale la pena ricordare che potrebbero esserci migliori utilizzi per il tasto Alt rispetto alla replica del comportamento in modalità normale: ad es. Ecco i mapping per copiare da una linea adiacente la porzione dalla colonna corrente fino alla fine della riga:

 " Insert the rest of the line below the cursor. " Mnemonic: Elevate characters from below line inoremap  \ \jl \y$ \hk \p \a " Insert the rest of the line above the cursor. " Mnemonic: Y depicts a funnel, through which the above line's characters pour onto the current line. inoremap  \ \kl \y$ \hj \p \a 

(Ho usato la continuazione e la rientranza per aumentare la chiarezza – i comandi sono interpretati come se fossero scritti su una singola riga.)

Tasti di scelta rapida integrati per la modifica

 CTRL-H delete the character in front of the cursor (same as ) CTRL-W delete the word in front of the cursor CTRL-U delete all characters in front of the cursor (influenced by the 'backspace' option) 

(Non ci sono tasti di scelta rapida incorporati rilevanti per il movimento in modalità Insert.)

Riferimento: :help insert-index


Modalità della riga di comando

Questo insieme di mappature rende disponibili i movimenti Alt + hjkl superiori nella riga di comando:

 " provide hjkl movements in Command-line mode via the  modifier key cnoremap   cnoremap   cnoremap   cnoremap   

In alternativa, questi mapping aggiungono i movimenti sia alla modalità Inserisci che alla modalità riga di comando in un colpo solo:

 " provide hjkl movements in Insert mode and Command-line mode via the  modifier key noremap!   noremap!   noremap!   noremap!   

I comandi di mapping per richiamare i comandi della modalità Normale in modalità riga di comando hanno un aspetto leggermente diverso dai comandi di mapping della modalità di inserimento (poiché la modalità della riga di comando è priva di Ctrl + O della modalità di inserimento ):

 " Normal mode command(s) go… --v <-- here cnoremap   &cedit. 'h' .'' cnoremap   &cedit. 'j' .'' cnoremap   &cedit. 'k' .'' cnoremap   &cedit. 'l' .'' cnoremap   &cedit. 'b' .'' cnoremap   &cedit. 'w' .'' 

Tasti di scelta rapida integrati per il movimento e la modifica

 CTRL-B cursor to beginning of command-line CTRL-E cursor to end of command-line CTRL-F opens the command-line window (unless a different key is specified in 'cedit') CTRL-H delete the character in front of the cursor (same as ) CTRL-W delete the word in front of the cursor CTRL-U delete all characters in front of the cursor CTRL-P recall previous command-line from history (that matches pattern in front of the cursor) CTRL-N recall next command-line from history (that matches pattern in front of the cursor)  recall previous command-line from history (that matches pattern in front of the cursor)  recall next command-line from history (that matches pattern in front of the cursor)  recall previous command-line from history  recall next command-line from history  recall previous command-line from history  recall next command-line from history  cursor one word left  cursor one word left  cursor one word right  cursor one word right  cursor at mouse click 

Riferimento: :help ex-edit-index

Se sei un purista Vim, salta la lettura di questa risposta. OTOH, se sei nuovo di Vim e stai cercando alcuni suggerimenti utili che non troverai nelle centinaia di tutorial e blog di Vim, continua a leggere … 🙂

Alcuni modi non ortodossi (vim)

È il 2014 e, come qualcuno che è tornato di recente a vim posso offrire alcuni punti di vista e suggerimenti potenzialmente controcorrente.

Usa Maiusc + sinistra o Maiusc + destra per attraversare le parole

Mentre la ripetizione è un concetto potente in vim, personalmente (trovo) strano che usarlo mi costringa a contare (linee, caratteri, parole, ecc.) Oa fare congetture. Il mio cervello di solito funziona come “Voglio il cursore ” e non come “Voglio il cursore _5_words_to_the_left_”. Essere rapidamente in grado di muovere il cursore e osservare visivamente dove il punto di inserimento in questo modo mi consente di non pensare a cosa sto modificando invece di dover contare quanti luppoli devo fare per arrivare a dove ho bisogno di modificare.

Attiva la modalità mouse e usa la rotellina del mouse e fai clic

… per esplorare grandi corpi di testo.

La maggior parte (tutti) i computer moderni hanno un touchpad che è strettamente integrato con la tastiera (ad esempio MacBook). I progettisti industriali hanno speso molti anni a ottimizzare questi progetti in modo che il vecchio problema di dover spostare la mano lontano dalla tastiera non sia più un problema reale. Va bene, è che se sei abituato a un mouse e non ti piace cambiare, ma per chi è nuovo a Vim (come quelli che potrebbero trovare questo post tramite una ricerca), questo non dovrebbe essere un grosso problema.

Come bonus, clicca + trascina ti metti in modalità visuale

Con il mouse abilitato, facendo clic e trascinando si ha l’effetto di passare alla modalità visiva e contrassegnare una regione per lo yanking.

E usa la rotella di scorrimento

Usando il mouse (ruota) per scorrere, e facendo clic per posizionare il cursore (duh) funziona. Vedi http://usevim.com/2012/05/16/mouse/ per ulteriori informazioni.

E così…

Questi sono quelli che chiamerei più moderni (usando mouse, rotella di scorrimento, ecc.) Modi di navigare in vim, ugualmente efficaci a seconda delle preferenze di input.

HTH

Molte persone nella comunità di Vim sostengono che non si deve navigare nella modalità di inserimento, che non è il modo Vim. Penso che questo sia un sentimento errato appreso quando si passa da editor standard a Vim.

Vim è il più potente quando usi i suoi strumenti per creare azioni o riscontri atomici ripetibili.

È ansible navigare mentre ci si trova in modalità di inserimento se si sta correggendo un errore commesso nella stessa sessione di inserimento. Non dovresti navigare al di fuori dell’intervallo di testo che hai modificato.

Se si commette un errore durante l’immissione di testo e si esce dalla modalità di inserimento per correggerlo, non sarà ansible ripetere l’azione desiderata . ripeterà la correzione.

Vim supporta molti tasti di navigazione in modalità Insert. Ovviamente ci sono i tasti freccia, Home e Fine, ma ci sono anche molte altre scorciatoie. Vedi :h ins-special-keys .

In GVim, puoi usare il mouse. Ma sinceramente, cosa c’è di sbagliato nell’usare i tasti freccia? C’è una ragione per cui sono su una tastiera.

Per migliorare la navigazione in modalità inserimento, perché non mappare alcune chiavi?

 imap   imap   imap   imap   "  is used to repeat last entered text. Override it, if its not needed 

Se riesci a risolvere il problema, facendo in modo che la chiave Meta funzioni nel tuo terminale, puoi simulare la modalità emacs ancora meglio. La navigazione in modalità normale è molto meglio, ma per i movimenti più brevi aiuta a rimanere in modalità di inserimento.

Per salti più lunghi, preferisco la seguente traduzione predefinita:

  maps to  

Passa alla modalità normale e torna indietro

Credo che Home and End (e PageUp / PageDn ) funzionino normalmente anche in modalità di inserimento, ma a parte questo, non credo ci siano altre chiavi standard definite per il testo trasversale.

È ansible creare mapping che funzionano in modalità di inserimento. Il modo per farlo è tramite inoremap. Notare “i” all’inizio del comando (noremap è utile per evitare collisioni con la mappa chiave). Il corollario è “n” per la modalità “normale”. Puoi ipotizzare ciò che vim pensa sia ‘normale’;)

TUTTAVIA, vuoi davvero navigare nel testo usando la modalità ‘normale’. Vim è super in questo tipo di cose e tutto quel potere è disponibile dalla modalità normale. Vim fornisce già dei modi semplici per passare dalla modalità normale alla modalità di inserimento (ad esempio, i, I, a, A, o, O). Il trucco è quello di rendere più facile entrare in modalità normale. Il modo per farlo è rimappare la fuga verso una chiave più comoda. Ma ne hai bisogno uno che non sia in conflitto con la tua normale battitura. Io uso:

 inoremap jj  

Dal momento che jj (cioè i 2 j sono digitati uno dopo l’altro rapidamente) non sembra comparire nel mio vocabolario. Gli altri rimapperanno dove è comodo.

L’altro cambiamento essenziale che faccio è quello di passare i tasti CAPSLOCK e CONTROL sulla mia tastiera (usando la configurazione della tastiera del computer host) poiché non uso quasi mai CAPSLOCK e ha quel pulsante grande, bello proprio dove lo voglio. (Questo è comune per gli utenti di Emacs.Il lato negativo è quando ti trovi su una tastiera ‘non fissata’! Aaarggh!)

Dopo aver rimappato CAPSLOCK, puoi utilizzare comodamente i seguenti remapping in modalità di inserimento:

Tenendo presente che alcuni tasti sono già mappati in modalità di inserimento (back-kill-word è Cw (Control-w) per impostazione predefinita, potresti già avere i binding desiderati. Detto questo, preferisco Ch così nel mio .vimrc che ho :

 inoremap   

MA, probabilmente vorrai lo stesso spasmo della memoria muscolare in modalità normale, quindi mapperò anche Ch come:

 nnoremap  db 

(d) elete (b) ackwards realizza la stessa cosa con lo stesso accordo chiave. Questo tipo di modifica rapida è uno che trovo utile nella pratica degli errori di battitura. Ma attenersi alla modalità normale per spostarsi nel testo e qualcosa di più che uccidere la parola precedente. Una volta che hai preso l’abitudine di cambiare modalità (usando una rimapping ovviamente), sarà molto più efficiente della rimapping della modalità di inserimento.

Scusate ma vim non funziona in questo modo.

Dovresti passare alla modalità “normale”, navigare e poi tornare indietro per inserirlo di nuovo.

È ansible utilizzare imap per mappare qualsiasi tasto in modalità di inserimento su uno dei tasti cursore. Così:

 imap h  

Ora h funziona come in modalità normale, spostando il cursore. (Mappare h in questo modo è ovviamente una ctriggers scelta)

Detto questo, non penso che il modo standard di muoversi nel testo usando VIM sia “non produttivo”. Ci sono molti modi molto potenti per attraversare il testo in modalità normale (come usare w e b, o / e?, O f e F, ecc.)