En bash, comment puis-je lier une touche de fonction pour une commande?
Exemple: je veux lier l' F12 pour la commande echo "foobar"
de telle façon que chaque fois que j'ai frappé F12 le message "foobar" sera imprimé à l'écran. Idéalement, il pourrait être n'importe quelle commande du shell, et pas seulement les builtins. Comment aller à ce sujet?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez déterminer la séquence de caractères émis par une touche en appuyant sur la touche Ctrl-v à la ligne de commande, puis en appuyant sur la touche qui vous intéresse. Sur mon système pour F12, j'obtiens
^[[24~
. Le^[
représente Esc. Différents types de terminaux ou des émulateurs de terminal peut émettre des codes différents pour la même clé.À l'invite Bash, vous pouvez entrer une commande comme celle-ci pour activer la macro de clavier de sorte que vous pouvez l'essayer.
Maintenant, lorsque vous appuyez sur la touche F12, vous obtiendrez "foobar" sur la ligne de commande prêt pour la suite de l'édition. Si vous voulez une touche pour entrer une commande immédiatement, vous pouvez ajouter un saut de ligne:
Maintenant, lorsque vous appuyez sur la touche F12, vous obtiendrez le répertoire courant affiche sans avoir à appuyer sur Entrée. Que faire si vous avez déjà tapé quelque chose sur la ligne et que vous utilisez ce qui l'exécute automatiquement? Il pourrait être gênant. Cependant, vous pouvez effacer la ligne dans le cadre de votre macro:
L'espace permet de s'assurer que l' Ctrl-u a quelque chose à supprimer pour garder la cloche de sonner.
Une fois que vous avez obtenu la macro fonctionne comme vous le souhaitez, vous pouvez vous rendre persistante en l'ajoutant à votre
~/.inputrc
fichier. Il n'y a pas besoin de labind
de commande ou à l'extérieur des guillemets simples:Edit:
Vous pouvez également créer un raccourci clavier qui va exécuter quelque chose sans perturber la ligne de commande.
Puis, pendant que vous êtes en train de saisir une commande qui nécessite un nom d'utilisateur, par exemple, et vous avez besoin de connaître le nom de l'utilisateur ayant ouvert une session, vous pouvez appuyer sur Alt-Maj-W et la sortie de
who
apparaît et l'invite à ré-émis avec votre commande partielle intacte et que le curseur est dans la même position dans la ligne.Malheureusement, cela ne fonctionne pas correctement pour les clés tels que F12 les sorties de plus de deux caractères. Dans certains cas, cela peut être contourné.
La commande (
who
dans ce cas) peut être n'importe quel fichier exécutable (un programme, un script ou une fonction.~/.inputrc
:"\C-q": menu-complete
). Vous pouvez aussi avoir besoinstty -ixon
dans votre~/.bashrc
pour désactiver le contrôle de flux et de faire ^S et ^Q disponible.^[
représenteesc
et puis vous semblez le substituer par\e
dans votre exemple. Pourriez-vous expliquer pourquoi s'il vous plaît?^[
est la sortie de la représentation. Le\e
est un moyen d'y entrer (^[
ne fonctionne pas pour ça).^C
ed et lepwd
commande est exécutée. De cette façon, alors que la partielle de commande est pas est exécutée, elle reste sur l'écran (pour ma référence). Je peux le faire manuellement, mais je veux le faire comme lier de sortie pour la touche F12.~/.inputrc
pas~/inputrc
. Après avoir vu la réponse que j'ai créé le fichier sans le.
et je me demandais pourquoi ça ne marche pas.bind '"^[[24~":"\C-apwd #\n"'
. Cela insèrepwd
et d'un espace et d'un caractère de commentaire au début de la ligne qui change partiellement votre commande tapée dans un commentaire. De même,bind '"^[[24~":"\e#pwd\n"'
ce qui rend la partie commande tapée un commentaire sur sa propre ligne et lapwd
exécuté à une invite de commandes de son propre. Si vous vous demandez ce que d'une question distincte et comprennent ce que vous essayez d'accomplir, je peux poster un exemple qui vous permettra de faire lepwd
sans...bind -x '"\e[24~":"who"'
travaillé avec pas de difficulté ou de la modification. (Readline 6.3, bash 4.3.11(1).)Vous pouvez définir bash raccourcis clavier dans l' .inputrc (fichier de configuration de la bibliothèque GNU Readline). La syntaxe est
<keysym ou le nom de la clé>: macro
par exemple:
allons créer une macro qui insère "> output" lorsque vous appuyez sur la touche ContrôleO
allons créer une macro qui insère un "echo toto" lorsque vous appuyez sur la touche F1... je ne sais pas ce que le keysym pour F11 est éteint à la main.
Edit:
.inputrc
comprend la\n
séquence d'échappement pour les saut de ligne, de sorte que vous pouvez utiliserQui va bien "appuyez sur enter" après que la commande est émise.
Alt
, utilisez\e
, par exemple"\eo": "> output"
..inputrc
voir hackaday.com/2018/01/19/linux-fu-custom-bash-command-completionCette solution est spécifique à X11 environnements et n'a rien à voir avec bash, mais en ajoutant les lignes suivantes à votre .Xmodmaps
va envoyer la chaîne "toto" à la borne au moment de frapper la touche F12.
Je voulais lier
Ctrl+B
à une commande. Inspiré par une réponse ci-dessus, j'ai essayé d'utiliserbind
mais ne pouvait pas comprendre ce que la série de cryptic tildes (\e[24~
?) traduireCtrl+B
.Sur un Mac, allez dans les Paramètres de l'application Terminal, les Profils -> Clavier ->
+
puis appuyez sur le raccourci clavier que vous êtes après, et il vient de sortir. Pour moiCtrl+B
entraîné\002
qui j'ai lié avec succès à commandebind '"\002":"echo command"'
Aussi, si vous souhaitez que la commande soit exécutée tout de suite (et pas seulement inséré dans l'invite de commande), vous pouvez ajouter l'Entrée à la fin de votre commande, comme suit:
bind '"\002":"echo command\015"'