web-dev-qa-db-fra.com

Comment définir une touche de raccourci pour ouvrir le fichier sélectionné dans Nautilus?

Fatigué de faire un clic droit Open With pour ouvrir un fichier dans une application spécifique, j'aimerais définir un raccourci pour ouvrir un fichier, par exemple. Gimp. Je ne veux pas changer l'action ouverte par défaut cependant. (Ubuntu 14.04)

Ce que j'ai essayé:

J'ai défini un raccourci clavier pour exécuter le script ci-dessous afin d'ouvrir le fichier Nautilus sélectionné, dans l'application spécifiée (gimp).

!/bin/sh
for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS 
do
/usr/bin/gimp "$file"
done

et...

!/bin/sh
/usr/bin/gimp "$1"

Cependant, il ne prend jamais correctement le fichier sélectionné dans la fenêtre Nautilus.

Y a-t-il un moyen de faire cela?

3
Seek Truth

NOTE: dans cette réponse, il existe deux solutions, chacune avec ses propres avantages. Les utilisateurs sont encouragés à découvrir celui qui convient le mieux à leur cas particulier.

Introduction

Nautilus en soi ne permet pas de définir des raccourcis clavier personnalisés et leurs actions. C'est la raison principale pour laquelle les scripts que vous avez essayés ont échoué. $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ne peut être utilisé que via le sous-menu contextuel. Mais nous pouvons exploiter autre chose pour obtenir le résultat souhaité: des raccourcis définis dans les paramètres et le Presse-papiers du système.

Nautilus est construit dans quelque chose appelé Gtk Toolkit. C'est une bibliothèque complète pour la création d'applications graphiques, et entre autres choses, elle dispose d'utilitaires pour l'interface avec le presse-papiers du système. Nautilus, en tant que gestionnaire de fichiers, a la particularité de sortir une liste d’URI (sous la forme file:///home/user/Pictures/encoded%image%name.png) dans le presse-papiers (ce que peu savent la plupart des utilisateurs, et j’ai appris - assez récemment aussi ). Apparemment, c’est ainsi que les gestionnaires de fichiers GUI copient les fichiers.

Nous pouvons exploiter ce fait en copiant l'URI du fichier (ou, pour être exact, la liste des URI; même s'il n'y en a qu'un, il s'agit par défaut d'une liste). Ensuite, nous pouvons transmettre cette liste à gimp. Les deux solutions présentées ci-dessous fonctionnent exactement sur cette idée.

Raisonnement pour 2 solutions:

Personnellement, je considère la solution n ° 1 comme la solution préférée Il faut d'abord appuyer manuellement sur le raccourci de copie, puis sur le raccourci de script - ce sont deux raccourcis clavier -, mais cela présente l'avantage d'avoir moins de dépendances. C'est une approche plus manuelle, mais assez décente. Il utilise l'appel os.execlp, qui remplacera le processus de script par Gimp, agissant ainsi comme un simple tremplin pour Gimp. Il est courant dans les scripts et la programmation système d'utiliser exec famille de fonctions

La deuxième solution a été écrite parce que Jacob Vlijm a mentionné dans les commentaires que pour lui la fonction execlp ne fonctionnait pas, pour une raison quelconque. Je trouve cela très étrange car les execlp appartiennent au module standard os pour python, qui est l’un des modules installés par défaut. De plus, subprocess.Popen() par défaut est exec() famille de fonctions; de subprocess documentation:

Sur POSIX, avec Shell = False (par défaut): Dans ce cas, la classe Popen utilise os.execvp () pour exécuter le programme enfant. les arguments devraient normalement être une séquence. Une chaîne sera traitée comme une séquence avec la chaîne comme seul élément (le programme à exécuter).

(Remarque: "sur POSIX" signifie "système d'exploitation compatible POSIX"; Ubuntu est compatible POSIX)

Ainsi, cela ne semble pas être un problème avec une fonction elle-même, mais avec le système de l'utilisateur. Néanmoins, j'ai écrit le deuxième script. Celui-ci utilise le module subprocess et s'appuie sur xdotool, qui automatisera essentiellement le pressage Ctrl+C raccourci pour vous, puis lancez Gimp. Personnellement, je n'aime pas autant celui-ci, car il nécessite l'installation d'un élément supplémentaire, mais il présente l'avantage de ne nécessiter qu'un seul raccourci clavier.

L'idée, cependant, est la même. Nous utilisons toujours les outils Gtk pour interroger le contenu du presse-papiers et, dans chaque cas, les scripts doivent être liés à un raccourci.

Solution n ° 1, deux raccourcis, dépendances minimales

Utilisation: sélectionnez le fichier et appuyez sur Ctrl+C pour copier le fichier en premier, puis appuyez sur le raccourci que vous avez attribué à ce script. La fonction execlp remplacera le processus du script par gimp.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from gi.repository import Gtk, Gdk
from os import execlp
from time import sleep
from urllib.parse import unquote
import signal
import threading
import subprocess

uris = None

def autoquit():
    global uris
    #sleep(0.5)
    while not uris:
       # allow sufficient time to obtain uris
       sleep(2)
       pass
    Gtk.main_quit()

def get_clipboard_contents():
    global uris
    clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
    tr = threading.Thread(target=autoquit)
    tr.daemon = True
    tr.start()
    uris = clip.wait_for_uris()
    Gtk.main()
    return [unquote(i).replace('file://','')
           for i in uris]
def main():
    signal.signal(signal.SIGINT,signal.SIG_DFL)
    files = get_clipboard_contents()
    print(files)
    args = ['gimp'] + files
    execlp('gimp',*args)

if __== '__main__': main()

Solution n ° 2: raccourci unique, dépendance xdotool

L'utilisation de ce script est plus simple: sélectionnez un ou plusieurs fichiers dans Nautilus et appuyez sur le raccourci clavier. NOTE: vous devez avoir installé xdotool pour que cela fonctionne, utilisez Sudo apt-get install xdotool.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from gi.repository import Gtk, Gdk
from subprocess import Popen,STDOUT
from time import sleep
from urllib.parse import unquote
import sys

def unquote_uri(*args):
    uris = args[-2]
    unquoted_args = [ str(unquote(i).replace('file://',''))
                      for i in uris]
    with open('/dev/null','w') as dev_null:
        proc = Popen(['gimp',*unquoted_args],stdout=dev_null,stderr=STDOUT)
    Gtk.main_quit()


def main():
    # NOTE: xdotool is REQUIRED for this to work
    Popen(['xdotool','key','Ctrl+c'])
    sleep(0.5)
    clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
    clip.request_uris(unquote_uri, None)
    Gtk.main()

if __== '__main__': main()

Mise en place du raccourci

Dans les deux cas, vous devez associer un script à un raccourci. Ouvrez les Paramètres système -> Clavier -> Raccourcis -> Personnalisé. Clique le + bouton. Donnez le chemin complet (!) Au fichier en tant que commande. Par exemple, /home/User_Name/bin/clipboard_launch.py

enter image description here

Attribuez le raccourci à quelque chose de sensé. Par exemple, depuis que nous appelons Gimp, j'ai assigné mon script à Ctrl+Super+G.

4
Sergiy Kolodyazhnyy

Ouvrir le fichier sélectionné dans une application spécifique à partir d'un raccourci

Inspiré du concept de @Serg (+1), une approche différente sur la façon de le mettre en œuvre:

Le scénario

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

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

Comment utiliser

  1. Le script nécessite à la fois pyperclip et xdotool (pour l'utilisation de xdotool- less, voir les notes):

    • pour 16.04 +:

      Sudo apt-get install python3-pyperclip xdotool
      
    • pour 14.04:

      Sudo apt-get install python3-pip xdotool
      Sudo pip3 install pyperclip
      
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom open_ingimp.py

  3. Ajoutez-le à une touche de raccourci: Choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:

    python3 /path/to/open_ingimp.py
    

C'est ça. Sélectionnez maintenant un document valide et appuyez sur la touche de raccourci. Le fichier s'ouvrira dans Gimp.

Explication

  • En appuyant sur Ctrl+C, lorsqu'un fichier est sélectionné, son chemin est copié dans le Presse-papiers. Nous simulons cela avec:

    subprocess.call(["xdotool", "key", "Control_L+c"])
    
  • Il s'avère que le module python de pyperclip produit simplement le chemin, extrait de file:// lors de l'utilisation de pyperclip.paste() (ceci ne collera pas littéralement, mais rendra le chemin disponible dans le script).
  • Il suffit ensuite de lancer la commande pour ouvrir le fichier avec gimp.

    subprocess.Popen(["gimp", pyperclip.paste()])
    

Remarques

  • Si vous appuyez sur Ctrl+C Avant d’appuyer sur le raccourci pour ouvrir le fichier dans Gimp, c’est acceptable, nous pourrions même raccourcir le script pour le transformer en un script:

    #!/usr/bin/env python3
    import subprocess
    import pyperclip
    
    subprocess.Popen(["gimp", pyperclip.paste()])
    

    Cela rendrait inutile l'installation de xdotool.

  • Nous pourrions bien sûr habiller/affiner le script pour ne tourner que sur des extensions définies, ou soumettre l’application à un argument. Il suffit de mentionner.

  • Nous pourrions même définir plusieurs options: ouvrir le type de fichier A avec l’application 1, le type de fichier B avec l’application2, sans déranger les applications par défaut pour ouvrir le fichier, ni avec les options du clic droit.

2
Jacob Vlijm