Jak otworzyć katalog Nautilus w bieżącym terminalu?

13

Nie lubię otwierać dziesiątek terminali. Czy istnieje sposób, aby dodać opcję Otwórz w bieżącym terminalu zamiast opcji Otwórz w terminalu podczas korzystania z Nautilus?

Vitor Abella
źródło
Tylko brudne rozwiązania, o ile mogę sobie wyobrazić. Mogę dać jeden, jeśli nie masz
nic przeciwko

Odpowiedzi:

13

Brudne czy nie, poniższe rozwiązanie działało idealnie w ciągu 30 minut, które często testowałem. Rozwiązanie działa, o ile można kliknąć prawym przyciskiem myszy plik (dowolny) w katalogu:

1.

wprowadź opis zdjęcia tutaj

2)

wprowadź opis zdjęcia tutaj

3)

wprowadź opis zdjęcia tutaj

Skrypt 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)

Jak używać

  1. Potrzeby skryptów wmctrl, xdotooli xclip:

    sudo apt-get install wmctrl xdotool xclip
    
  2. Skopiuj skrypt do pustego pliku, zapisz go jako open_in_terminal(bez rozszerzenia) w ~/.local/share/nautilus/scripts. W razie potrzeby utwórz katalog. Spraw, aby skrypt był wykonywalny

Otóż ​​to. Wyloguj się i zaloguj ponownie, a będziesz mieć skrypt dostępny jak na obrazku (2).

Wyjaśnienie

  • Klikając plik prawym przyciskiem myszy, możemy uzyskać ścieżkę za pomocą nautilusa "NAUTILUS_SCRIPT_CURRENT_URI".
  • W skrypcie możemy następnie załadować tę ścieżkę do schowka (używając xclip)
  • Następnie skrypt podnosi okno (pierwsze znalezione) gnome-terminali wkleja ścieżkę, poprzedzoną cdpoleceniem. Ponieważ zwykliśmy echoładować całą linię do schowka, Returnjest wliczony w cenę.

Notatki

  1. Powinno być jasne, że w terminalu nie powinno być nic uruchomionego i działa najlepiej, jeśli jest otwarte tylko jedno okno terminala. Jeśli jest ich wiele, skrypt wybiera najstarsze gnome-terminalokno.
  2. Skrypt należy dokładnie przetestować w praktyce. Podczas gdy go uruchomiłem, czas nie był problemem nawet raz, nawet gdy Pulpit musiał „podróżować” przez cztery lub pięć rzutni, aby dostać się do okna terminala. JEŻELI wystąpiłyby błędy, ale przy kilku liniach więcej moglibyśmy sprawić, że faktycznie inteligentnie (er) czeka na podniesienie okna terminala. Zobaczmy co się stanie. To nie wydaje się konieczne.
  3. Ponieważ skrypt używa ścieżki rzeczywistej , również połączone katalogi będą działać poprawnie.

Więcej informacji na temat skryptów nautilus tutaj .


Możesz też wybrać własne okno terminala, jeśli masz wiele

Jeśli chcesz mieć możliwość wyboru, w którym oknie terminala chcesz otworzyć bieżący katalog (nautilus), użyj poniższego skryptu.

Jak to działa w praktyce

  1. Kliknij prawym przyciskiem myszy (dowolny) plik w katalogu (w tym przypadku mój pulpit), jak poniżej:

    wprowadź opis zdjęcia tutaj

  2. Kliknij (lub podnieś inaczej) okno terminala, którego chcesz użyć, a nastąpi przejście do katalogu:

    wprowadź opis zdjęcia tutaj

Scenariusz

#!/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)

Ustawiać

Jest dokładnie tak, jak pierwszy skrypt.

Wyjaśnienie

Skrypt ma jedną różnicę w stosunku do pierwszego: zamiast automatycznie podnosić pierwsze znalezione okno terminala, czeka na fokus pierwszego okna terminala. Następnie cd do katalogu w tym oknie.

Jacob Vlijm
źródło
ponieważ i tak używasz pliku do uruchomienia skryptu, po prostu usuń nazwę pliku ze ścieżki sys.argv [1].
skróci
1
@TonyLancer menu pojawia się po utworzeniu ~/.local/share/nautilus/scriptswylogowania z katalogu i ponownym
zalogowaniu
1
@Benny działa tylko po kliknięciu prawym przyciskiem myszy nautilus.
Jacob Vlijm
1
@Benny środowisko dla skryptu jest przekazywane z procesu nadrzędnego. W tym przypadku Nautilus jest nadrzędnym procesem skryptu i konfiguruje środowisko dla skryptu. Jeśli próbujesz zrobić to samo z interpretera Pythona lub skryptu, będzie miał inny proces nadrzędny, dlatego powróci, Noneponieważ nie ma takiej zmiennej (poza Nautilus).
Sergiy Kolodyazhnyy
1
@JacobVlijm jesteś niesamowity. W pełni funkcjonujący! Teraz zrozumiałem, jak działa drugi skrypt, masz rację co do wyzwalacza. To naprawdę fajny gadżet dla społeczności Ubuntu. Oczywiście możemy myśleć o wielu ulepszeniach jak w przypadku każdego skryptu, ale ten spełnia swoje zadanie. Wystarczy wspomnieć w swojej odpowiedzi, że drugi skrypt działa z Alt Tab.
Vitor Abella,
8

Jestem pewien, że nie ma sposobu, aby to zrobić, jednak mam dla ciebie obejście, które może ci pomóc.

Zawsze możesz przeciągnąć i upuścić katalog z Nautilus do okna terminala, a Nautilus przekaże ten katalog i wklei go do wiersza poleceń, więc możesz to zrobić, cda następnie przeciągnij folder na terminal i naciśnij klawisz Enter.

Jorge Castro
źródło
8

Najprostszy sposób to:

  1. Nautilus, naciśnij Ctrl+ L, otworzy to pasek adresu do edycji. Naciśnij Ctrl+C
  2. Przełącz na terminal i wpisz cdspację, a następnie Shift+, Insert (or INS)aby wkleić ścieżkę. Hit Enter.

Nie potrzeba skryptów ani dodatkowej pracy.

Sergiy Kolodyazhnyy
źródło
Używam Ctrl + Shift + V, aby wkleić ścieżkę.
Katu
1
tak, to inny sposób na zrobienie tego. Linux ma dwa schowki, więc Ctrl + Shift + V jest dla podstawowego, a Shift + Insert jest dla drugiego, ale ponieważ drugi wymaga tylko dwóch kluczy, używam go głównie. Są udostępniane, chyba że coś zaznaczysz - wtedy rzeczy
trafią
1

Moim zdaniem jedynym eleganckim sposobem na rozwiązanie tego problemu bez marnowania czasu jest użycie terminalowego multipleksera takiego jak tmux i posiadanie menedżera plików

  • otwórz nowe okna terminala w istniejącej sesji lub
  • uruchom nowy emulator terminala z nową sesją tmux.

Poniższy skrypt powłoki osiąga właśnie to:

#!/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_EMULATORzawiera żądany emulator terminala dla nowych okien terminala (jeśli nie podoba Ci się domyślna wartość tego, co x-terminal-emulatorwskazuje) oraz opcję wiersza poleceń, aby polecenie mogło zostać wykonane wewnątrz emulatora.

Możesz zarejestrować skrypt obsługi plików jak każde inne skojarzenie typu pliku w menedżerze plików.

David Foerster
źródło