Comment répéter actuellement tapé dans le paramètre sur la console bash?

Je tapais juste quelque chose comme:

mv foo/bar/poit/zoid/narf.txt 

et soudainement réalisé, bon sang, je dois taper de grandes parties de ce paramètre à nouveau

 mv foo/bar/poit/zoid/narf.txt foo/bar/poit/zoid/troz.txt 

Même avec tabcompletion, tout à fait une douleur. Je sais que je peux copyr coller le paramètre par la souris en sélectionnant le text et middleclick mais ce n'est pas assez bon. Je veux restr sur le keyboard.

Alors y a-t-il un moyen de copyr coller le paramètre actuel de la ligne en utilisant le keyboard?

Si j'ai planifié à l'avance, j'utilise l' extension d'accolade . Voici une autre approche utilisant les raccourcis keyboard de readline par défaut:

  • mv foo/bar/poit/soid/narf.txt : démarrer
  • Ctrl-w : unix-word-rubout pour supprimer foo/bar/poit/soid/narf.txt
  • Ctrl-y Espace Ctrl-y : yank , espace, yank nouveau pour get mv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta-backspace Meta-backspace : backward-kill-word deux fois pour supprimer le dernier narf.txt
  • troz.txt : saisissez la partie de la queue qui est différente

Si vous passez trop de time à utiliser le shell bash , je vous recommand de lire périodiquement une list des raccourcis par défaut et d'en choisir quelques-uns qui semblent utiles à apprendre et à incorporer dans votre routine. Le chapitre 8 du manuel bash est un bon sharepoint départ. Connaître les raccourcis peut vraiment augmenter votre efficacité.

L'expansion de l'historique fonctionne également sur la command actuelle, en utilisant le désignateur d'événement !# . Combinez ceci avec le désignateur de mot pour le dernier argument – $ – pour get le paramètre que vous venez de taper. Et vous pouvez utiliser tous les modificateurs habituels, par exemple si vous renommez un file dans un directory éloigné, vous pouvez simplement taper:

 mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname 

Comme dans votre exemple, vous pouvez utiliser la prochaine construction:

 mv foo/bar/poit/zoid/{narf.txt,troz.txt} 

ou même (comme suggéré Ansgar Esztermann ):

 mv foo/bar/poit/zoid/{narf,troz}.txt 

au lieu de taper / copyr une longue adresse deux fois.

Jouer autour je l'ai fait fonctionner:

 mv foo/bar/poit/zoid/narf.txt 

Appuyez sur Entrée
pour stocker le dernier paramètre.

Maintenant, utilisez pour get le dernier tapé dans la ligne de return. Entrez un espace et utilisez le dernier paramètre utilisé:

Alt + .

Je déteste provoquer une erreur, mais il fait le travail dans ce cas d'utilisation.

Vous pouvez facilement utiliser des variables:

 a=test.csv ; cp $a $a.bak 

Ou dans votre cas (note onglet concours fonctionne pour la part):

 a=foo/bar/poit/zoid/ ; mv ${a}narf.txt ${a}troz.txt 

Une solution interactive courte solution en deux étapes:

1. tapez: echo foo/bar/poit/zoid/narf.txt

Cela rend foo/bar/poit/zoid/narf.txt avaylable pour l' Alt-. raccourci dans bash.

2. tapez: mv et appuyez sur Alt-. , Espace , Alt-.

Vous obtiendrez mv foo/bar/poit/zoid/troz.txt foo/bar/poit/zoid/troz.txt . Maintenant vous pouvez facilement modifier le dernier mot.

Un outil, qui pourrait venir (très) utile est:

Midnight Commander – un gestionnaire de files s'exécutant dans la console. Il vous permet de copyr les noms de files et les paths de directorys de manière interactive dans la command line. Midnight Commander vous montre donc 2 panneaux (gauche et droite) qui listnt le contenu de différents directorys.

Un petit guide:

  • Haut Les touches fléchées vers le bas sélectionnent les files du panneau actuel.
  • L'onglet bascule entre le panneau gauche et le panneau droit.
  • Ctrl-Shift-Enter copy le file actuellement sélectionné dans la command line (y compris le path d'access complet)
  • Alt-o ouvre le directory actuellement sélectionné dans l'autre panneau
  • Ctrl-o vous permet de voir la console en plein écran
  • Ctrl-xp copy le path du panneau actif dans la console
  • Ctrl-x Ctrl-p copy le path du panneau inactif dans la console
  • Esc-Tab est l'achèvement automatique

C'est de loin le moyen le plus rapide que j'ai trouvé jusqu'ici – après s'être habitué aux raccourcis.

Pour zsh , je trouve les raccourcis keyboard suivants utiles.

 # Bind alt-m to insert previous word from the current line bindkey '^[m' copy-prev-shell-word # Bind alt-k to kill word before cursor in vi-style bindkey '^[k' vi-backward-kill-word 

J'ai donc appuyé sur AltM pour répéter le dernier argument puis AltK si je veux supprimer des parties de la fin d 'un path.

Voici une reference utile à certains des comportements que vous pouvez mapper.

Utilisez la même chose dans le {,} "duplicateur". C'est à dire:

 git tag -m {v,v}1.0.1 # same as git tag -m v1.0.1 v1.0.1 

J'ai ceci dans mon ~/.inputrc :

 "\ej":"!#:$\e^" 

!# est la ligne courante,: :$ est le dernier mot, et \e^ est history-expand-line .