Comment faire pour que le terminal de gedit change lui-même de répertoire vers l'emplacement du fichier qui est actuellement ouvert dans gedit ? Je ne sais pas si c'est le cas, car par défaut je dois faire cd jusqu'à ce que j'arrive à l'emplacement du fichier actuel dans mon terminal gedit-embedded. Je sais qu'il n'y a pas de moyen direct de le faire. Mais si un moyen plus long est possible, je veux vraiment que le terminal intégré lui-même change dynamiquement de répertoire en fonction du fichier actuellement ouvert dans n'importe quel onglet courant ouvert dans gedit.
Réponse
Trop de publicités?À ma grande surprise, c'est possible. Pendant les 45 minutes où je l'ai testé, il a très bien fonctionné et ne m'a pas fait défaut une seule fois.
Néanmoins, elle doit être considérée comme une option expérimentale, puisqu'elle est réalisée entièrement "de l'extérieur", pour ainsi dire, avec l'aide de xprop
, wmctrl
y xdotool
. Pour l'utiliser, vous devrez accepter quelques particularités : il fonctionne bien tant que vous avez tous les fichiers sous forme d'onglets dans une seule fenêtre, et votre clic de souris, pour sélectionner les onglets, doit être un réel clic : si vous maintenez le clic enfoncé, l'onglet s'ouvre dans une nouvelle fenêtre.
Vous devez également savoir que les différentes gedit
(fichiers) partagent une fenêtre de terminal intégrée. Cela signifie que l'onglet cd
sera exécutée sur le commutateur tab, indépendamment de ce qui est en cours d'exécution dans le terminal.
Dans l'ensemble, vous devrez voir s'il fonctionne de manière suffisamment stable dans votre situation et s'il se comporte bien dans la manière dont vous l'utilisez.
Comment cela fonctionne-t-il ?
L'astuce principale est basée sur le fait que gedit a par défaut le répertoire du fichier dans le nom de sa fenêtre. Cela permet d'extraire le répertoire ciblé, et de le définir, s'il change (en cliquant sur un autre onglet de la fenêtre gedit).
Un script, fonctionnant en arrière-plan, vérifie :
- si gedit fonctionne (tout court)
- Si c'est le cas, il vérifie si la fenêtre la plus en avant est une fenêtre gedit
- si c'est le cas, il vérifie si le répertoire du fichier le plus à l'avant est différent de la dernière vérification, donc un autre onglet doit avoir été cliqué (depuis 1 seconde). Cela permet également d'éviter les
cd
actions si deux onglets fonctionnent dans le même répertoire (c'est-à-dire : si tous les fichiers sont mis en onglet dans une seule fenêtre).
Ensuite, si a cd
est nécessaire, le script déplace la souris au milieu de l'écran. gedit
de la fenêtre (dans le sens x), à 70 px du bas de la fenêtre (dans le sens y), qui se trouvera certainement dans la partie terminale de la fenêtre. Ensuite, il clique, tape la touche cd
commande + Enter . Vous le remarquerez à peine, puisque la souris est ramenée à sa position d'origine. Vous devez lui laisser le temps (environ 0,5 seconde) d'effectuer l'opération. cd
avant de continuer à travailler, mais là encore, vous ne remarquerez probablement pas du tout le retard.
Comment l'utiliser
-
Si ce n'est pas encore le cas, installez
wmctrl
yxdotool
d'abord :sudo apt-get install wmctrl sudo apt-get install xdotool
-
Copiez le script ci-dessous dans un fichier vide, sauvegardez-le sous le nom de
set_directory.py
-
Exécutez-le par la commande :
python3 /path/to/set_directory.py
-
Je vous suggère de l'exécuter à partir d'une fenêtre (réduite).
gnome-terminal
pendant que vous travaillez avecgedit
+ terminal intégré ; le faire fonctionner en permanence semble un peu exagéré pour une tâche aussi spécifique.
Le script
#!/usr/bin/env python3
import os
import subprocess
import socket
import time
home = os.environ["HOME"]
last_dr = ""
def get(cmd):
try:
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8").strip()
except:
return ""
def execute(cmd):
subprocess.call(["/bin/bash", "-c", cmd])
def get_windowid():
cmd = "xprop -root"
frontmost = [l for l in get(cmd).splitlines() if "ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
return frontmost[:2]+"0"+frontmost[2:]
def get_dirfromname(name):
dr = name[name.find("(")+1:name.find(")")].replace(" ", "\\ ")
if "~" in dr:
dr = dr[dr.find("~"):]
if os.path.exists(dr.replace("~", home+"/")):
return dr
else:
return None
def cd(coords, dr):
currmouse = get("xdotool getmouselocation").split()[:2]
currcoords = (" ").join([it.split(":")[-1] for it in currmouse])
x_set = str(int((int(coords[0])+int(coords[2])/2)))
y_set = str(int(int(coords[1])+int(coords[3])-70))
execute("xdotool mousemove "+x_set+" "+y_set+"&&xdotool click 1")
execute("xdotool type 'cd "+dr+"'"+"&&xdotool key KP_Enter")
execute("xdotool mousemove "+currcoords)
def update_directory():
global last_dr
try:
pid = get("pidof gedit")
except subprocess.CalledProcessError:
pass
else:
wid = get_windowid()
wdata = get("wmctrl -lpG")
wdata = [l for l in wdata.splitlines() if pid in l and wid in l] if len(wdata) != 0 else []
if len(wdata) != 0:
wdata = wdata[0]; coords = wdata.split()[3:7]
wname = wdata.split(socket.gethostname()+" ")[-1]
dr = get_dirfromname(wname)
if dr != None and dr != last_dr:
time.sleep(1)
cd(coords, dr)
last_dr = dr
while True:
update_directory()
time.sleep(1)
Définit automatiquement le répertoire de travail sur le fichier le plus en avant. :
cd sur l'interrupteur à languette
Le menu cd intégré au terminal gedit
Une alternative, presque avec le même confort, pourrait être la fonction intégrée au terminal gedit. Il suffit de deux clics de souris (un à droite - un à gauche) :
- Cliquer avec le bouton droit de la souris dans la fenêtre du terminal
-
Choisissez "Changer de répertoire" et la fenêtre du terminal va se déplacer vers le répertoire du fichier le plus ancien :