Come aprire la directory Nautilus nell'attuale Terminal?


Risposte:


13

Sporco o no, la soluzione di seguito ha funzionato perfettamente nei 30 minuti in cui l'ho testata frequentemente. La soluzione funziona fintanto che è possibile fare clic con il pulsante destro del mouse su un file (qualsiasi) all'interno della directory:

1.

inserisci qui la descrizione dell'immagine

2.

inserisci qui la descrizione dell'immagine

3.

inserisci qui la descrizione dell'immagine

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)

Come usare

  1. Le esigenze di script wmctrl, xdotoole xclip:

    sudo apt-get install wmctrl xdotool xclip
    
  2. Copia lo script in un file vuoto, salvalo come open_in_terminal(nessuna estensione) in ~/.local/share/nautilus/scripts. Creare la directory se necessario. Rendi eseguibile lo script

Questo è tutto. Esci e rientra e avrai lo script disponibile come nell'immagine (2).

Spiegazione

  • Cliccando col tasto destro su un file, possiamo ottenere il percorso usando nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI".
  • In uno script, possiamo quindi caricare questo percorso negli Appunti (usando xclip)
  • Successivamente, lo script solleva la gnome-terminalfinestra (prima trovata) e incolla il percorso, preceduto dal cdcomando. Dal momento che abbiamo usato echoper caricare l'intera riga negli appunti, Returnè incluso.

Appunti

  1. Dovrebbe essere chiaro che non dovrebbe esserci nulla in esecuzione nel terminale e funziona meglio se è aperta solo una finestra del terminale. Nel caso ce ne siano più, lo script seleziona la gnome-terminalfinestra più vecchia .
  2. Lo script deve essere testato accuratamente nella pratica. Mentre lo eseguivo, il tempismo non era un problema nemmeno una volta, nemmeno quando il Desktop doveva "viaggiare" attraverso quattro o cinque finestre per arrivare alla finestra del terminale. Tuttavia, se si verificassero errori, con qualche riga in più potremmo effettivamente attendere in modo intelligente (er) che la finestra del terminale venga sollevata. Vediamo cosa succede. Non sembra necessario.
  3. Poiché lo script utilizza il realpath , anche le directory collegate funzioneranno correttamente.

Maggiori informazioni sugli script nautilus qui .


In alternativa, scegli la tua finestra del terminale se ne hai più

Se vuoi essere in grado di scegliere in quale finestra terminale aprire la directory (nautilus) corrente, usa lo script qui sotto.

Come funziona in pratica

  1. Fai clic con il pulsante destro del mouse (qualsiasi) file all'interno della directory (in questo caso il mio desktop) come di seguito:

    inserisci qui la descrizione dell'immagine

  2. Fare clic su (o sollevare diversamente) la finestra del terminale che si desidera utilizzare e verrà indirizzata alla directory:

    inserisci qui la descrizione dell'immagine

Il copione

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

Impostare

È esattamente come il primo copione.

Spiegazione

Lo script ha una differenza rispetto al primo: invece di sollevare automaticamente la prima finestra del terminale trovata, attende che la prima finestra del terminale abbia lo stato attivo. Quindi cd nella directory all'interno di quella finestra.


poiché stai usando il file per avviare lo script, rimuovi semplicemente il nome file dal percorso sys.argv [1]. renderà la sceneggiatura molto più breve
Sergiy Kolodyazhnyy,

1
@TonyLancer il menu appare dopo aver creato la ~/.local/share/nautilus/scriptsdisconnessione dalla directory e di nuovo :)
Jacob Vlijm,

1
@Benny funziona solo con il tasto destro del mouse nautilus.
Jacob Vlijm,

1
@Benny l'ambiente per lo script viene trasmesso dal processo padre. In questo caso, Nautilus è il processo principale dello script e imposta l'ambiente per lo script. Se stai provando a fare la stessa cosa dall'interprete python o da uno script, avrà un processo genitore diverso, quindi tornerà Noneperché non esiste tale variabile (al di fuori di Nautilus).
Sergiy Kolodyazhnyy,

1
@JacobVlijm sei fantastico. Completamente funzionante! Ora ho capito come funziona il secondo script, hai ragione su trigger. È davvero un bel gadget per la comunità di Ubuntu. Ovviamente possiamo pensare a molti miglioramenti come per qualsiasi sceneggiatura, ma questo fa il suo lavoro. Basta menzionare nella risposta che il secondo script funziona con Alt Tab.
Vitor Abella,

8

Sono abbastanza sicuro che non c'è modo di farlo, tuttavia ho una soluzione alternativa per te che potrebbe aiutarti.

Puoi sempre trascinare e rilasciare una directory da Nautilus in una finestra del terminale e Nautilus passerà quella directory e la incollerà nella riga di comando, quindi potresti farlo cde quindi trascinare la cartella sul terminale e premere invio.


8

Il modo più semplice è questo:

  1. Da nautilus, premi Ctrl+ L, questo aprirà la barra degli indirizzi per la modifica. Premi Ctrl+C
  2. Passa al terminale e digita cd, spazio, quindi Shift+ Insert (or INS)per incollare il percorso. Hit Enter.

Non c'è bisogno di script o lavoro extra.


Uso Ctrl + Maiusc + V per incollare il percorso.
Katu,

1
sì, è un altro modo per farlo. Linux ha due appunti, in realtà, quindi Ctrl + Maiusc + V è per primario e Maiusc + Inserisci è per secondario, ma poiché il secondo richiede solo due chiavi, lo uso principalmente. Sono condivisi, a meno che non si evidenzi qualcosa - questo è quando le cose vanno negli appunti secondari
Sergiy Kolodyazhnyy

1

A mio avviso, l'unico modo elegante per risolverlo senza doversi preoccupare è usare un multiplexer terminale come tmux e avere il tuo file manager

  • aprire nuove finestre del terminale all'interno di una sessione esistente o
  • avviare un nuovo emulatore di terminale con una nuova sessione tmux.

Il seguente script di shell ottiene proprio questo:

#!/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_EMULATORcontiene l'emulatore di terminale desiderato per le nuove finestre di terminale (se non ti piace il valore predefinito di qualunque x-terminal-emulatorpunto) più un'opzione della riga di comando per l'esecuzione del comando all'interno dell'emulatore.

È possibile registrare lo script del gestore file come qualsiasi altra associazione di tipi di file nel file manager.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.