Attraversamento del testo in modalità Inserisci


322

In modalità Inserisci in Vim, c'è un modo per attraversare il testo spostando alcuni caratteri in avanti e indietro oltre all'utilizzo dei tasti freccia?

Se premo h, j, ke lin modalità di inserimento, i caratteri effettivi sono stampati su schermo invece di muoversi attraverso il testo.

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


Come suggerimento a parte: è anche utile se si mappa la fuga a una combinazione di tasti più vicina (cioè imap jk <Esc>) in modo da non dover interrompere lo slancio e raggiungere la tastiera per premere il tasto.
Tsujin,

3
Mi piace ( <ESC>) mappato kjinvece di jk; la colpa è del mio amico Dijkstra !
Dr Beco,

7
Ho jke kj, quindi lo premo semplicemente come un grosso pulsante con due dita e non importa l'ordine in cui sono tornato normale.
Edu Ruiz,

Risposte:


649

Sembri abusare di vim, ma probabilmente è dovuto al fatto che non ne hai molta familiarità.

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

Ecco un paio di casi d'uso:

  • Hai accidentalmente digitato "per caso". Nessun problema, la sequenza EscFfrdAcorreggerà l'errore e ti riporterà dove stavi modificando. Il Ffmovimento sposta il cursore indietro sul primo carattere "f" rilevato. Confrontalo con Ctrl+ DeldEnd, che fa praticamente lo stesso in un editor casuale, ma richiede più battiture e ti fa spostare la mano fuori dall'area alfanumerica della tastiera.
  • Hai digitato per errore "hai digitato per errore", ma vuoi correggerlo con "hai digitato intenzionalmente". Quindi Esc2bcwcancellerà la parola che vuoi correggere e ti porterà in modalità inserimento, in modo da poterlo digitare nuovamente. Per tornare alla modifica, basta premere Ainvece di End, in modo da non dover muovere la mano per raggiungere il Endtasto.
  • Hai digitato accidentalmente "mouse" anziché "mouse". Nessun problema: il buon vecchio Ctrl+ wcancellerà la parola precedente senza uscire dalla modalità di inserimento. E sembra essere molto più veloce cancellare una piccola parola che correggere errori al suo interno. Ci sono così abituato che avevo chiuso la pagina del browser mentre scrivevo 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, 15hriporta il cursore di 15 caratteri indietro e 4j sposta il cursore di 4 righe verso il basso. Inizia a usarli e ti abituerai presto. Se hai commesso un errore di dieci caratteri indietro dal cursore, scoprirai che premere il tasto 10 volte è molto più lento dell'approccio iterativo allo spostamento del cursore. Quindi puoi invece digitare rapidamente i tasti 12h(per indovinare quanti caratteri indietro devi spostare il cursore) e andare immediatamente avanti due volte llper correggere rapidamente l'errore.

Ma, se vuoi ancora fare piccoli passaggi di testo senza uscire dalla modalità di inserimento, segui i consigli di rson e usa + . Prendendo il primo esempio che ho menzionato sopra, + ti sposterà su un precedente carattere "f" e ti lascerà in modalità inserimento.CtrlOCtrlOFf


33
+1 Ottima risposta e grazie per tutti gli esempi che hai dato!
Andreas Grech,

79
Vale anche la pena notare che è possibile utilizzare Ctrl+oper emettere un singolo comando in modalità normale. Questo a volte può portarti dove vuoi essere, specialmente se combinato con i comandi di movimento t / T e f / F.
Randy Morris,

6
"Sembri abusare di vim, ma è probabile che tu non ne abbia molta familiarità." è un po 'condiscendente. No?
David Rivers,

17
Questa è una grande idea di come usare correttamente Vim. Tuttavia, trovo che premere "Esc" sia una seccatura, quindi penso che valga la pena sottolineare che è possibile mappare un tasto più accessibile a quella funzione, ad esempio "imap jj <esc>".
Simmetrico

25
Per risolvere un errore di battitura si dovrebbe non lasciare modalità di inserimento. Vim è potente perché crei azioni atomiche e ripetibili. Inserire un refuso e correggerlo crea due azioni separate. Il modo giusto per correggere un errore di battitura per farlo senza uscire dalla modalità di inserimento. Se ciò significa usare i tasti freccia per navigare lì, va bene. Vim ha alcune combinazioni di tasti per navigare in modalità inserimento. Controllare :h ins-special-keys. ctrl-h: backspace,: ctrl-welimina parola,: ctrl-uelimina all'inizio della riga alt-b,: torna indietro di una parola.
everett1992

152

Nel frattempo modalità inserimento , utilizzare CtrlOper passare alla modalità normale con 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à 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 interruttori inutili tornando alla modalità normale.


13
Grazie. Questa dovrebbe essere considerata la risposta corretta. In realtà è utile.
Atcold,

1
Sul mio mac, è in minuscolo o non in maiuscolo O. È diverso da "vim standard"? Vedo molti posti in cui sembrano dire maiuscole (a meno che non sia solo una scrittura sciatta). Puoi confermare?
Floris,

Ok molto utile. Tuttavia, una combinazione interessante che ho difficoltà a trovare e questa è la linea di rimozione. Cosa molto sottovalutata da fare in caso di inserimento accidentale di una linea.
patrik

5
@Floris Vim non distingue tra lettere maiuscole e minuscole per le combinazioni di ctrl. Ecco perché non è possibile mappare ctrl + maiusc + qualcosa.
Mahmoud Al-Qudsi,

92

Modalità di inserimento

Movimento

hjkl

Indipendentemente da ciò che Pavel Shved ha detto - che è probabilmente più consigliabile abituarsi alla Escmodalità Inserimento di ap - ecco un esempio di mappature per la navigazione rapida in modalità Inserisci:

" provide hjkl movements in Insert mode via the <Alt> modifier key
inoremap <A-h> <C-o>h
inoremap <A-j> <C-o>j
inoremap <A-k> <C-o>k
inoremap <A-l> <C-o>l

Questo farà Alt+ hin modalità Inserisci andare un carattere a sinistra, Alt+ in jbasso e così via, analogamente a hjklin modalità Normale.

Devi copiare quel codice nel tuo file vimrc per averlo caricato ogni volta che avvii vim (puoi aprirlo digitando a :new $myvimrcpartire dalla modalità normale).


Eventuali movimenti in modalità normale

Poiché il Alttasto modificatore non è mappato (su qualcosa di importante) per impostazione predefinita, è possibile allo stesso modo estrarre altre (o tutte) funzionalità dalla modalità Normale alla modalità Inserisci. Ad esempio:
spostarsi all'inizio della parola corrente con Alt+ b:

inoremap <A-b> <C-o>b
inoremap <A-w> <C-o>w


(Altri usi Altin modalità Inserisci)

Vale la pena ricordare che potrebbero esserci usi migliori per la Altchiave rispetto alla replica del comportamento in modalità Normale: ad esempio, 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 <A-e> 
    \<Esc>
    \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 <A-y> 
    \<Esc>
    \kl
        \y$
    \hj
        \p
        \a

(Ho usato la \ continuazione della riga e il rientro per aumentare la chiarezza - i comandi sono interpretati come se fossero scritti su una sola riga.)


Tasti di scelta rapida integrati per la modifica

CTRL-H   delete the character  in front of the cursor (same as <Backspace>)
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 integrati per lo spostamento in modalità Inserisci.)

Riferimento: :help insert-index


Modalità riga di comando

Questo set di mappature rende disponibili i movimentiAlt + superiori nella riga di comando:hjkl

" provide hjkl movements in Command-line mode via the <Alt> modifier key
cnoremap <A-h> <Left>
cnoremap <A-j> <Down>
cnoremap <A-k> <Up>
cnoremap <A-l> <Right>

In alternativa, questi mapping aggiungono i movimenti sia alla modalità Inserisci che alla modalità riga di comando in una volta sola:

" provide hjkl movements in Insert mode and Command-line mode via the <Alt> modifier key
noremap! <A-h> <Left>
noremap! <A-j> <Down>
noremap! <A-k> <Up>
noremap! <A-l> <Right>


