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
exdotool
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 comgedit
+ 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: