Como abrir o diretório Nautilus no Terminal atual?


Respostas:


13

Suja ou não, a solução abaixo funcionou perfeitamente nos 30 minutos que a testei com frequência. A solução funciona desde que você possa clicar com o botão direito do mouse em um arquivo (qualquer) dentro do diretório:

1

insira a descrição da imagem aqui

2)

insira a descrição da imagem aqui

3)

insira a descrição da imagem aqui

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. As necessidades de script wmctrl, xdotoole xclip:

    sudo apt-get install wmctrl xdotool xclip
    
  2. Copie o script para um arquivo vazio, salve-o como open_in_terminal(sem extensão) em ~/.local/share/nautilus/scripts. Crie o diretório, se necessário. Tornar o script executável

É isso aí. Efetue logout e logon novamente e você terá o script disponível como na imagem (2).

Explicação

  • Ao clicar 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 eleva a gnome-terminaljanela (encontrada primeiro) e cola o caminho, precedido pelo cdcomando. Desde que costumávamos echocarregar toda a linha na área de transferência, Returnestá 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 do terminal aberta. Caso existam vários, o script seleciona a gnome-terminaljanela mais antiga .
  2. O script precisa ser testado completamente na prática. Enquanto eu rodava, o tempo não era problema nem uma única vez, nem quando o Desktop precisava "viajar" por quatro ou cinco janelas de exibição para chegar à janela do terminal. No entanto, se erros ocorressem, com mais algumas linhas, poderíamos fazê-lo realmente esperar de forma inteligente (er) pela elevação da janela do terminal. Vamos ver o que acontece. Não parece necessário.
  3. Como o script usa o caminho real , também os diretórios vinculados funcionarão corretamente.

Mais informações sobre scripts nautilus aqui .


Como alternativa, escolha sua própria janela do terminal se você tiver vários

Se você quiser escolher em qual janela do terminal 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) arquivo dentro do diretório (neste caso, minha área de trabalho) como abaixo:

    insira a descrição da imagem aqui

  2. Clique em (ou aumente o contrário) na janela do terminal que você gostaria de usar, e ela acessará o diretório:

    insira a descrição da imagem aqui

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 à primeira: em vez de aumentar automaticamente a primeira janela do terminal encontrada, aguarda que a primeira janela do terminal tenha foco. Em seguida , o CD está no diretório dentro dessa janela.


como você está usando o arquivo para iniciar o script de qualquer maneira, basta remover o nome do arquivo do caminho sys.argv [1]. tornará o script muito mais curto #
Sergiy Kolodyazhnyy 03/11

1
@TonyLancer as aparece o menu depois de criar o diretório ~/.local/share/nautilus/scriptsde logout e volta :)
Jacob Vlijm

1
@ Benny, funciona apenas com o botão direito do mouse nautilus.
Jacob Vlijm

1
@ Benny, o ambiente para o script é passado do processo pai. Nesse caso, o Nautilus é o processo pai do script e configura o ambiente para o script. Se você estiver tentando fazer a mesma coisa com o interpretador python ou um script, ele terá um processo pai diferente; portanto, ele retornará Noneporque não existe essa variável (fora do Nautilus).
Sergiy Kolodyazhnyy 3/11

1
@JacobVlijm você é incrível. Funcionando perfeitamente! Agora eu entendi como o segundo script funciona, você está certo sobre o gatilho. É realmente um bom gadget para a comunidade ubuntu. É claro que podemos pensar em muitas melhorias, como em qualquer script, mas essa funciona. Apenas mencione na sua resposta que o segundo script funciona com o Alt Tab.
Vitor Abella

8

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

Você sempre pode arrastar e soltar um diretório do Nautilus em uma janela do terminal e o Nautilus passa esse diretório e colá-lo na linha de comando, para que você possa fazer cde arrastar a pasta para o terminal e pressionar Enter.


8

A maneira mais simples é a seguinte:

  1. No nautilus, pressione Ctrl+L , isso abrirá a barra de endereço para edição. Pressione o botão Ctrl+C
  2. Alterne para o terminal e digite cd, espaço e, em seguida, Shift+Insert (or INS) para colar o caminho. Hit Enter.

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


Eu uso Ctrl + Shift + V para colar o caminho.
Katu

1
Sim, essa é outra maneira de fazer isso. O Linux tem duas pranchetas, na verdade, então Ctrl + Shift + V é para primário e Shift + Insert é para secundário, mas como o segundo requer apenas duas teclas, eu o uso principalmente. Eles são compartilhados, a menos que você destacar algo - que é quando o material entra na área de transferência secundário
Sergiy Kolodyazhnyy

1

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

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

O seguinte script de shell alcança exatamente isso:

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

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

TERMINAL_EMULATOR mantém o emulador de terminal desejado para novas janelas de terminal (se você não gostar do padrão de qualquer x-terminal-emulator ponto), mais 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 seu gerenciador de arquivos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.