2010-04-09 13 views
6

Sto provando a scrivere un alias per cd !!: 1, che prende la seconda parola del comando precedente e passa alla directory di quel nome. Ad esempio, se digitoPosso avere un alias di shell per valutare un comando di sostituzione della cronologia?

rails new_project 
cd !!:1 

, la seconda riga verrà inserita nella directory "new_project".

Poiché !!: 1 è scomodo da digitare (anche se è breve, richiede tre tasti MAIUSC, sui lati opposti della tastiera e quindi una versione non SHIFTed della chiave che è stata digitata due volte SHIFT), desidero digitare solo qualcosa come

cd- 

ma dal momento che il !!: 1 viene valutata sulla riga di comando, io (ovviamente) non può solo fare

alias cd-=!!:1 

o sarei risparmiando un alias che conteneva "new_project" in esso hard-coded. Così ho provato

alias cd-='!!:1' 

Il problema di questo è che l'!!: 1 non è mai valutato, e ricevo un messaggio che nessuna directory denominata !!: 1 esiste. Come posso creare un alias in cui viene valutata la sostituzione della cronologia AL TEMPO CHE RIESCO IL COMANDO ALIAS, non quando definisco l'alias e non mai?

(Ho provato questo sia in bash e zsh, e ottenere gli stessi risultati in entrambi.)

+0

Possibile stesso su Unix: http://unix.stackexchange.com/questions/85352/how-can-i-alias-sudo/85354 –

risposta

6

Per zsh:

alias cd-='cd ${${(z)$(fc -l -1)}[3]}' 

Come funziona:

  1. $(fc -l -1) viene valutata. fc -l {start} [{end}] significa «elenca i comandi della cronologia da {start} a {end} o last if {end} non è presente».
  2. ${(z)...} deve dividere ... in un array come fa la shell (vedere «Parameter Expansion Flags» in man zshexpn), ma in realtà si divide su spazi vuoti. Forse è solo il mio bug.
  3. ${...[3]} prende il terzo valore dall'array. Il primo valore è un numero di un comando, il secondo è comando e il terzo e successivi sono argomenti.
+0

Ho appena fatto qualcosa di simile e ho finito con 'fc ... | cut -d '' -f4-', che rimuove il primo numero di comandi. –

9

Per bash:

alias cd-='cd $(history -p !!:1)' 
+0

Molto bello in bash: Grazie! Sfortunatamente non funziona in zsh. storia dell'uomo e della storia --help sono inutili, e non sono stati in grado di trovare qualsiasi cosa tramite Googling ... tutte le idee? – iconoclast

+1

'history' è un comando zsh incorporato. Usa 'man zshbuiltins'. – ZyX

+0

Pensavo ci fosse un modo per farlo usando anche le virgolette. per esempio. 'alias cd - = 'cd \' !!: 1 \ '''. Quale sarebbe più succinto (se potessi farlo funzionare!) –

8

Un altro modo per ottenere la stessa cosa :

Per l'ultimo argomento:

cdAlt - .

o

cdEsc.

Per il primo argomento:

cdAlt - Ctrl - y

o

cdEscCtrl - y