Utilizzo dei tasti VI per modificare i comandi di shell in UNIX


28

Avevo un collega che era davvero bravo in UNIX.

Mi ha mostrato come usare i binding dei tasti Vi per modificare i miei comandi di shell.

Ha inserito il comando in un file che è stato eseguito ogni volta che ho effettuato l'accesso.

Da allora, mi sono trasferito in un altro progetto.

Sfortunatamente non ricordo come configurarlo.

C'è qualcuno qui che sa come utilizzare i collegamenti ai tasti Vi per modificare i comandi nel terminale?

Come posso rendere permanente questa impostazione?

Risposte:


31

Stai parlando della più grande caratteristica di sempre!

Puoi usare i comandi vi per modificare i comandi della shell (e la cronologia dei comandi) aggiungendo questo al tuo .bashrcfile:

set -o vi

È inoltre possibile eseguire quel comando dalla riga di comando per influire solo sulla sessione corrente.

Se non usi bash, sostituisci il file rc appropriato per la tua shell.


Ciò consente di utilizzare i comandi vi per modificare qualsiasi comando ...

Puoi anche utilizzare je kper spostarti nella cronologia (dopo aver premuto ESC).

Puoi anche usare /(dopo aver premuto ESC) per cercare vecchi comandi.

In altre parole, per trovare quel cpcomando lunghissimo che hai fatto dieci minuti fa:

ESC/cpENTER

Quindi puoi scorrere tutti i comandi corrispondenti nella tua cronologia con ne N.

Tutto ciò mi rende 10 trilioni di volte più produttivo dalla riga di comando!


4
Bene, non sta davvero usando vi, sta usando i comandi da tastiera in stile vi per la modifica delle linee.

4
Certo ... immagino che la terminologia appropriata sia quella che vi bindings in the shellè la più grande caratteristica mai inventata!
jahroy,

Passerei dai collegamenti emacs ai collegamenti vi se ci fosse un modo per visualizzare la modalità. Conosci un modo per farlo?
iconoclasta,

Essi, c'è un modo per legare jjcon ESCcome siamo soliti fare in vim?
Steveyang,

@yangchenyun - Forse questa domanda vi aiuterà con quello: stackoverflow.com/questions/844862/... io personalmente non bind / altero uno dei comandi, quindi non sono abbastanza sicuro di quello che stai chiedendo.
jahroy,

12

Se stai usando bash, dato che jahroy e evil otto hanno già risposto, puoi usare

set -o vi

per fare in modo che bash usi i comandi di modifica in stile vi.

Una volta fatto questo, puoi digitare Esc vper avviare l'editor vi con un file temporaneo contenente una copia della riga di comando corrente. È possibile modificare il comando, anche sostituendolo con più righe; quando si salva il file ( :wq), la shell eseguirà i comandi modificati.

Se preferisci

set -o emacs

puoi usare Ctl-XCtl-Eper fare la stessa cosa. Userà il tuo editor preferito $EDITOR, non necessariamente emacs.

(Personalmente, uso vi (in realtà vim) per la maggior parte del mio editing, ma preferisco set -o emacsnella shell; passare e uscire dalla modalità di inserimento è ottimo per la modifica dei file, ma imbarazzante per i comandi interattivi. YMMV.)


conosci il modo di tornare alla normale modalità di modifica evitando lo stile vi? Ricordo di aver avuto successo con Bl Num, ma ora non di più; cosa mi sto perdendo?
piertoni,

@piertoni: set -o emacsnon fa quello che vuoi?
Keith Thompson,

Sì, funziona, ho perso il punto, grazie
piertoni,

10

Puoi usare set -o viper cambiare i tuoi comandi di modifica della linea come pubblicato da @jahroy, ma potresti pensare al fccomando (disponibile in bash e penso che ksh, ma probabilmente non tcsh), che inserirà il comando precedente in un editor (FCEDIT o EDITOR , che probabilmente hai impostato su vi) e quindi esegue il comando all'uscita dall'editor. Vedi la manpage o help fcper i dettagli, o semplicemente provalo.


5
alias r='fc -e -'è un valido alias per rieseguire i comandi precedenti. fcda solo, ho avuto origine nella conchiglia Korn, credo. È possibile specificare i comandi in base al numero ( fc 123 129per modificare i numeri di comando da 123 a 129 nella cronologia). È possibile specificare numeri relativi ( fc -10 -1per modificare gli ultimi 10 comandi immessi). È possibile elencare i comandi precedenti con fc -l. Puoi specificare un comando in base al prefisso con l' ralias ( r makeesegue l'ultima chiamata di make; così fa r mse non hai eseguito un mvcomando dall'ultima esecuzione make, ecc.).
Jonathan Leffler,

6

Per modificare il comando utilizzato più di recente in vim e invocare una versione modificata dopo che l'editor ha salvato ed è uscito, utilizzare la fcshell integrata. Senza alcun argomento, farà quanto segue:

  1. Crea un file temporaneo /tmpe lo popola con il comando digitato più di recente
  2. Dopo che l'editor esce normalmente (con il codice di uscita 0) esegue il comando trovato nel file temporaneo e rimuove questo file. La versione modificata viene salvata nella cronologia come un normale comando (almeno in zsh). Non esegue nulla se l'editor esce con un codice diverso da zero (in pratica ciò può essere ottenuto uccidendolo o usando :cquit).

Il comando funziona sia in bash che in zsh.


5

In effetti, questa è in effetti la più grande caratteristica di sempre. C'è di più però:

Crea un file chiamato

.editrc

contenente la linea

bind -v

Editline , è una libreria di versioni con licenza BSD che fornisce servizi simili a readline. Questo .editrc imposterà le tue combinazioni di tasti in modalità vi nella shell della riga di comando di MySQL o in qualsiasi applicazione che non utilizza readline.

Con il passare degli anni sono diventato un po 'smemorato, quindi il mio .zshrc ha utilizzato alcuni wrapper per la modalità vi, per mostrarmi in che modalità sono sulla riga di comando. È carino.

So che in zsh puoi scrivere

bindkey -L

e ottieni l'elenco delle combinazioni di tasti. Sono sicuro che bash deve avere qualcosa di simile. Non tutti i tasti vi sono associati per impostazione predefinita. Legali come meglio credi e parti per le gare.


Vorrei poter votare questo 5 volte per i collegamenti vi in ​​MySQL!
jahroy,

1

nel tuo terminale, digita export EDITOR=vi.

Per salvare questa impostazione. metti questa linea nel file ~ / .profile


5
Ciò imposta il tuo editor predefinito (per i comandi a cui prestare attenzione $EDITOR) su vi. Non ti consente di modificare i comandi della shell con vi(almeno non direttamente).
Keith Thompson,

2
@KeithThompson Zsh utilizza automaticamente la modalità di modifica vi se $EDITORcontiene vi. Penso che sia l'unica shell che lo fa.
Gilles 'SO- smetti di essere malvagio' il
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.