Perché i tasti freccia non sono consigliati in Vim


125

"Non usare mai i tasti freccia in Vim!"

L'ho sentito da un oratore casuale, ma non ho avuto la possibilità di chiedergli perché. Inoltre, se non si utilizzano i tasti freccia, come si può spostare il cursore nella modalità Inserisci ?


6
Le risposte storiche a questa domanda sono interessanti. Le religiose lo diano di meno.
Isaac Rabinovitch

5
Buona domanda. Questo mi infastidisce sempre di vi [m], poiché un utente di tastiera Dvorak fa davvero schifo!
mer

32
Ricordo quando ho usato per la prima volta vi, molti anni fa, un collega anziano che mi consigliava "Assicurati di imparare a usare i tasti h, j, kel perché un giorno finirai sulla macchina in un sito client dove la freccia le chiavi non funzionano e sembrerai una testa d *** completa se non riesci nemmeno a lavorare vi. "
Ergwun,

1
In modalità inserimento puoi ancora spostare il cursore usando Ctrl-O, quindi un normale comando in modalità, e tornerà alla modalità inserimento. Controlla anche CTRL-G CTRL-J e CTRL-G CTRL-K che sposteranno il cursore sulla riga successiva e precedente, nella colonna che hai iniziato a inserire.
Benoit,

1
Nel corso degli anni ho sviluppato un sacco di cattive abitudini vi [m]. Penso di aver bisogno di usarlo su una connessione molto lenta, per costringermi ad usare abitudini migliori.
Aidan

Risposte:


172

L'uso dei tasti freccia è considerato una cattiva abitudine, perché se stai usando i tasti freccia probabilmente perderai molte delle adorabili funzioni di Vim.

Quando le persone iniziano a usare vim per la prima volta, tendono a rimanere nella modalità di inserimento poiché è più simile alla modifica del testo convenzionale. Per essere efficace in vim, tuttavia, dovresti essere in modalità di inserimento solo quando stai inserendo del testo. Se vuoi spostare il cursore, dovresti essere in modalità normale. Dovresti praticamente essere in modalità normale per impostazione predefinita.

In modalità normale ci sono un milione di scorciatoie per spostarsi. È possibile utilizzare hjklper spostarsi di uno spazio alla volta oppure è possibile spostarsi di parole, paragrafi e così via. Se sei in modalità normale, non ha senso usare i tasti freccia anziché hjklperché sono più lontani.

C'è l'atteggiamento che se stai usando i tasti freccia, stai usando vim "sbagliato". La verità è che vim ha una curva di apprendimento davvero ripida, quindi mentre stai imparando fai tutto ciò che ti mantiene sano di mente. Quando ho iniziato a usare Vim, ho fatto tutto nel modo "sbagliato" e non ho avuto problemi a rompere le abitudini una volta appreso più dei comandi di Vim.

Ad esempio, quando ho iniziato, dì che volevo cambiare il testo tra virgolette:

String mystring = "I want to change this";

Vorrei entrare nella modalità di inserimento, spostarmi alla fine della stringa usando i tasti freccia, premere backspace fino a quando la stringa è scomparsa e inserire il nuovo testo.

Un modo molto migliore è posizionare il cursore in qualsiasi punto della stringa (modalità normale), quindi premere ci". Questo lo farà change in ". Eliminerà tutto tra virgolette e ti metterà in modalità inserimento in modo che io possa inserire il nuovo testo.


4
@ ott-- ci<e ci)funziona pure, e non devi muovere la mano dalla tastiera al mouse. Se si desidera passare all'inizio delle parentesi e quindi modificare il contenuto f(ci(funziona.
Matthew Finlay,

6
"posiziona il cursore in qualsiasi punto della stringa" - e di nuovo, mentre nella modalità di inserimento useresti le frecce per arrivarci, in modalità normale potresti fare /wante premere invio per atterrare sulla parola "vuoi", quindi fai ci".
Nathan Long,

8
Ehi, questo è pulito! Che modo veloce e potente per spostare il cursore. L'unico modo per migliorarlo sarebbe un modo per indicare magicamente dove volevi il cursore e farlo saltare lì. Forse possiamo inventare qualcosa. Penso che dovremmo chiamarlo un "mouse".
Matthew Scouten,

18
@MatthewScouten Nessuno sostiene che Vim sia più semplice di un mouse. Con un po 'di pratica, è molto, molto più veloce. Usare un mouse è come puntare e grugnire per farti capire. Vim ti consente di parlare in frasi complete.
Decano del

4
Le abitudini di rottura sono ottime risposte, ma impedire forzatamente a qualcuno di svolgere un'attività normale è fascista. Peggio ancora, l' usabilità di ( hjkl): mappatura upe down2 tasti che sono indistinguibili l'uno dall'altro, figuriamoci dai tasti sinistro e destro ..... è una tragica dimostrazione di arroganza accecata ideologicamente.
Nuova Alessandria,

93

Posizionamento chiave

In breve, Vimutilizza i hjkltasti come interfaccia di navigazione perché è un residuo del vecchio terminale "ADM-3A", con questi tasti contrassegnati da frecce.

Tastiera

Poiché vimè derivato vi, utilizza le stesse chiavi hjkl.

Nuove abitudini

La sostituzione basata su lettere per i tasti freccia consente di navigare nel testo senza staccare le mani dalla configurazione di digitazione standard . Questo è probabilmente più efficiente e più veloce di muovere la mano per colpire i tasti freccia. Come indicato nel riferimento n. 2 (vedi risorse), questa non è la fine dei vantaggi: VIM ha molte altre scorciatoie a cui puoi accedere senza muovere le mani.

Risorse e modalità di inserimento

Ci sono alcune risposte molto dettagliate e accurate alle 2 parti della tua domanda: in termini di sostituzione del tasto freccia, ho risposto in modo rapido e riepilogativo, tuttavia per la tua domanda di inserimento , consulta le risorse elencate di seguito.


2
Per non parlare del fatto che i tasti hjkl sono molto più efficienti che spostare le mani sui tasti freccia.
sixtyfootersdude,

2
Questo non risponde alla domanda, spiega solo perché viene scelto hjkl .
Matsemann,

3
Questa è una storia vera e interessante, ma l'OP chiede come muovere il cursore in modalità inserimento . hjklnon funziona in modalità inserimento, quindi come può essere una risposta alla domanda?
LarsH,

3
@Kruug, la prima parte della domanda è perché qualcuno ha detto di non usare mai i tasti freccia in vim. Il fatto che tu possa usare hjklin vim non dice perché qualcuno non dovrebbe mai usare i tasti freccia, così come il fatto che io possa andare in bicicletta al lavoro non spiega perché qualcuno mi direbbe mai di correre.
LarsH,

1
Ora capisco perché Vim usa Esc per uscire dalla modalità di inserimento ^^ Immagine fantastica!
Étienne,

56

Quello stupido mantra viene spesso ripetuto dai dattilografi per i quali la fila in casa è come una seconda spina dorsale o da un dattilografo senza tocco che vuole apparire figo. Per i dattilografi non touch, la riga home non è così speciale e spostare leggermente la mano destra per raggiungere le frecce non è affatto un problema.

Ciò che è importante considerare è ciò che le persone che ripetono quel mantra propongono di usare invece.

Il più delle volte, insistono sull'uso hjkl.

Se lasciamo fuori il fatto che questi tasti sono usati solo perché la tastiera usata dall'autore di vi non aveva i tasti freccia fisici e quindi che qualsiasi argomento contro i tasti freccia è solo razionalizzazione, hjklsono comunque solo marginalmente migliori delle frecce. Sì, l'unico vantaggio dell'utilizzo hjklsopra le frecce è che salti quel piccolo movimento della mano destra da e verso le frecce. Se quel vantaggio vale la pena è la tua chiamata.

Ma quel movimento della mano destra non è il motivo per cui usare solo le frecce è inefficiente. È inefficiente perché ti trattengono a spostare carattere per carattere e riga per riga mentre la maggior parte dei movimenti necessari per la modifica del testo ha un intervallo molto più ampio.

Martellare la freccia destra 13 volte è inefficiente e noioso. E ' che meglio martello i lprincipali 13 volte? No. È ugualmente stupido.

Tenere premuta la freccia destra finché non si raggiunge il proprio obiettivo è meno noioso ma è soggetto a errori e quasi inefficiente come 13 colpi a causa del rallentamento necessario e non deterministico alla fine. E ' che meglio per mantenere il ltasto premuto? No certo che no.

Per fortuna la maggior parte dei toolkit della GUI forniscono combo del genere Ctrl+Rightche ci consentono di spostarci parola per parola o passare a EOL, al paragrafo successivo o altro. Queste scorciatoie ci aiutano a navigare molto più velocemente e in modo più intelligente rispetto alle singole frecce. Abbiamo lo stesso con hjkl? No, non lo facciamo. Possiamo usare un conteggio, se vogliamo, ma chi vuole contare i personaggi per ogni movimento? Fare 14kcon l'aiuto di relativenumberè fantastico, ma per quanto riguarda i movimenti orizzontali? Per i grandi movimenti, in hjklrealtà sono peggio dei modificatori + delle frecce. E indovina cosa? I grandi movimenti sono ciò di cui abbiamo più bisogno.

Ma siamo bastardi fortunati, il nostro editore preferito ha dozzine di movimenti che girano attorno alle frecce e hjkl : bBeEwW/?*#{}()e così via. Questi comandi sono incredibilmente più potenti di hjkle per la maggior parte molto più logici e intuitivi se sei abituato Ctrl+Righte amici.

Passare da <Right><Right><Right><Right><Right><Right><Right><Right><Right>a lllllllllo addirittura 9lè ridicolmente inutile.

Passare da <Right><Right><Right><Right><Right><Right><Right><Right><Right>a <C-Right>è decisamente migliore. Da lì, passare a wè sia facile che veloce. Non c'è bisogno delle <nop>tue frecce!

Se questi comandi sono più utili, più potenti e più intuitivi di hjkl, perché mai così tanti blogger e commentatori insistono nel sostituire le frecce con hjkl?

Io ho. Nessuna idea.

In conclusione, hjklhanno il loro posto nella nostra cintura degli attrezzi perché dobbiamo sempre muoverci di 2 caratteri o linee ma sono più spesso dell'albero che nasconde la foresta. Diffida delle persone che predicano contro le frecce: ciò che hanno in serbo per te potrebbe non essere affatto migliore.


All'inizio, ho pensato che avresti detto che "hjkl" è inutile, ma una buona cattura, i movimenti di parole / paragrafi / frasi sono molto più utili del mantra relativo al movimento di un singolo personaggio.
Xavier T.

1
Grazie. Ho avuto una discussione simile su HN l'altro giorno che ha deragliato a causa della scarsa espressione. Concentrarsi sugli sforzi hjkl è inutile ma hjklsono utili.
romainl

5
Lo stesso qui: alla fine mi è piaciuta la tua risposta, ma penso che il tono si sia rivelato inutilmente ranting / trolling / flaming.
ZioZeiv,

Non chiamarli inutili, l'argomento sulla velocità è buono e il modo in cui HJKL funziona con altri comandi VIM in un modo in cui i tasti freccia non lo sono è altrettanto importante.
Aviator45003

@TC Qualche esempio per rendere l'intero dibattito più interessante?
romainl

18

Altri hanno descritto perché sono preferiti altri modi per spostare il cursore, ma si è detto poco per rispondere alla domanda, perché è considerato una cattiva idea usare i tasti freccia?

Penso che il motivo principale (e @Squeezy in qualche modo alluso a questo) sia che ai tempi di terminali come il VT100, i tasti freccia producevano una sequenza di escape che era stata interpretata dal programma in esecuzione. (Poiché i tasti freccia non sono rappresentati in ASCII, la digitazione dei tasti freccia deve essere comunicata in un modo "speciale".) La sequenza di escape era in genere qualcosa di simile

