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

23

Je tapais juste quelque chose dans le sens de:

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

et soudain réalisé, putain, je dois taper à nouveau de grandes parties de ce paramètre

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

Même avec la tabulation terminée, une grande douleur. Je sais que je peux copier-coller le paramètre en sélectionnant le texte et le clic intermédiaire avec la souris, mais ce n'est pas suffisant. Je veux rester sur le clavier.

Existe-t-il un moyen de copier-coller le paramètre actuel de la ligne à l'aide du clavier?

k0pernikus
la source
3
Mon conseil ne répond pas à votre question, mais est un petit conseil. Comme dans votre exemple, vous pouvez utiliser la construction suivante: mv foo/bar/poit/zoid/{narf.txt,troz.txt}au lieu de taper / copypasting l'adresse longue deux fois.
rush
2
Un peu plus courte que la solution de @ Rush: mv foo/bar/poit/zoid/{narf,troz}.txt. Cela fonctionne particulièrement bien si nous avons quelque chose comme.../zoid/this_source_file_has_to_be_patched.c{,.orig}
Ansgar Esztermann
@Rush Ça vous dérange de le signaler comme réponse? Ce n'est peut-être pas directement ce que j'ai demandé, mais là encore, votre solution est bien plus que ce que je veux. Il mérite un signe d'acceptation.
k0pernikus

Réponses:

15

Si j'ai planifié à l'avance, j'utilise l' expansion d'accolade . Dans ce cas:

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

Voici une autre approche utilisant les readlineraccourcis clavier par défaut :

  • mv foo/bar/poit/soid/narf.txt: début
  • Ctrl- w: unix-word-ruboutpour supprimerfoo/bar/poit/soid/narf.txt
  • Ctrl- y, Space, Ctrl- y: yank, l' espace, à yanknouveau pour obtenirmv foo/bar/poit/soid/narf.txt foo/bar/poit/soid/narf.txt
  • Meta- backspace, Meta- backspace: backward-kill-worddeux fois pour supprimer le derniernarf.txt
  • troz.txt: tapez la partie de la queue qui est différente

Si vous passez du temps non trivial à utiliser le bashshell, je vous recommande de lire régulièrement une liste des raccourcis par défaut et d'en choisir quelques-uns qui semblent utiles à apprendre et à intégrer dans votre routine. Le chapitre 8 du bashmanuel est un bon point de départ. Connaître les raccourcis peut vraiment augmenter votre efficacité.

jw013
la source
Soigné! Dans mon cas, j'ai dû appuyer sur Alt + Backspace au lieu de Meta + Backspace.
k0pernikus
3
@ k0pernikus Oui sur la plupart des claviers, la touche Alt est la touche Meta.
jw013
1
Pour enregistrer le retapage .txt, vous pouvez appuyer sur Ctrl + Gauche (ou sur tout autre raccourci appelant backward-word), sur Gauche un caractère, puis sur Alt + Retour arrière et taper troz.
wjandrea
24

L'expansion de l'historique fonctionne également sur la commande actuelle, à l'aide de l'indicateur d'événement !#. Combinez cela avec le mot désignateur pour le dernier argument - $- pour obtenir le paramètre que vous venez de taper. Et vous pouvez utiliser tous les modificateurs habituels dessus, donc si, par exemple, vous renommez un fichier dans un répertoire éloigné, vous pouvez simplement taper:

mv path/you/do/not/want/to/type/twice/oldname !#$:h/newname
qwertyboy
la source
Très utile! Cela fonctionne particulièrement bien avec l' magic-spaceoption de bash dans inputrc pour étendre automatiquement les extensions d'historique. (Je n'ai pas pu utiliser la réponse la plus votée parce que j'ai réglé ^ W pour casser les barres obliques car c'est généralement plus utile.)
Soren Bjornstad
@SorenBjornstad alt+backspaces'arrête généralement déjà aux délimiteurs de mots comme les barres obliques, vous n'avez donc pas besoin de changer la façon ^Wd'obtenir cette fonctionnalité, vous pouvez avoir à la fois supprimer les mots sans caractère de mot ou les mots délimités par des espaces
Eric Renouf
14

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

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 cela, taper / copypasting une longue adresse deux fois.

se ruer
la source
2
C'est ce qu'on appelle l' expansion de l'accolade .
CodeGnome
6

En jouant, j'ai réussi à travailler:

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

Appuyez sur Enter
pour stocker le dernier paramètre.

Maintenant, utilisez pour obtenir la dernière saisie en ligne. Entrez un espace et pour obtenir le dernier paramètre utilisé, utilisez:

Alt + .

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

k0pernikus
la source
Cool, un autre bon conseil appris!
Bram
<kbd> Esc </kbd> + <kbd>. </kbd> est-ce la même chose que <kbd> Alt </kbd> + <kbd>. </kbd>.
Nikos Alexandris
2

Vous pouvez facilement utiliser des variables:

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

Ou en vous cas (note de la concurrence onglet fonctionne pour la une partie):

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

J'ai ceci dans mon ~/.inputrc:

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

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

nisetama
la source
cela devrait être marqué comme la réponse. Appuyer sur 'alt / option + j' copie maintenant le dernier mot.
mpprdev
2

Pour zsh, je trouve les raccourcis clavier 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 frappé Alt- Mpour répéter le dernier argument alors Alt- Ksi je veux supprimer des parties à la fin d'un chemin.

Voici une référence utile à certains des comportements que vous pouvez mapper.

bdellaterra
la source
2

Une courte solution interactive en deux étapes

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

    Cela rend foo/bar/poit/zoid/narf.txtdisponible le raccourci Alt- .dans bash.

  2. tapez: mvet frappé Alt- ., Space, Alt-.

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

Commandant de minuit

Cet outil qui peut être (très) pratique est un gestionnaire de fichiers fonctionnant dans la console. Il vous donne la possibilité de copier les noms de fichiers et les chemins de répertoire de manière interactive dans la ligne de commande. Midnight Commander vous montre donc 2 panneaux (gauche et droite), qui listent le contenu de différents répertoires.

Un petit guide:

  • Up/ Les Downtouches fléchées sélectionnent les fichiers dans le panneau actuel.
  • Tab bascule entre le panneau gauche et le panneau droit.
  • Ctrl- Shift- Entercopie le fichier actuellement sélectionné sur la ligne de commande (y compris le chemin complet)
  • Alt- oouvre le répertoire actuellement sélectionné dans l'autre panneau
  • Ctrl- ovous permet de voir la console en plein écran
  • Ctrl- x, pcopie le chemin du panneau actif dans la console
  • Ctrl- x, Ctrl- pcopie le chemin du panneau inactif dans la console
  • Esc- Tabest l'achèvement automatique

C'est de loin le moyen le plus rapide que j'ai trouvé jusqu'à présent - après m'être habitué aux raccourcis.

Markus Dutschke
la source
0

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
Pylinux
la source