it-swarm.com.de

Wie kann ich eine Tastenkombination festlegen, um die ausgewählte Datei in Nautilus zu öffnen?

Keine Lust mehr auf Rechtsklick Open With Um eine Datei in einer bestimmten Anwendung zu öffnen, möchte ich eine Verknüpfung zum Öffnen einer Datei in z. Gimp. Ich möchte die Standardaktion zum Öffnen jedoch nicht ändern. (Ubuntu 14.04)

Was ich versucht habe:

Ich habe eine Tastenkombination zum Ausführen des folgenden Skripts zum Öffnen der ausgewählten Nautilus-Datei in einer bestimmten Anwendung (Gimp) festgelegt.

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

und...

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

Die ausgewählte Datei im Nautilus-Fenster wird jedoch nie richtig aufgenommen.

Gibt es eine Möglichkeit, dies zu tun?

3
Seek Truth

[~ # ~] Anmerkung [~ # ~] : In dieser Antwort gibt es zwei Lösungen, von denen jede ihre eigenen Vorteile hat. Benutzer sollten herausfinden, welches für ihren speziellen Fall am besten geeignet ist.

Einführung

Nautilus bietet keine Möglichkeit, benutzerdefinierte Tastaturkürzel und deren Aktionen zu definieren. Dies ist der Hauptgrund, warum die von Ihnen ausgeführten Skripts fehlgeschlagen sind. $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS Kann nur über das Rechtsklick-Untermenü verwendet werden. Wir können aber noch etwas anderes ausnutzen, um das gewünschte Ergebnis zu erzielen - Verknüpfungen, die in den Einstellungen und in der System-Zwischenablage definiert sind.

Nautilus ist in einem sogenannten Gtk-Toolkit enthalten. Es ist eine umfangreiche Bibliothek zum Erstellen von Grafikanwendungen und bietet unter anderem Hilfsprogramme für die Anbindung an die Systemzwischenablage. Als Dateimanager zeichnet sich Nautilus dadurch aus, dass er eine Liste von URIs (in der Form file:///home/user/Pictures/encoded%image%name.png) In die Zwischenablage überträgt (was den meisten Benutzern nicht bekannt ist, und ich habe es gelernt auch in letzter Zeit ). Anscheinend ist dies die Art und Weise, wie GUI-Dateimanager Dateien kopieren.

Wir können diese Tatsache ausnutzen, indem wir den URI der Datei kopieren (oder genauer gesagt die Liste der URIs; selbst wenn es nur einen gibt, wird standardmäßig eine Liste erstellt). Dann können wir diese Liste an gimp übergeben. Die beiden folgenden Lösungen funktionieren genau nach dieser Idee.

Begründung für 2 Lösungen:

Ich persönlich betrachte die Lösung Nr. 1 als bevorzugte Lösung. Es ist darauf angewiesen, zuerst die Kopierverknüpfung und dann die Skriptverknüpfung - das sind zwei Tastaturverknüpfungen - manuell zu drücken, hat jedoch den Vorteil, dass weniger Abhängigkeiten vorhanden sind. Es ist ein eher manueller Ansatz, aber ziemlich anständig. Es wird der Aufruf os.execlp Verwendet, der den Skriptprozess durch Gimp ersetzt und somit lediglich als Sprungbrett für Gimp fungiert. In der Skripterstellung und Systemprogrammierung wird häufig die Funktionsfamilie exec verwendet

Die zweite Lösung wurde geschrieben, weil Jacob Vlijm in den Kommentaren erwähnte, dass die Funktion execlp für ihn aus irgendeinem Grund nicht funktionierte. Ich finde das sehr seltsam, da die execlp zum Standardmodul os für python, das eines der standardmäßig installierten Module ist. Außerdem ist subprocess.Popen() ist standardmäßig die Funktionsfamilie exec() (aus der Dokumentation zu subprocess).

Unter POSIX mit Shell = False (Standard): In diesem Fall verwendet die Popen-Klasse os.execvp (), um das untergeordnete Programm auszuführen. Argumente sollten normalerweise eine Sequenz sein. Eine Zeichenfolge wird als Sequenz behandelt, wobei die Zeichenfolge das einzige Element ist (das auszuführende Programm).

(Hinweis "Auf POSIX" bedeutet "POSIX-konformes Betriebssystem"; Ubuntu ist POSIX-konform.)

Es scheint also kein Problem mit einer Funktion selbst zu sein, sondern mit dem System des Benutzers. Trotzdem habe ich ein zweites Drehbuch geschrieben. Dieser benutzt das subprocess Modul und verlässt sich auf xdotool, was im Grunde das Pressen automatisiert Ctrl+C Verknüpfung für Sie, und starten Sie dann Gimp. Ich persönlich mag dieses nicht so sehr, da es zusätzliche Elemente erfordert, die installiert werden müssen, aber es hat den Vorteil, dass nur eine Tastenkombination erforderlich ist.

Die Idee ist jedoch die gleiche. Wir verwenden immer noch Gtk-Tools, um den Inhalt der Zwischenablage abzufragen, und in jedem Fall müssen Skripte an eine Verknüpfung gebunden sein.

Lösung 1, zwei Verknüpfungen, minimale Abhängigkeiten

Verwendung: Datei auswählen und drücken Ctrl+C Um die Datei zuerst zu kopieren, drücken Sie die Verknüpfung, die Sie diesem Skript zugewiesen haben. Die Funktion execlp ersetzt den Prozess des Skripts durch 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()

Lösung 2: Einzelne Verknüpfung, xdotool-Abhängigkeit

Die Verwendung dieses Skripts ist einfacher: Wählen Sie die Datei (en) in Nautilus aus und drücken Sie die Tastenkombination. [~ # ~] Hinweis [~ # ~] : Damit dies funktioniert, muss xdotool installiert sein. Verwenden Sie 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()

Einrichten der Verknüpfung

In beiden Fällen muss das Skript mit einer Verknüpfung verknüpft sein. Öffnen Sie Systemeinstellungen -> Tastatur -> Verknüpfungen -> Benutzerdefiniert. Drücke den + Taste. Geben Sie den vollständigen (!) Pfad zur Datei als Befehl an. Zum Beispiel /home/User_Name/bin/clipboard_launch.py

enter image description here

Weisen Sie die Verknüpfung als sinnvoll zu. Zum Beispiel, seit wir Gimp anrufen, habe ich mein Skript zugewiesen Ctrl+Super+G.

4

Öffnen der ausgewählten Datei in einer bestimmten Anwendung über eine Verknüpfung

Inspiriert durch das Konzept von @Serg (+1), ein anderer Ansatz zur Implementierung:

Das Drehbuch

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

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

Wie benutzt man

  1. Das Skript benötigt sowohl pyperclip als auch xdotool (zur Verwendung von xdotool- less Siehe Hinweise):

    • für 16.04 +:

      Sudo apt-get install python3-pyperclip xdotool
      
    • für 14.04:

      Sudo apt-get install python3-pip xdotool
      Sudo pip3 install pyperclip
      
  2. Kopieren Sie das Skript in eine leere Datei und speichern Sie es als open_ingimp.py

  3. Hinzufügen zu einer Tastenkombination: Wählen Sie: Systemeinstellungen> "Tastatur"> "Tastenkombinationen"> "Benutzerdefinierte Tastenkombinationen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:

    python3 /path/to/open_ingimp.py
    

Das ist es. Wählen Sie nun ein gültiges Dokument aus und drücken Sie die Tastenkombination. Die Datei wird in Gimp geöffnet.

Erläuterung

  • Beim Drücken von Ctrl+CWenn eine Datei ausgewählt ist, wird der Pfad zur Datei in die Zwischenablage kopiert. Wir simulieren das mit:

    subprocess.call(["xdotool", "key", "Control_L+c"])
    
  • Es stellt sich heraus, dass das Modul python des pyperclip einfach den Pfad erzeugt, der bei Verwendung von pyperclip.paste() aus file:// Entfernt wurde (dies wird nicht buchstäblich einfügen, sondern den Pfad verfügbar machen innerhalb des Skripts).
  • Dann müssen wir nur noch den Befehl ausführen, um die Datei mit gimp zu öffnen.

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

Anmerkungen

  • Wenn Sie drücken Ctrl+C Bevor es akzeptabel ist, die Verknüpfung zum Öffnen der Datei in Gimp zu drücken, können wir das Skript sogar auf fast einzeilig verkürzen:

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

    Dies würde die Installation von xdotool unnötig machen.

  • Wir könnten das Skript natürlich ein wenig verfeinern, um es nur mit definierten Erweiterungen auszuführen, oder die Anwendung von einem Argument abhängig machen. Nur erwähnen.

  • Wir könnten sogar mehrere Optionen festlegen: Öffnen Sie Dateityp A mit Anwendung 1, Dateityp B mit Anwendung 2, ohne mit den Standardanwendungen zu experimentieren, um die Datei zu öffnen, oder mit den Optionen für Rechtsklicks.

2
Jacob Vlijm