I comandi di mappatura per portare i comandi in modalità normale nella modalità da riga di comando sembrano leggermente diversi dai comandi di mappatura in modalità inserimento (poiché la modalità da riga di comando manca della modalità di inserimento Ctrl+ O):

" Normal mode command(s) go… --v <-- here
cnoremap <expr> <A-h> &cedit. 'h' .'<C-c>'
cnoremap <expr> <A-j> &cedit. 'j' .'<C-c>'
cnoremap <expr> <A-k> &cedit. 'k' .'<C-c>'
cnoremap <expr> <A-l> &cedit. 'l' .'<C-c>'

cnoremap <expr> <A-b> &cedit. 'b' .'<C-c>'
cnoremap <expr> <A-w> &cedit. 'w' .'<C-c>'


Tasti di scelta rapida integrati per spostamento e 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 <Backspace>)
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)
<Up>         recall previous command-line from history (that matches pattern in front of the cursor)
<Down>       recall next     command-line from history (that matches pattern in front of the cursor)
<S-Up>       recall previous command-line from history
<S-Down>     recall next     command-line from history
<PageUp>     recall previous command-line from history
<PageDown>   recall next     command-line from history

<S-Left>     cursor one word left
<C-Left>     cursor one word left
<S-Right>    cursor one word right
<C-Right>    cursor one word right

<LeftMouse>  cursor at mouse click

Riferimento: :help ex-edit-index


@YugalJindle: Grazie! :) Ora ho aggiunto informazioni su come modificare la modalità da riga di comando. (L'approccio è un po 'diverso dalla modalità Inserisci.)
Aaron Thoma,

@Zen: Cosa intendi con "winkey"? Non ho fatto riferimento alla chiave di Windows nella mia risposta. Intendi la Altchiave?
Aaron Thoma,

Maiusc - sinistra / destra per spostare un'intera parola !! Come non lo sapevo. Grazie.
Floris,

in realtà in modalità terminale alt invia automaticamente esc prima dei tuoi comandi ........
Fuseteam

26

Se sei un purista vim, salta la lettura di questa risposta. OTOH, se sei nuovo di Vim e stai cercando alcuni consigli 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, vimposso offrire alcuni punti di vista e suggerimenti potenzialmente contrari.

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

Mentre la ripetizione è un concetto potente in vim, io (personalmente) trovo strano che usarlo mi costringa a contare (righe, caratteri, parole, ecc.) O fare ipotesi. Il mio cervello di solito funziona come "Voglio il cursore " e non come "Voglio il cursore _5_words_to_the_left_". Essere in grado di spostare rapidamente il cursore e osservare visivamente dove si trova il punto di inserimento in questo modo mi consente di tenere a mente ciò che sto modificando invece di dover contare quanti hop devo fare per arrivare dove devo modificare.

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

... per navigare in grandi quantità di testo.

La maggior parte dei (tutti) computer moderni ha un touchpad che è strettamente integrato con la tastiera (ad es. I MacBook). I progettisti industriali hanno trascorso molti anni uomo 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, è se sei abituato a un mouse e non ti piace cambiare, ma per chiunque sia nuovo a vim (come quelli che potrebbero trovare questo post tramite una ricerca), questo non dovrebbe essere un grosso problema.

Come bonus, clic + trascina ti mette in modalità visiva

Con il mouse abilitato, fare clic e trascinare ha l'effetto di passare alla modalità visiva e contrassegnare una regione per lo strappo.

E usa la rotella di scorrimento

Usare il mouse (rotellina) per scorrere e fare clic per posizionare il cursore (duh) funziona. Vedi http://usevim.com/2012/05/16/mouse/ per ulteriori informazioni al riguardo.

E così...

Questi sono quelli che definirei modi più moderni (usando il mouse, la rotella di scorrimento, ecc.) Di navigare in VIM, ugualmente efficaci a seconda delle tue preferenze di input.

HTH


