web-dev-qa-db-fra.com

Comment attribuer un raccourci clavier aux scripts Nautilus?

J'ai mis en place un Nautilus Script . J'ai mis le script dans /home/sumeet/.local/share/nautilus/scripts et il apparaît dans le menu contextuel. et fonctionne également comme prévu. Je veux juste assigner un raccourci au script.


Comment puis-je créer des raccourcis clavier pour mes scripts Nautilus?

Les réponses données dans la question ci-dessus ciblent une version spécifique et sont complètement obsolètes, et je n'ai rien trouvé d'autre que cette question concernant ce sujet.

10
Sumeet Deshmukh

Comment cela peut être fait

Lorsque vous cliquez avec le bouton droit sur un fichier ou un dossier pour un script Nautilus, le fichier sélectionné est transmis en tant qu'argument au script. Dans la plupart des cas, par quelque chose comme:

import os
subject = os.getenv("NAUTILUS_SCRIPT_CURRENT_URI")

... en utilisant python3, dans sa forme la plus simple.

Si vous remplacez ceci par:

import pyperclip

subprocess.call(["xdotool", "key", "Control_L+c"])
subject = pyperclip.paste()

... le fichier actuellement sélectionné est utilisé dans le script en tant qu'argument

De quoi as-tu besoin

Pour utiliser cette solution (16.04 et plus), vous devez installer xdotoolet python3-pyperclip:

Sudo apt-get install python3-pyperclip xdotool

Le script complet, mentionné dans les commentaires

devient alors:

#!/usr/bin/env python3
import subprocess
import os
import sys
import pyperclip

# --- set the list of valid extensions below (lowercase)
# --- use quotes, *don't* include the dot!
ext = ["jpg", "jpeg", "png", "gif", "icns", "ico"]
# --- set the list of preferred filenames
# --- use quotes
specs = ["folder.png", "cover.png", "monkey.png"]
# ---

# retrieve the path of the targeted folder
subprocess.call(["xdotool", "key", "Control_L+c"])
dr = pyperclip.paste()

for root, dirs, files in os.walk(dr):
    for directory in dirs:
        folder = os.path.join(root, directory)
        fls = os.listdir(folder)
        try:
            first = [p for p in fls if p in specs]
            first = first[0] if first else min(
                p for p in fls if p.split(".")[-1].lower() in ext
                )
        except ValueError:
            pass
        else:
            subprocess.Popen([
                "gvfs-set-attribute", "-t", "string",
                os.path.abspath(folder), "metadata::custom-icon",
                "file://"+os.path.abspath(os.path.join(folder, first))
                ])

Ajouter ceci à une touche de raccourci définira les icônes pour tous les répertoires à l'intérieur celui sélectionné.

L'ajouter à une touche de raccourci (!)

Ajouter des touches de raccourci, exécuter (des scripts utilisant-) xdotool commandes à appuyer sur n autre la combinaison de touches peut être délicat. Pour empêcher les deux combinaisons de touches d’interférer, utilisez:

/bin/bash -c "sleep 1 && python3 /path/to/script.py"

Explication

Quand Ctrl+C est enfoncée lorsqu'un fichier est sélectionné, le chemin du fichier est copié dans le presse-papier. Nous simulons la presse à clé avec:

subprocess.call(["xdotool", "key", "Control_L+c"])

Le module python de pyperclip produit simplement le chemin, extrait de file:// lors de l'utilisation de pyperclip.paste() (ce qui ne collera pas littéralement, mais rendra le chemin disponible dans le script).

6
Jacob Vlijm

Si l'objectif est de sélectionner des fichiers et d'exécuter des actions, il est possible de le faire en utilisant uniquement un script Shell avec xdotool et xclip. Alors installez-les d'abord:

Sudo apt-get install xdotool xclip

Et créez ensuite le script suivant avec les actions contenues dans la boucle:

#!/bin/bash
file=$(mktemp)

xdotool key "Control_L+c"
variable="$( xclip -out -selection clipboard)"
variable="$( echo -e "$variable" | \
            awk 'BEGIN { FS = "\n" } { printf "\"%s\" ", $1 }' | \
            sed -e s#\"\"## | \
            sed 's/" "/"\n"/g')"

echo "$variable" > $file

if [ -s "$file" ]; then
   while read absolute_path_file; do
      absolute_path_file="$(eval echo "$absolute_path_file")"
      base_name="$(basename "$absolute_path_file")"
      ### Execute the actions with the selected files here
      ### echo "$absolute_path_file"
      ### echo "$base_name"
   done < $file
fi

Ce script ne repose pas sur les variables NAUTILUS et vous pouvez créer un raccourci avec:

/bin/bash -c "sleep 1 && /path/script.bash"
1
Rafael Muynarsk