Je suis sur Ubuntu 12.04 et j'utilise Terminator comme terminal principal. Je l'aime parce qu'il me permet de garder un python et un terminal bash ouverts en même temps, dans la même vue.
Ce qui est ennuyeux, c'est que je finis par me déplacer entre les répertoires BEAUCOUP, puis je dois le faire deux fois. Existe-t-il un moyen de mettre en place une configuration de terminaison pour ce faire? Pour que le répertoire miroir du terminateur change.
Je suppose que je ne suis pas le seul à trouver ça frustrant!
D'accord. Si je comprends bien, vous avez essentiellement une fenêtre Terminator dans une vue fractionnée, où l'un tampon est un shell Bash et l'autre est un interpréteur Python. Maintenant, chaque fois que vous tapez une commande comme cd Pictures/
dans le tampon Bash, vous souhaitez envoyer automatiquement la commande os.chdir("Pictures/")
au tampon Python, afin qu'elle change de répertoire en même temps que votre Bash Shell. Un peu comme dans cette image:
... où la commande os.chdir
dans le tampon Python doit être entrée automatiquement lorsque vous tapez une commande cd
dans le tampon Bash. N'est-ce pas? Si oui, voici un ...
Étape 1: affectez les deux tampons au même groupe
Terminator prend en charge des groupes de fenêtres. Nous assignerons ces deux tampons au même groupe, afin d'utiliser plus tard la fonction de Terminator de diffusion des commandes aux fenêtres du même groupe. Dans cet exemple, j'attribuerai les deux tampons à un groupe nommé Tau (le nom réel n'a pas d'importance, mais assurez-vous qu'il est le même pour les deux tampons).
Étape 2: définir des raccourcis clavier pour activer et désactiver la diffusion de groupe
Par défaut, Terminator n'a pas de raccourcis clavier pour ceux-ci, mais nous en avons besoin maintenant, nous les définirons donc via le menu Préférences de Terminator. j'ai utilisé Ctrl+Insert pour activer la diffusion de groupe, et Ctrl+Delete pour l'éteindre. Vous pouvez choisir tous les autres raccourcis clavier que vous aimez, mais vous devrez adapter l'étape 3 de manière appropriée.
Maintenant, vous pouvez appuyer sur Ctrl+Insert, et tout ce que vous tapez dans un tampon apparaîtra dans l'autre tampon. En tappant Ctrl+Delete vous désactivez à nouveau ce comportement.
Si l'interprète Python comprenait une commande telle que cd Pictures/
, Pour changer un répertoire dans les deux tampons, tout ce que vous auriez à faire maintenant serait quelque chose comme Ctrl+Insertcd Pictures/
Ctrl+Delete, pour diffuser la commande telle quelle. Mais l'interpréteur normal Python ne comprend pas cette commande cd
. Vous pouvez utiliser IPython , qui le comprend, au lieu du pur Python interprète. Cependant, je suppose que (1) vous voulez le pur Python interprète et (2) vous ne voulez pas avoir à vous rappeler d'avoir appuyé sur ces combinaisons de touches avant et après chaque commande cd
. Passons donc à l'étape 3.
Étape 3: Traduire et envoyer automatiquement la commande cd
au tampon Python
Nous allons renommer la commande intégrée cd
de Bash pour en faire un peu plus avant de changer réellement le répertoire de travail dans le shell actuel. A savoir, chaque fois qu'un utilisateur tape cd somewhere
,
xdotool
pour simuler le pressage Ctrl+Insertxdotool
pour simuler la saisie de la commande traduitexdotool
pour simuler le pressage Returnxdotool
pour simuler le pressage Ctrl+DeleteDe cette façon, la commande traduite sera envoyée au tampon Python. Si vous ne l'avez pas, installez xdotool
:
Sudo apt-get install xdotool
Le script que nous voulons comme alias pour cd
ressemblera à ceci:
function cd_to_pybuf {
xdotool type "#"
xdotool key Ctrl+Insert
xdotool type "os.chdir(\"$1\")"
xdotool key Return
xdotool key Ctrl+Delete
cd "$1"
}
cd_to_pybuf
Explication: Lorsque nous alias cd
vers le script ci-dessus, puis chaque fois que nous tapons cd somewhere
, Bash le traduit en OURSCRIPT somewhere
. Puisque notre script se termine par l'appel de fonction cd_to_pybuf
, Il appellera en fait la fonction cd_to_pybuf
Avec somewhere
comme argument (disponible sous la forme $1
Dans la fonction; note cette expansion bash ne fonctionnerait pas ici, donc nous ne pouvons pas utiliser quelque chose comme !*
pour obtenir les arguments de la commande d'origine, et $BASH_COMMAND
est également problématique ) . Cette fonction exécute exactement les étapes énumérées ci-dessus. Sur un sidenote, nous simulons également la frappe #
Avant de simuler la pression Ctrl+Insert, car tout ce que nous tapons après apparaîtra dans les tampons les deux, et Bash ne comprend pas la commande os.chdir
, donc avec ce signe #
nous en faisons un commentaire pour Bash. Après le xdotool
, nous exécutons également la commande cd
réelle dans le tampon Bash.
Alors maintenant, nous re-alias cd
pour ce script, et le testons:
Ça marche! Cette commande os.chdir("..")
dans le tampon Python a été tapée automatiquement. Je ne l'ai pas fait. Tout ce que j'ai fait, c'est taper cd ..
Dans le tampon Bash. Vous peut voir que la commande #os.chdir("..")
a également été automatiquement tapée dans le tampon Bash, mais comme c'est un commentaire, elle n'a pas eu d'effet réel.
Pour rendre ce changement permanent, mettez cet alias dans ~/.bashrc
, C'est-à-dire que dans votre ~/.bashrc
Ajoutez la ligne:
alias cd='function cd_to_pybuf { xdotool type "#"; xdotool key Ctrl+Insert; xdotool type "os.chdir(\"$1\")"; xdotool key Return; xdotool key Ctrl+Delete; cd "$1"; }; cd_to_pybuf'
Et voilà! C'était ça.
Bonus: un alias pour pwd
Parfois, vous souhaiterez peut-être vérifier le répertoire de travail actuel dans les deux tampons à la fois. Nous pouvons utiliser la même technique que pour cd
et ré-alias pwd
. La commande suivante fera l'affaire, et vous pouvez également la mettre dans votre ~/.bashrc
Si vous le souhaitez:
alias pwd='function pwd_to_pybuf { xdotool type "#"; xdotool key Ctrl+Insert; xdotool type "os.getcwd()"; xdotool key Return; xdotool key Ctrl+Delete; pwd; }; pwd_to_pybuf'
Ce dont vous devrez vous souvenir
Pour que cela fonctionne à l'avenir, chaque fois que vous ouvrirez une vue fractionnée avec un Bash et un tampon Python, vous devrez faire deux choses:
import os
Dans votre PythonC'est tout.
Dépannage
Ce n'est pas parfait. Il y a quelques problèmes mineurs:
C'est un peu moche que ce truc #os.chdir
Soit également imprimé dans le tampon Bash. C'est vraiment cosmétique, mais vous pourriez envisager de faire quelque chose de différent, par exemple, après avoir simulé la saisie de la commande et avant de simuler la pression Return, désactivez temporairement la diffusion et supprimez cette commande (par exemple, simulez un grand nombre d'espaces arrière ou la séquence Ctrl+A, Ctrl+K) à partir du tampon Bash ou autre.
Certains arguments spéciaux pour cd
ne fonctionneront pas. Des choses comme cd -
(Changer en $OLDPWD
), cd ~
(Changer en $HOME
), Ou cd
(sans arguments, changer aussi en $HOME
). Ici aussi, le script pourrait être amélioré pour tenir compte de ces cas spéciaux (vérifiez si $1
Est spécial et traduisez de manière appropriée). De telles choses devraient être un morceau de gâteau à partir d'ici, cependant.
Les paramètres facultatifs de cd
, tels que, par exemple, cd -P somewhere
, Ne fonctionneront pas car la traduction serait os.chdir("-P")
ici. Vous pouvez utiliser $@
Au lieu de $1
Pour consulter tous les arguments, puis faire la chose appropriée.
J'espère que je pourrais vous aider :) C'était un défi intéressant!