Como abrir o diretório Nautilus no terminal atual?

12

Eu não gosto de ter dezenas de terminais abertos. Existe uma maneira de adicionar Abrir no Terminal atual em vez de Abrir no Terminal ao usar o Nautilus?

    
por Vitor Abella 03.11.2016 / 18:15

4 respostas

12

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

  1. O script precisa de wmctrl , xdotool e xclip:

    sudo apt-get install wmctrl xdotool xclip
    
  2. 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 comando cd . Como usamos echo para carregar a linha inteira na área de transferência, Return é incluído.

Notas

  1. 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.
  2. 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.
  3. 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

  1. Clique com o botão direito do mouse (qualquer) dentro do diretório (neste caso, minha área de trabalho), como abaixo:

  2. 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.

    
por Jacob Vlijm 03.11.2016 / 21:36
7

Tenho certeza de que não há como fazer isso, mas tenho uma solução alternativa para você que pode ajudar.

Você pode sempre arrastar e soltar um diretório do Nautilus em uma janela de terminal eo Nautilus passará esse diretório e colá-lo na linha de comando, então você pode fazer cd e depois arrastar a pasta para o terminal e teclar enter.

    
por Jorge Castro 03.11.2016 / 18:58
7

A maneira mais simples é esta:

  1. Do nautilus, pressione Ctrl + L , isso abrirá a barra de endereços para edição. Pressione a tecla Ctrl + C
  2. Mude para o terminal e digite cd , espaço e, em seguida, Shift + Insira (ou INS) para colar o caminho. Pressione Enter .

Não há necessidade de scripts ou trabalho extra.

    
por Sergiy Kolodyazhnyy 03.11.2016 / 22:44
1

Na minha opinião, a única maneira elegante de resolver isso sem problemas é usar um multiplexador de terminal como tmux e tenha seu gerenciador de arquivos

  • abre novas janelas de terminal dentro de uma sessão existente ou
  • inicie um novo emulador de terminal com uma nova sessão do tmux.

O script de shell a seguir atinge apenas isso:

#!/bin/sh
set -e
TMUX=tmux
#TERMINAL_EMULATOR='gnome-terminal -x'

cd ""
if $TMUX has-session; then
  exec $TMUX new-window
else
  exec ${TERMINAL_EMULATOR:-x-terminal-emulator -x} $TMUX
fi

TERMINAL_EMULATOR contém o emulador de terminal desejado para novas janelas de terminal (se você não gostar do padrão de x-terminal-emulator ), além de uma opção de linha de comando para o comando executar dentro do emulador.

Você pode registrar o script do manipulador de arquivos como qualquer outra associação de tipo de arquivo no gerenciador de arquivos.

    
por David Foerster 19.11.2016 / 16:49