Posso fazer o cd do terminal incorporado do gedit automaticamente no diretório do arquivo atual?

0

Como fazer o próprio terminal gedit mudar o diretório para o local do arquivo que está aberto atualmente no gedit? Como por padrão eu tenho que cd até chegar a apresentar a localização do arquivo no meu terminal gedit-embedded. Eu sei que não há maneira direta de fazer isso. Mas se algum caminho longo também for possível, eu realmente quero que o próprio terminal embutido faça um diretório de mudanças dinâmicas conforme o arquivo atualmente aberto em qualquer aba atual que esteja aberta no gedit.

    
por SUMIT KUMAR SINGH 20.12.2014 / 14:19

1 resposta

1

Para minha própria surpresa, isso pode ser feito. Nos 45 minutos que testei, funcionou muito bem e não falhou comigo uma vez.

No entanto, deve ser considerada uma opção experimental, uma vez que é feito completamente "de fora", por assim dizer, com a ajuda de xprop , wmctrl e xdotool . Para usá-lo, você terá que aceitar algumas peculiaridades: ele funciona bem, desde que você tenha todos os arquivos com guias em uma janela, e o clique do mouse, para selecionar as guias, seja um clique real : se você "segurar" o clique, a guia é aberta em uma nova janela.

Você também deve estar ciente do fato de que as diferentes guias gedit (arquivos) compartilham uma janela de terminal integrada. Isso significa que o comando cd será executado na troca de guias, independentemente do que possa estar em execução no terminal.

Ao todo, você terá que ver se ele funciona de forma estável na sua situação e se ele se comporta bem na maneira como você o usa.

Como funciona

O principal truque é baseado no fato de que o gedit por padrão possui o diretório do arquivo em seu nome de janela. Isso é usado para extrair o diretório alvo, e configurá-lo, se ele mudar (clicando em outra aba da janela do gedit).

Um script, executado em segundo plano, verifica:

  • se o gedit é executado (em tudo)
  • se assim for, verifica se a janela do frontmost é uma janela do gedit
  • se for esse o caso, ele verifica se o diretório do arquivo mais atual é diferente da última verificação, portanto, outra guia deve ter sido clicada (desde 1 segundo atrás). Isso também evita ações cd desnecessárias se duas guias funcionarem no mesmo diretório (ou seja: se todos os arquivos forem tabulados em uma janela).

Então, se uma ação cd for necessária, o script move o mouse para o meio da janela gedit (x-wise), 70 px da parte inferior da janela ( y-wise), que definitivamente estará na seção de terminal da janela. Em seguida, clica, digita o comando cd + Enter . Você dificilmente notará, desde que o mouse seja movido de volta para sua posição original. Você precisará dar um tempo (aproximadamente 0,5 segundo) para executar o cd antes de continuar a trabalhar, mas, novamente, você provavelmente não notará o atraso.

Como usar

  • Se ainda não estiver no seu sistema, instale wmctrl e xdotool primeiro:

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
  • Copie o script abaixo em um arquivo vazio, salve-o como set_directory.py

  • Execute-o pelo comando:

    python3 /path/to/set_directory.py
    
  • Sugiro que você o execute a partir de uma janela (minimizada) gnome-terminal enquanto estiver trabalhando com gedit + terminal integrado; tê-lo funcionando permanentemente parece um pouco exagerado para uma tarefa tão específica.

O 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)

Definir automaticamente o diretório de trabalho para o arquivo mais atual da frente :

cdnatrocadeguias

O menu cd embutido do terminal gedit

Uma alternativa, quase com o mesmo conforto, poderia ser o terminal de gedit construído em função. Leva apenas dois cliques do mouse (um à direita, um à esquerda):

  • Clique com o botão direito do mouse com o mouse na janela do terminal
  • Escolha "Alterar Diretório" e a janela do terminal irá salvar no diretório do arquivo mais atual:

por Jacob Vlijm 20.12.2014 / 17:59