Sujo ou não, a solução abaixo funcionou perfeitamente nos 30 minutos que testei com frequência. A solução funciona contanto que você possa clicar com o botão direito do mouse em um arquivo (qualquer) dentro do diretório:
1.
2.
3.
Script Nautilus
#!/usr/bin/env python3
import subprocess
import os
import time
def replace(path):
for c in [("%23", "#"), ("%5D", "]"), ("%5E", "^"),
("file://", ""), ("%20", " ")]:
path = path.replace(c[0], c[1])
return path
def get(command):
try:
return subprocess.check_output(command).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
t = get(["pgrep", "gnome-terminal"])
if t:
w = [l.split()[0] for l in get(["wmctrl", "-lp"]).splitlines() if t in l][0]
# get the current path
current = replace(os.getenv("NAUTILUS_SCRIPT_CURRENT_URI"))
dr = os.path.realpath(current)
# raise the found terminal window
subprocess.call(["wmctrl", "-ia", w])
time.sleep(0.3)
# copy the cd command to clipboard
c1 = "printf 'cd ' | xclip -in -selection c"
c2 = 'echo "'+"'"+dr+"'"+'" | xclip -in -selection c'
# paste & run it
for c in [c1, c2]:
subprocess.call(["/bin/bash", "-c", c])
subprocess.call(["xdotool", "key", "Control_L+Shift+v"])
time.sleep(0.05)
Como usar
-
O script precisa de
wmctrl
,xdotool
e xclip:sudo apt-get install wmctrl xdotool xclip
-
Copie o script em um arquivo vazio, salve-o como
open_in_terminal
(sem extensão) em~/.local/share/nautilus/scripts
. Crie o diretório, se necessário. Torne o script executável
É isso. Saia e volte e você terá o script disponível como na imagem (2).
Explicação
- Clicando com o botão direito do mouse em um arquivo, podemos obter o caminho usando o nautilus '
"NAUTILUS_SCRIPT_CURRENT_URI"
. - Em um script, podemos carregar esse caminho na área de transferência (usando
xclip
) - Posteriormente, o script gera a janela
gnome-terminal
(primeiro encontrado) e o caminho pastas , precedido pelo comandocd
. Como usamosecho
para carregar a linha inteira na área de transferência, Return é incluído.
Notas
- Deve ficar claro que não deve haver nada em execução no terminal e funciona melhor se houver apenas uma janela de terminal aberta. Caso haja vários, o script seleciona a janela
gnome-terminal
mais antiga. - O script precisa ser testado exaustivamente na prática. Enquanto eu corria, o tempo não era problema nem mesmo uma vez, nem mesmo quando o Desktop tinha que "viajar" por quatro ou cinco viewports para chegar à janela do terminal. Os erros IF ocorreriam no entanto, com algumas linhas a mais poderíamos fazer com que espere de forma inteligente para que a janela do terminal seja levantada. Vamos ver o que acontece. Não parece necessário.
- Como o script usa o caminho real , os diretórios também vinculados funcionarão corretamente.
Mais informações sobre scripts do nautilus aqui .
Como alternativa, escolha sua própria janela de terminal se tiver vários
Se você quiser escolher em qual janela de terminal você abriria o diretório atual (nautilus), use o script abaixo.
Como funciona na prática
-
Clique com o botão direito do mouse (qualquer) dentro do diretório (neste caso, minha área de trabalho), como abaixo:
-
Clique em (ou aumente de outra forma) a janela do terminal que você gostaria de usar, e ele irá cd para o diretório:
O script
#!/usr/bin/env python3
import subprocess
import os
import time
def replace(path):
for c in [("%23", "#"), ("%5D", "]"), ("%5E", "^"),
("file://", ""), ("%20", " ")]:
path = path.replace(c[0], c[1])
return path
def get(command):
try:
return subprocess.check_output(command).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
# check if gnome-terminal runs
pid = get(["pgrep", "gnome-terminal"])
if pid:
t = 0
while t < 30:
# see if the frontmost window is a terminam window
active = get(["xdotool", "getactivewindow"])
if pid in get(["xprop", "-id", active]):
# get the current path
current = replace(os.getenv("NAUTILUS_SCRIPT_CURRENT_URI"))
dr = os.path.realpath(current)
# copy the cd command to clipboard
c1 = "printf 'cd ' | xclip -in -selection c"
c2 = 'echo "'+"'"+dr+"'"+'" | xclip -in -selection c'
# paste & run it
for c in [c1, c2]:
subprocess.call(["/bin/bash", "-c", c])
subprocess.call(["xdotool", "key", "Control_L+Shift+v"])
time.sleep(0.05)
break
else:
t += 1
time.sleep(0.5)
Configuração
É exatamente como o primeiro script.
Explicação
O script tem uma diferença em relação ao primeiro: em vez de levantar automaticamente a primeira janela de terminal encontrada, ele aguarda que a primeira janela de terminal tenha foco. Então cd's para o diretório dentro daquela janela.