"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 ?
"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 ?
Risposte:
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 hjkl
per 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é hjkl
perché 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.
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.
/want
e premere invio per atterrare sulla parola "vuoi", quindi fai ci"
.
hjkl
): mappatura up
e down
2 tasti che sono indistinguibili l'uno dall'altro, figuriamoci dai tasti sinistro e destro ..... è una tragica dimostrazione di arroganza accecata ideologicamente.
In breve, Vim
utilizza i hjkl
tasti come interfaccia di navigazione perché è un residuo del vecchio terminale "ADM-3A", con questi tasti contrassegnati da frecce.
Poiché
vim
è derivatovi
, utilizza le stesse chiavi hjkl.
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.
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.
hjkl
non funziona in modalità inserimento, quindi come può essere una risposta alla domanda?
hjkl
in 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.
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, hjkl
sono comunque solo marginalmente migliori delle frecce. Sì, l'unico vantaggio dell'utilizzo hjkl
sopra 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 l
principali 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 l
tasto premuto? No certo che no.
Per fortuna la maggior parte dei toolkit della GUI forniscono combo del genere Ctrl+Right
che 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 14k
con l'aiuto di relativenumber
è fantastico, ma per quanto riguarda i movimenti orizzontali? Per i grandi movimenti, in hjkl
realtà 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 hjkl
e per la maggior parte molto più logici e intuitivi se sei abituato Ctrl+Right
e amici.
Passare da <Right><Right><Right><Right><Right><Right><Right><Right><Right>
a lllllllll
o 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, hjkl
hanno 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.
hjkl
è inutile ma hjkl
sono utili.
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 ESC
sarebbe interpretata come "esci dalla modalità inserimento", e quindi i seguenti [ A
sarebbero 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.
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.
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 hjkl
tasti.
ESC [ A
sia ciò a cui ti riferisci?
ESC [ A
è un terminale DEC VT-100 (il terminale ANSI era fortemente derivato dalla freccia DEC VT-100). IIRC, ESC A
era la freccia ADM-3A, o forse la freccia DEC VT-52. Il punto rimane lo stesso, tuttavia, il ESC
carattere inviato come parte del tasto freccia è stato facilmente confuso con il carattere ESC
digitato manualmente.
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
, o
o cw
che è 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 hjkl
se 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 ESC
emesso "per ogni evenienza".
(Tuttavia, quando la rete è in ritardo o la macchina è impantanata, il master batte la ESC
chiave furiosamente e ripetutamente, proprio come tutti gli altri.)
vi
la 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à".
Sì, per molte delle ragioni sopra menzionate, è vi
stato 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 hjkl
navigano solo vi
occasionalmente. 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 ".
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.
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 I
per 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 0
e 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.
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.
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 "