6
@MilesRout sì, ho avuto una dichiarazione di non responsabilità. Ma con tutta serietà, penso che ci sia una buona percentuale di utenti di VIM che il cervello lavora allo stesso modo del mio. Cioè ... il mio cervello di solito funziona come "Voglio il cursore lì" e non come "Voglio il cursore 5_words_to_the_left ". E il modo convenzionale di vim non funziona così bene per quelle persone. Amo vim perché a) è disponibile ovunque eb) ha potenti funzionalità. Tuttavia non sento la necessità di conformarmi a tutti i suoi meccanismi predefiniti.
Shyam Habarakada,

4
@MilesRout C'è molta religione intorno a questo genere di cose in vim, quindi non discuterò con te su questo. Il metodo di conteggio delle ripetizioni non mi aiuta, e la risposta accettata lo chiama anche come qualcosa di fortemente sottoutilizzato. Posso solo immaginare perché sia ​​così. L'uso di w, b ecc. Per navigare verso luoghi vicini è fantastico, ma per andare oltre, la rotellina del mouse funziona molto meglio per me. Saluti.
Shyam Habarakada,

4
+1. Non capisco sotto voto. C'è un disclaimer. Prendilo se ti piace e saltalo se non lo fai.
fangmobile.com,

Questa è una risposta molto utile
Slava,

1
Come qualcuno che si è recentemente spostato su VIM, trovo che la premessa di questa risposta sia assolutamente esatta. La possibilità di dire istantaneamente il numero di ripetizioni necessarie per posizionare il cursore in un determinato punto potrebbe o non potrebbe essere qualcosa che viene fornito con Esperienza. In questo momento, proprio come @ShyamHabarakada, il mio cervello non funziona così. Indipendentemente da quanto poco ortodosso possa essere, ho mappato personalmente fn + hjkl sui tasti freccia per movimenti molto piccoli. Per i grandi movimenti, di solito approssimo un numero di ripetizioni e poi perfeziono con quelle. Per me, è il più veloce possibile.
Jacoscaz,

14

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

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

È possibile navigare in modalità Inserisci se si sta risolvendo un errore commesso nella stessa sessione Inserisci. Non navigare al di fuori dell'intervallo di testo modificato.

Se si commette un errore durante l'immissione del testo e si esce dalla modalità Inserisci per risolverlo, non sarà possibile ripetere l'azione desiderata, .ripeterà la correzione.

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


4

In GVim puoi usare il mouse. Ma onestamente, cosa c'è di sbagliato nell'usare i tasti freccia? C'è un motivo per cui sono su una tastiera.


9
ma questa ragione non è adatta agli utenti di VIM. Uno dei punti di forza di Vim è che puoi fare qualsiasi cosa senza dover perdere tempo e denaro dalla fila della tastiera. In particolare, i movimenti hjkl.
Aaron Thoma,

1
Sono d'accordo con @ammoQ. Niente di sbagliato nell'utilizzo dei tasti freccia. Se l'utilizzo dei tasti freccia ti dà maggiore produttività, procedi con esso.
Eunwoo Song,

accolade: utilizzo hjkl più spesso dei tasti freccia quando utilizzo vi, ma passare da una modalità all'altra è diventato per me un'azione inconscia.
Erich Kitzmueller,

4

Per navigare un po 'meglio in modalità inserimento, perché non mappare alcuni tasti?

imap <C-b> <Left>
imap <C-f> <Right>
imap <C-e> <End>
imap <C-a> <Home>
" <C-a> is used to repeat last entered text. Override it, if its not needed

Se riesci a evitare che la chiave Meta funzioni nel tuo terminale, puoi deridere la modalità emacs ancora meglio. La navigazione in modalità normale è decisamente migliore, ma per movimenti più brevi aiuta a rimanere in modalità inserimento.

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

<Meta-b>    maps to     <Esc><C-left>

Questo passa alla modalità normale e torna indietro di una parola


2

Credo Homeche End(e PageUp/ PageDn) funzionino normalmente anche in modalità inserimento, ma a parte questo, non credo che ci siano altre chiavi standard definite per l'attraversamento del testo.


ma forse non c'è modo di attraversare il testo usando solo i tasti delle lettere?
Andreas Grech,

5
Certamente c'è, se non vuoi essere in grado di digitare determinate lettere ...;)
hobbs

@hobbs Che ne dici di ctrl + hjkl? Questo dovrebbe avere senso
user4052054

1

Mi dispiace ma vim non funziona in questo modo.

Dovresti passare alla modalità "normale", navigare e poi tornare indietro per inserire di nuovo.


1

È possibile creare mappature che funzionano in modalità inserimento. Il modo per farlo è tramite inoremap. Nota la 'i' all'inizio del comando (noremap è utile per evitare le collisioni della 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 genere di cose e tutto quel potere è disponibile dalla modalità normale. Vim offre già dei semplici modi per passare dalla modalità normale alla modalità di inserimento (ad es. I, I, a, A, o, O). Il trucco è rendere facile entrare in modalità normale. Il modo per farlo è rimappare una chiave più comoda. Ma hai bisogno di uno che non sia in conflitto con la tua normale digitazione. Io uso:

inoremap jj <Esc>

Poiché jj (ovvero 2 j è stato digitato uno dopo l'altro rapidamente) non sembra comparire nel mio vocabolario. Gli altri rimapperanno dove è comodo.

L'altra modifica essenziale che faccio è cambiare 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 e bello proprio dove lo voglio. (Questo è comune per gli utenti di Emacs. Il rovescio della medaglia è quando ti trovi su una tastiera 'non fissata'! Aaarggh!)

Dopo aver rimappato CAPSLOCK, è possibile utilizzare comodamente i seguenti rimappaggi della modalità di inserimento:

Tenendo presente che alcune chiavi sono già mappate in modalità insert (back-kill-word è Cw (Control-w) per impostazione predefinita, potresti già avere i binding che desideri. Detto questo, preferisco Ch così nel mio .vimrc ho :

inoremap <C-h> <C-w>

MA, probabilmente vuoi lo stesso spasmo della memoria muscolare in modalità normale, quindi mappa anche Ch come:

nnoremap <C-h> db

(d) elete (b) ackwards compie la stessa cosa con lo stesso accordo chiave. Questo tipo di modifica rapida è uno che trovo utile in pratica per i refusi. Ma attenersi alla modalità normale per spostarsi nel testo e qualcosa di più che uccidere la parola precedente. Una volta che avrai l'abitudine di cambiare modalità (usando ovviamente un rimappare), sarà molto più efficiente di rimappare la modalità di inserimento.


bel rimappare per la fuga - credo che funzionerà praticamente per qualsiasi cosa tranne l'arabo traslitterato!
jjt

0

È possibile utilizzare imapper mappare qualsiasi tasto in modalità inserimento a uno dei tasti cursore. Così:

imap h <Left>

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

Detto questo, non credo che il modo standard di muoversi nel testo usando VIM sia "non produttivo". Esistono molti modi molto potenti di attraversare il testo in modalità normale (come usare web, oppure / e? Oppure f e F, ecc.)


1
Non ho detto che il modo standard di spostarsi attraverso il testo in VIM non sia produttivo; quello che ho detto è che è stato un po '"fastidioso" dover uscire dalla modalità di inserimento per tornare indietro di alcuni caratteri e quindi dover tornare indietro per inserire di nuovo; ma poi di nuovo, forse è perché non mi sono ancora abituato a vim :)
Andreas Grech,

Questa è la soluzione che stavo cercando. Uso imap <Ch> <Left> (so che cancella un carattere, ma ho backspace), che è tutto ciò di cui ho bisogno, grazie.
user4052054

0

Per alcuni movimenti e azioni usati di frequente, ho definito i seguenti mapping. Ciò consente di risparmiare una sequenza di tasti rispetto alla combinazione CTRL + O e poiché ne ho bisogno frequentemente, pagano a lungo termine.

inoremap <A-$> <C-o>$
inoremap <A-^> <C-o>^
inoremap <A-h> <Left>
inoremap <A-l> <Right>
inoremap <A-O> <C-O>O
inoremap <A-o> <C-o>o
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.