¿Cómo abrir el directorio Nautilus en la Terminal actual?

13

No me gusta tener docenas de terminales abiertas. ¿Hay alguna manera de agregar Abrir en la Terminal actual en lugar de Abrir en la Terminal cuando se usa Nautilus?

Vitor Abella
fuente
Solo soluciones sucias hasta donde puedo imaginar. Puedo darte uno si estás de acuerdo con eso ...
Jacob Vlijm

Respuestas:

13

Sucia o no, la siguiente solución funcionó perfectamente en los 30 minutos que la probé con frecuencia. La solución funciona siempre que pueda hacer clic con el botón derecho en un archivo (cualquiera) dentro del directorio:

1)

ingrese la descripción de la imagen aquí

2)

ingrese la descripción de la imagen aquí

3)

ingrese la descripción de la imagen aquí

Nautilus 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

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)

Cómo utilizar

  1. El script necesita wmctrl, xdotooly xclip:

    sudo apt-get install wmctrl xdotool xclip
    
  2. Copie el script en un archivo vacío, guárdelo como open_in_terminal(sin extensión) en ~/.local/share/nautilus/scripts. Cree el directorio si es necesario. Hacer el script ejecutable

Eso es. Cierre la sesión y vuelva a iniciarla y tendrá el script disponible como en la imagen (2).

Explicación

  • Al hacer clic derecho en un archivo, podemos obtener la ruta utilizando nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI".
  • En un script, podemos cargar esta ruta en el portapapeles (usando xclip)
  • Posteriormente, el script gnome-terminalabre la ventana (primera vez que se encuentra) y pega la ruta, precedida por el cdcomando. Como solíamos echocargar toda la línea en el portapapeles, Returnestá incluido.

Notas

  1. Debe quedar claro que no debe haber nada ejecutándose en el terminal, y funciona mejor si solo hay una ventana de terminal abierta. En caso de que haya varios, el script selecciona la gnome-terminalventana más antigua .
  2. El script debe ser probado a fondo en la práctica. Mientras lo ejecutaba, el tiempo no era un problema ni una sola vez, ni siquiera cuando el escritorio tenía que "viajar" a través de cuatro o cinco ventanas para llegar a la ventana del terminal. SI errores ocurrirían sin embargo, con unas líneas más podríamos hacer lo que realmente esperar de una manera inteligente (ER) para la ventana de terminal para ser elevado. Veamos qué pasa. No parece necesario
  3. Dado que el script usa el RealPath , también los directorios vinculados funcionarán correctamente.

Más información sobre scripts nautilus aquí .


Alternativamente, elija su propia ventana de terminal si tiene múltiples

Si desea poder elegir en qué ventana de terminal abriría el directorio actual (nautilus), use el siguiente script.

Cómo funciona en la práctica

  1. Haga clic derecho (cualquier) archivo dentro del directorio (en este caso mi escritorio) como a continuación:

    ingrese la descripción de la imagen aquí

  2. Haga clic en (o levante de otro modo) la ventana de terminal que le gustaría usar, y se colocará en el directorio del directorio:

    ingrese la descripción de la imagen aquí

La secuencia de comandos

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

Preparar

Es exactamente como el primer guión.

Explicación

El script tiene una diferencia con respecto al primero: en lugar de abrir automáticamente la primera ventana de terminal encontrada, espera a que la primera ventana de terminal tenga foco. Luego está en el directorio dentro de esa ventana.

Jacob Vlijm
fuente
dado que está utilizando el archivo para iniciar el script de todos modos, simplemente elimine el nombre del archivo de la ruta sys.argv [1]. hará que el guión sea mucho más corto
Sergiy Kolodyazhnyy
1
@TonyLancer, el menú aparece después de crear el ~/.local/share/nautilus/scriptscierre de sesión del directorio y volver a
entrar
1
@Benny solo funciona con el botón derecho del mouse sobre nautilus.
Jacob Vlijm el
1
@Benny el entorno para el script se transmite del proceso principal. En este caso, Nautilus es el proceso principal del script y configura el entorno para el script. Si está tratando de hacer lo mismo desde el intérprete de Python o un script, tendrá un proceso padre diferente, por lo tanto, regresará Noneporque no hay tal variable (aparte de Nautilus).
Sergiy Kolodyazhnyy
1
@JacobVlijm eres increíble. ¡Totalmente trabajando! Ahora entendí cómo funciona el segundo script, tienes razón sobre el disparador. Es realmente un buen gadget para la comunidad ubuntu. Por supuesto, podemos pensar en muchas mejoras en cuanto a cualquier script, pero este hace el trabajo. Solo menciona en tu respuesta que el segundo script funciona con Alt Tab.
Vitor Abella
8

Estoy bastante seguro de que no hay forma de hacer esto, sin embargo, tengo una solución para usted que podría ayudar.

Siempre puede arrastrar y soltar un directorio de Nautilus en una ventana de terminal y Nautilus pasará ese directorio y lo pegará en la línea de comando, para que pueda hacerlo cdy luego arrastre la carpeta al terminal y presione enter.

Jorge Castro
fuente
8

La forma más simple es esta:

  1. Desde nautilus, presione Ctrl+ L, esto abrirá la barra de direcciones para editar. Presione el Ctrl+C
  2. Cambie a terminal y escriba cd, espacio, luego Shift+ Insert (or INS)para pegar la ruta. Hit Enter.

No necesita guiones ni trabajo extra.

Sergiy Kolodyazhnyy
fuente
Yo uso Ctrl + Shift + V para pegar la ruta.
Katu
1
Sí, esa es otra forma de hacerlo. Linux tiene dos portapapeles, en realidad, entonces Ctrl + Shift + V es para primaria y Shift + Insert es para secundaria, pero debido a que la segunda requiere solo dos teclas, la uso principalmente. Se comparten, a menos que resalte algo, eso es cuando las cosas van al portapapeles secundario
Sergiy Kolodyazhnyy el
1

En mi opinión, la única forma elegante de resolver esto sin perder el tiempo es usar un multiplexor de terminal como tmux y tener su administrador de archivos

  • abrir nuevas ventanas de terminal dentro de una sesión existente o
  • iniciar un nuevo emulador de terminal con una nueva sesión tmux.

El siguiente script de shell logra exactamente eso:

#!/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 el emulador de terminal deseado para nuevas ventanas de terminal (si no le gusta el valor predeterminado de los x-terminal-emulatorpuntos a los que apunta) más una opción de línea de comandos para que el comando se ejecute dentro del emulador.

Puede registrar la secuencia de comandos del controlador de archivos como cualquier otra asociación de tipo de archivo en su administrador de archivos.

David Foerster
fuente