ESC [ A

a seconda delle proprietà del terminale, della connessione e della modalità cursore . Se la shell o il programma non sono stati configurati correttamente per il terminale, non comprenderebbero la sequenza di escape come un tasto freccia.

Quando ero al college, accedendo a Ultrix tramite i terminali VT100, se avessi premuto una freccia mentre vi trovavi in ​​modalità inserimento, la cosa ESCsarebbe interpretata come "esci dalla modalità inserimento", e quindi i seguenti [ Asarebbero stati interpretati come comandi in modalità normale . Ovviamente non quello che l'utente vuole o si aspetta!

Al giorno d'oggi, la gestione dei terminali e dei tasti freccia sembra essere più solida, specialmente negli ambienti con interfaccia grafica. Ma gli stessi problemi si verificano ancora quando si utilizza vim su SSH o Telnet.


14

L'uso dei tasti freccia è disapprovato perché ti costringe a spostare le dita dalla schermata iniziale quando si utilizza il layout QWERTY e dal riquadro caratteri (?) Quando si utilizza Dvorak o qualsiasi altro layout.


4
Wow. Sul serio? Non voglio crederci, poiché ciò implicherebbe che le persone che hanno progettato Vim penserebbero che i loro utenti passino più tempo a scrivere che a pensare.
Renan,

13
Perché muovere la tua mano implica pensare?
EBGreen

8
bene, quando dovevo farlo a scuola, dovevi premere esc prima di poter usare la navigazione hjkl, quindi avevi già rimosso la mano sinistra dalla fila di casa per portare il tuo mignolo su Esc. Ricordo che per tornare indietro di uno spazio e inserire un carattere dovevi inserire 'Esc: ciao' e quindi digitare il carattere che volevi inserire. non è così utile.
Frank Thomas,

1
@Renan - stai assumendo che "digitare" significhi "inserire testo". Ho le mie dita sulla riga casa quando sto leggendo e pensando, anche perché la tastiera è come navigare in Vim: cercare di muoversi, l'apertura di altri file per confrontare il codice, saltellando per correggere gli errori di ortografia, ecc
Nathan lunga

2
@Renan - 1) sottovaluti i risparmi e 2) piccole cose si sommano. Ho visto gli utenti esperti di Vim scrivere a tocco modificare 10 volte la velocità di altri sviluppatori. A una velocità sufficiente, l'editing diventa automatico e non interrompe i pensieri o il flusso. È un piacere lavorare in questo modo, quindi fa galleggiare la mia barca, ma scommetto che è un aumento della produttività più grande di quanto pensi. Prova a guardare programmatori come Gary Bernhardt come esempio.
Nathan Long,

10

I tasti freccia presentano un problema - era già noto in vi - su connessioni lente, come sul modem 1200 baud. La freccia si traduce in una sequenza ESC come ESC a. Ora, quando il tempo tra ESC e a diventa troppo lungo, finisci per sentire un BEL (o vedere un flash) seguito dalla modalità append. Questo non apparirà con i hjkltasti.


