Comment ouvrir le répertoire Nautilus dans le terminal actuel?

13

Je n'aime pas avoir des dizaines de terminaux ouverts. Existe-t-il un moyen d'ajouter Ouvrir dans le terminal actuel au lieu de Ouvrir dans le terminal lors de l'utilisation de Nautilus?

Vitor Abella
la source
Seulement des solutions sales pour autant que je peux imaginer Je peux en donner un si vous êtes d'
accord

Réponses:

13

Sale ou non, la solution ci-dessous a parfaitement fonctionné dans les 30 minutes que j'ai testées fréquemment. La solution fonctionne tant que vous pouvez cliquer avec le bouton droit sur un fichier (n'importe lequel) dans le répertoire:

1.

entrez la description de l'image ici

2.

entrez la description de l'image ici

3.

entrez la description de l'image ici

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)

Comment utiliser

  1. Le script a besoin wmctrl, xdotoolet xclip:

    sudo apt-get install wmctrl xdotool xclip
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous open_in_terminal(sans extension) dans ~/.local/share/nautilus/scripts. Créez le répertoire si nécessaire. Rendre le script exécutable

C'est ça. Déconnectez-vous et reconnectez-vous et vous aurez le script disponible comme dans l'image (2).

Explication

  • En faisant un clic droit sur un fichier, nous pouvons obtenir le chemin en utilisant nautilus ' "NAUTILUS_SCRIPT_CURRENT_URI".
  • Dans un script, nous pouvons ensuite charger ce chemin dans le presse-papiers (en utilisant xclip)
  • Par la suite, le script ouvre la gnome-terminalfenêtre (la première trouvée) et colle le chemin d'accès, précédé de la cdcommande. Puisque nous avions l'habitude echode charger toute la ligne dans le presse-papiers, Returnest inclus.

Remarques

  1. Il doit être clair que rien ne doit fonctionner dans le terminal, et cela fonctionne mieux s'il n'y a qu'une seule fenêtre de terminal ouverte. S'il y en a plusieurs, le script choisit la gnome-terminalfenêtre la plus ancienne .
  2. Le script doit être testé à fond dans la pratique. Pendant que je l'exécutais, le timing n'était pas un problème, même une seule fois, pas même lorsque le bureau devait "voyager" à travers quatre ou cinq fenêtres pour accéder à la fenêtre du terminal. Si des erreurs se produisaient cependant, avec quelques lignes de plus, nous pourrions faire en sorte qu'il attende de manière intelligente (er) que la fenêtre du terminal soit ouverte. Voyons ce qui se passe. Cela ne semble pas nécessaire.
  3. Comme le script utilise le chemin réel , les répertoires liés fonctionneront également correctement.

Plus d'informations sur les scripts nautilus ici .


Alternativement, choisissez votre propre fenêtre de terminal si vous en avez plusieurs

Si vous voulez pouvoir choisir dans quelle fenêtre de terminal vous souhaitez ouvrir le répertoire courant (nautilus), utilisez le script ci-dessous.

Comment ça marche dans la pratique

  1. Cliquez avec le bouton droit sur (n'importe quel) fichier dans le répertoire (dans ce cas, mon bureau) comme ci-dessous:

    entrez la description de l'image ici

  2. Cliquez sur (ou augmentez autrement) la fenêtre du terminal que vous souhaitez utiliser, et elle sera enregistrée dans le répertoire:

    entrez la description de l'image ici

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

Installer

Est exactement comme le premier script.

Explication

Le script a une différence par rapport au premier: au lieu de déclencher automatiquement la première fenêtre de terminal trouvée, il attend que la première fenêtre de terminal soit active. Ensuite, il se place dans le répertoire de cette fenêtre.

Jacob Vlijm
la source
puisque vous utilisez de toute façon le fichier pour lancer le script, supprimez simplement le nom de fichier du chemin sys.argv [1]. cela rendra le script beaucoup plus court
Sergiy Kolodyazhnyy
1
@TonyLancer le menu apparaît après avoir créé la ~/.local/share/nautilus/scriptsdéconnexion du répertoire et de retour :)
Jacob Vlijm
1
@Benny, cela ne fonctionne qu'à partir du clic droit de nautilus.
Jacob Vlijm
1
@Benny l'environnement du script est transmis du processus parent. Dans ce cas, Nautilus est le processus parent du script, et il configure l'environnement du script. Si vous essayez de faire la même chose à partir d'un interpréteur python ou d'un script, il aura un processus parent différent, donc il reviendra Nonecar il n'y a pas une telle variable (en dehors de Nautilus).
Sergiy Kolodyazhnyy
1
@JacobVlijm vous êtes génial. Entièrement fonctionnel! Maintenant que j'ai compris comment fonctionne le deuxième script, vous avez raison sur le déclencheur. C'est vraiment un bon gadget pour la communauté Ubuntu. Bien sûr, nous pouvons penser à de nombreuses améliorations comme pour tout script, mais celui-ci fait le travail. Mentionnez simplement dans votre réponse que le deuxième script fonctionne avec Alt Tab.
Vitor Abella
8

Je suis sûr qu'il n'y a aucun moyen de le faire, mais j'ai une solution de contournement pour vous qui pourrait vous aider.

Vous pouvez toujours faire glisser et déposer un répertoire de Nautilus dans une fenêtre de terminal et Nautilus passera ce répertoire et le collera dans la ligne de commande, vous pourrez donc le faire cd, puis faire glisser le dossier sur le terminal et appuyer sur Entrée.

Jorge Castro
la source
8

La façon la plus simple est la suivante:

  1. Depuis nautilus, appuyez sur Ctrl+ L, cela ouvrira la barre d'adresse pour l'édition. Appuyez sur le Ctrl+C
  2. Basculez vers le terminal et tapez cd, espace, puis Shift+ Insert (or INS)pour coller le chemin. Frappez Enter.

Pas besoin de scripts ou de travail supplémentaire.

Sergiy Kolodyazhnyy
la source
J'utilise Ctrl + Maj + V pour coller le chemin.
Katu
1
yup, c'est une autre façon de le faire. Linux a deux presse-papiers, en fait, donc Ctrl + Shift + V est pour le primaire et Shift + Insert est pour le secondaire, mais parce que le second ne nécessite que deux clés, je l'utilise principalement. Ils sont partagés, à moins que vous ne
mettiez en
1

À mon avis, la seule façon élégante de résoudre cela sans contourner est d'utiliser un multiplexeur de terminal comme tmux et d'avoir votre gestionnaire de fichiers

  • ouvrir de nouvelles fenêtres de terminal dans une session existante ou
  • démarrer un nouvel émulateur de terminal avec une nouvelle session tmux.

Le script shell suivant y parvient:

#!/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_EMULATORcontient l'émulateur de terminal souhaité pour les nouvelles fenêtres de terminal (si vous n'aimez pas la valeur par défaut de ce qui x-terminal-emulatorpointe), plus une option de ligne de commande pour que la commande s'exécute à l'intérieur de l'émulateur.

Vous pouvez enregistrer le script du gestionnaire de fichiers comme toute autre association de type de fichier dans votre gestionnaire de fichiers.

David Foerster
la source