Как я могу установить сочетание клавиш для открытия в настоящее время выбираемого файла в наутилусе?

Усталый от щелчка правой кнопкой по Open With для открытия файла в определенном приложении я хотел бы установить ярлык для открытия файла в, например, Калеки. Я не хочу изменять открытое действие по умолчанию все же. (Ubuntu 14.04)

Что я попробовал:

Я установил сочетание клавиш для запущения скрипта ниже для открытия выбранного файла Наутилуса в указанном приложении (калека).

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

и...

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

Это никогда не берет выбранный файл в окне наутилуса правильно как бы то ни было.

Существует ли способ сделать это?

3
задан 14 September 2019 в 18:42

2 ответа

Примечание: в этом ответе существует два решения, каждый с его собственными преимуществами. Пользователи поощряются узнать, какой работает лучше всего на их конкретный случай.

Введение

Наутилус отдельно не предлагает способ определить пользовательские сочетания клавиш и их действия. Это - главная причина, почему сценарии, которые Вы попробовали, перестали работать. $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS может только использоваться через подменю щелчка правой кнопкой. Но мы можем использовать что-то еще для достижения желаемого результата - ярлыки, определенные в системном буфере обмена и настройках.

Наутилус создается в чем-то известном как инструментарий Gtk. Это - обширная библиотека для того, чтобы создать графические приложения, и среди прочего это имеет утилиты для взаимодействия через интерфейс с системным буфером обмена. Наутилус, будучи файловым менеджером, является особенным в том, что он производит список URIs (в форме file:///home/user/Pictures/encoded%image%name.png ) к буферу обмена (который не является известным фактом большинству пользователей, и я учился совсем недавно также). По-видимому, это - способ, которым файловые менеджеры GUI копируют файлы.

Мы можем использовать тот факт путем копирования URI файла (или быть точным, список URI; даже если существует всего один, это принимает значение по умолчанию к списку). Затем мы можем передать тот список gimp. Эти два решения, представленные ниже, воздействуют точно на ту идею.

Обоснование для 2 решений:

Я лично рассматриваю решение № 1, как предпочтено один. Это полагается на вручную нажимающий ярлык копии сначала и затем ярлык сценария - это - два сочетания клавиш - но это имеет преимущество в наличии меньшего количества зависимостей. Это - более ручной подход, но довольно достойный. Это использует os.execlp звоните, который заменит процесс сценария Калекой, таким образом действуя как просто трамплин для Gimp. Это - частая практика в сценариях и системном программировании для использования exec семейство функций

Второе решение было записано, потому что Jacob Vlijm упомянул в комментариях это для него execlp функция не работала по любой причине. Я нахожу это очень странным потому что execlp принадлежите стандарту os модуль для Python, который является одним из модулей установленное значение по умолчанию. Кроме того, subprocess.Popen() значения по умолчанию к exec() семейство функций; от subprocess документация:

На POSIX, с shell=False (значение по умолчанию): В этом случае класс Popen использует os.execvp () для выполнения дочерней программы. args должен обычно быть последовательностью. Строку будут рассматривать как последовательность со строкой как единственный объект (программа для выполнения).

(Примечание "По POSIX" означает "POSIX совместимая ОС"; Ubuntu совместима POSIX),

Таким образом это не походит на проблему с самой функцией, но с системой пользователя. Тем не менее, я записал второй сценарий. Тот использование subprocess модуль и полагается xdotool, который в основном автоматизирует ярлык Ctrl+C требования для Вас и затем запустит Калеку. Мне лично не нравится этот так же, так как это требует, чтобы дополнительный объект был установлен, но это имеет преимущество необходимости всего в одном сочетании клавиш.

Идея, однако, является тем же. Мы все еще используем инструменты Gtk для запросов содержания буфера обмена и в каждом случае, сценарии должны быть связаны с ярлыком.

Решение № 1, два ярлыка, минимальные зависимости

Использование: выберите файл и нажмите Ctrl+C для копирования файла сначала, затем нажмите ярлык, который Вы присвоили этому сценарию. execlp функция заменит процесс сценария 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 __name__ == '__main__': main()

Решение № 2: единственный ярлык, xdotool зависимость

Использование для этого сценария более просто: выберите файл (файлы) в Наутилусе и нажмите сочетание клавиш.Примечание: Вы должны иметь xdotool установленный, чтобы это работало, использование 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 __name__ == '__main__': main()

Установка ярлыка

В обоих случаях необходимо было связать сценарий с ярлыком. Настройки Открытой системы-> Клавиатура-> Ярлыки-> Пользовательский. Нажмите + кнопка. Дайте весь (!) путь к файлу как команда. Например, /home/User_Name/bin/clipboard_launch.py

enter image description here

Присвойте ярлык, чтобы быть чем-то разумным. Например, так как мы звоним Калеке, я присвоил свой сценарий Ctrl+Super+G.

5
ответ дан 1 December 2019 в 13:23

Открытие выбранного файла в определенном приложении от ярлыка

Вдохновленный понятием @Serg (+1), другого подхода к тому, как реализовать его:

Сценарий

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

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

Как использовать

  1. Для сценария нужны оба pyperclip и xdotool (для xdotool- less использование, см. примечания):

    • для 16,04 +:

      sudo apt-get install python3-pyperclip xdotool
      
    • для 14,04:

      sudo apt-get install python3-pip xdotool
      sudo pip3 install pyperclip
      
  2. Скопируйте сценарий в пустой файл, сохраните его как open_ingimp.py

  3. Добавьте его к shortut ключу: Выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:

    python3 /path/to/open_ingimp.py
    

Именно. Теперь выберите действительный документ и нажмите сочетание клавиш. Файл откроется в Gimp.

Объяснение

  • При нажатии Ctrl+C, в то время как файл выбран, путь к файлу копируется в буфер обмена. Мы моделируем это с:

    subprocess.call(["xdotool", "key", "Control_L+c"])
    
  • Это складывается python pyperclip модуль просто производит путь, разделенный от file:// при использовании pyperclip.paste() (это буквально не вставит, но сделает путь доступным в сценарии).
  • Затем все, что мы должны заставить сценарий сделать, выполняется команда для открытия файла с gimp.

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

Примечания

  • Если нажатие Ctrl+C прежде, чем нажать ярлык для открытия файла в Калеке приемлемо, мы могли даже сократить сценарий почти к остроте:

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

    Это сделало бы установку xdotool ненужный.

  • Мы могли украсить/совершенствовать сценарий немного курса, чтобы только работать на определенных расширениях или подать заявку, подвергающуюся аргументу. Просто упоминание.

  • Мы могли даже установить несколько опций: открытый тип файла с приложением 1, тип файла B с application2, не смешивая с приложениями по умолчанию для открытия файла, или смешивая с опциями щелчка правой кнопкой.

2
ответ дан 1 December 2019 в 13:23

Другие вопросы по тегам:

Похожие вопросы: