Como abrir o diretório Nautilus no Terminal atual?

13

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?

Vitor Abella
fonte
Apenas soluções sujas, tanto quanto eu posso imaginar. Eu posso dar um se você está bem com isso ...
Jacob Vlijm

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.

Jacob Vlijm
fonte
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.

Jorge Castro
fonte
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.

Sergiy Kolodyazhnyy
fonte
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.

David Foerster
fonte