web-dev-qa-db-fra.com

Existe-t-il un moyen de refléter les changements de répertoire dans Terminator?

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!

3
Kasisnu

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:

enter image description here

... 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 ...

Solution

É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).

enter image description here

É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.

enter image description here

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,

  1. Nous traduisons la commande en Python
  2. Nous utilisons xdotool pour simuler le pressage Ctrl+Insert
  3. Nous utilisons xdotool pour simuler la saisie de la commande traduite
  4. Nous utilisons xdotool pour simuler le pressage Return
  5. Nous utilisons xdotool pour simuler le pressage Ctrl+Delete

De 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:

enter image description here

Ç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:

  1. Assignez les deux tampons au même groupe dans Terminator
  2. import os Dans votre Python

C'est tout.

Dépannage

Ce n'est pas parfait. Il y a quelques problèmes mineurs:

  1. 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+ACtrl+K) à partir du tampon Bash ou autre.

  2. 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.

  3. 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!

11
Malte Skoruppa