Penso che ESC [ Asia ciò a cui ti riferisci?
LarsH,

2
ESC [ Aè un terminale DEC VT-100 (il terminale ANSI era fortemente derivato dalla freccia DEC VT-100). IIRC, ESC Aera la freccia ADM-3A, o forse la freccia DEC VT-52. Il punto rimane lo stesso, tuttavia, il ESCcarattere inviato come parte del tasto freccia è stato facilmente confuso con il carattere ESCdigitato manualmente.
RBerteig,

@RBerteig: Buono a sapersi.
LarsH,

5

Per quanto riguarda la seconda domanda:

[I] Se non usi i tasti freccia, come puoi spostare il cursore nella modalità Inserisci?

Per chi è padrone e quindi disdegna i tasti freccia, non esiste neppure il concetto di "modalità".

Il master aggiunge nuovo testo utilizzando non una modalità di inserimento, ma piuttosto comandi completi di inserimento o sostituzione che iniziano con un codice operativo come i, oo cwche è seguito da un payload e terminato da ESC. I comandi hanno una sintassi, e quindi la macchina attraversa gli stati accettando la sintassi dei comandi, ma nel modello dell'editor del master, questi non danno origine a una modalità. Ciò che gli apprendisti chiamano ingenuamente "modalità", è per il maestro uno stato di comando incompiuto, una situazione molto odiosa che il maestro evita.

Ogni volta che il master si rende conto, mentre si trova nel mezzo di un comando di inserimento o sostituzione, quel testo deve essere inserito o eliminato diverso dalla posizione del carattere successiva indicata dal cursore, il master termina il comando di inserimento e libera una delle dozzine di efficienti comandi di movimento (ricorrendo all'umile hjklse un modo più potente non è ovviamente applicabile).

Inoltre, poiché il master raramente viene distratto in modo tale da lasciare un comando incompiuto, il master raramente, se non mai, provoca un segnale acustico dell'editor a causa dell'ingresso di un superfluo ESCemesso "per ogni evenienza".

(Tuttavia, quando la rete è in ritardo o la macchina è impantanata, il master batte la ESCchiave furiosamente e ripetutamente, proprio come tutti gli altri.)


2
Ricorda, se vila voce di comando insert è una modalità, per essere onesti, dobbiamo identificare tutte queste modalità in altri editor e chiamarle modali. Ad esempio, quando premiamo Ctrl-X in Emacs, ci troviamo in una "modalità" in cui è possibile, ad esempio, premere Ctrl-S per salvare il documento, che non funzionerà al di fuori di quella "modalità".
Kaz,

5
  • i tasti freccia potrebbero non funzionare bene in determinati ambienti. hjkl sono personaggi normali e ben compresi da tutti i tipi di terminali.
  • Non si sposta il cursore in modalità Inserisci (ad eccezione di Backspace e correzione di un breve errore di battitura), l'idea di vi è di accedere alla modalità Inserisci solo per inserire qualcosa. Il movimento viene eseguito in modalità normale
  • Se puoi, dovresti evitare di usare hjkl per spostarti dove possibile, e invece usali solo per le indicazioni stradali . Ci sono numerose opzioni per spostarti in vi , vedi: http://vim.wikia.com/wiki/Moving_around

In realtà puoi spostare il cursore in modalità inserimento, almeno a sinistra, usando backspace. Ma sono d'accordo che non puoi spostarlo liberamente.
LarsH,

Ho cercato di esprimere che non VUOI spostare il cursore in modalità Inserisci .
Squeezy,

Spiacenti, ho frainteso quello che hai scritto dicendo che non puoi spostare il cursore in modalità inserimento. In realtà voglio spostare il cursore in modalità inserimento: se inserisco del nuovo testo e premo il tasto sbagliato, voglio usare backspace per correggerlo. Ma oltre quell'uso limitato, sono d'accordo.
LarsH,

3

Sì, per molte delle ragioni sopra menzionate, è vistato originariamente scritto per l'uso hjkl, ma " mai " è un'affermazione piuttosto grande.

Tendo a modificare vim(e altri strumenti che utilizzo) per comportarmi come voglio. Funziona alla grande sulla mia macchina, ma come sviluppatore incorporato non riesco sempre a scegliere ciò che è nelle macchine che supporto. Mi imbatto in macchine più vecchie che hjklnavigano solo vioccasionalmente. Finisco per inserire i codici di controllo nel mio file per un secondo o due fino a quando non rompo la mia abitudine e passo a hjkl.

L'unico motivo valido che posso trovare per "non usare mai i tasti freccia in Vim!" è quindi possibile utilizzare macchine che non sono in grado di gestire i tasti freccia. Sembra una ragione piuttosto sottile per dire " mai ".


3

se non si utilizzano i tasti freccia, come si può spostare il cursore nella modalità Inserisci?

Il motivo principale per cui scoraggio le persone dall'uso dei tasti freccia è esplicitamente perché consente di spostarsi mentre si è in modalità inserimento.

Uno dei problemi più strani con l'apprendimento di vim per i nuovi arrivati ​​è che il comando di annullamento di vim opera annullando l'ultima azione , non l'ultima sequenza di tasti . Molti dei miei amici finiscono per rimanere in modalità inserimento per tutto il tempo perché non c'è mai motivo di lasciarlo. Quando mi chiedono "Come posso annullare?" Rispondo con "premi la lettera u dalla modalità comando" si sentono frustrati quando vim cancella l'intero file.

"Vim è un editor di testo piuttosto inutile se non può annullare le cose nel modo giusto."

È difficile usare uno strumento prima di aver imparato come.

Vim diventa utile solo dopo aver imparato a usarlo. Il potere di Vim sta nel modo in cui puoi dirlo "fai quella cosa di nuovo" o "annulla quella cosa" o "fai quella cosa solo quando premo questo tasto di scelta rapida a macroistruzione" attraverso la memoria del muscolo subconscio. Se "quella cosa" diventa "digita l'intero file dall'inizio alla fine", sono d'accordo, vim non è affatto utile.

E 'per questo motivo si deve inserire solo il testo quando sei in insert mode. Evitare i tasti freccia è solo un modo che abbiamo trovato per aiutarti a diventare un utente migliore di Vim, più velocemente.


0

L'esecuzione di vim mentre sono sgusciata sul mio dispositivo Android che esegue un demone ssh in kbox mi ha portato a uscire dalla mia zona di comfort un po '. Dato che Anroid Terminal Emulator sul dispositivo utilizza i pulsanti del volume per sostituire le combinazioni di tasti speciali (ctrl + qualunque cosa), alcuni tasti che normalmente userei sulla tastiera non funzionano in questa situazione.

Ad esempio, la chiave Inserisci non funziona in questo ambiente, quindi sto usando Iper passare alla modalità di inserimento. Il tasto Esc, che di solito uso per sfuggire alla modalità di inserimento, non funziona neanche, quindi sto usando ctrl + [Esc. I tasti Home e Fine non funzionano come sono abituato. Invece mi affido alle scorciatoie 0e alle quali $non mi sono mai preoccupato prima di raggiungere l'inizio o la fine di una linea.

Comunque, i tasti freccia funzionano ancora come al solito nella mia situazione, ma è bello sapere che ci sono le scorciatoie da tastiera minimaliste.


0

basta scrivere il seguente comando prima di scrivere in vim: -

  1. Esc
  2. : imposta nocp

un problema è che potresti doverlo scrivere ogni volta.


beh, questo sarebbe utile quando vuoi usare il tasto freccia in modalità insert
0decimal0

0

Ecco il mio 2 ¢.

Fai qualunque cosa ti senta a tuo agio. Se si utilizzano editor diversi, potrebbe essere più semplice utilizzare i tasti freccia per coerenza.

D'altra parte, è assolutamente geniale che vi (e vim) non abbiano bisogno di chiavi speciali, tranne forse. Probabilmente potresti hackerare un vecchio selectric IBM per funzionare come un terminale.

L'altra cosa a cui prestare attenzione è che i tasti freccia potrebbero non funzionare come previsto. Ho usato terminali dove non funzionavano. Non sono sicuro di come siano implementati in Vim, ma sono abbastanza sicuro che non sia uniforme. La mia memoria macchiata sembra persino ricordare un'implementazione in cui sono stati implementati come macro VIM.


0

Il nome del gioco con editor di testo avanzati sembra essere "muoversi in fretta" e ridurre i movimenti sprecati / ripetitivi. C'è un po 'di tempo perso quando si passa dai tasti delle lettere ai tasti di direzione (a seconda delle dimensioni della tastiera) e di ritorno alla riga iniziale. Ma se riesci ad accedere al tasto ESC con il mignolo della mano sinistra o le modalità di commutazione anulare diventano un movimento fluido e nel corso di una sessione di modifica ci sarà un aumento di velocità.

E questa è la chiave per la seconda parte della tua domanda, esci dalla modalità di inserimento premendo ESC con la tua sinistra e muoviti con hjkl con la tua destra. Alla fine sarai in grado di farlo senza saltare un colpo.

Detto questo, non sono mai arrivato da nessuna parte con Vim fino a quando non ho provato alcune delle cose menzionate qui , la più importante delle quali è la sezione " Ottieni efficienza: mappature dei collegamenti "

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.