1 votes

Puis-je faire en sorte que le terminal intégré à gedit se rende automatiquement dans le répertoire du fichier courant ?

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.

2voto

Jacob Vlijm Points 78990

À 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 y xdotool 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 avec gedit + 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. :

enter image description here

cd sur l'interrupteur à languette

enter image description here

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 :

    enter image description here

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X