Усталый от щелчка правой кнопкой по 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"
Это никогда не берет выбранный файл в окне наутилуса правильно как бы то ни было.
Существует ли способ сделать это?
Примечание: в этом ответе существует два решения, каждый с его собственными преимуществами. Пользователи поощряются узнать, какой работает лучше всего на их конкретный случай.
Наутилус отдельно не предлагает способ определить пользовательские сочетания клавиш и их действия. Это - главная причина, почему сценарии, которые Вы попробовали, перестали работать. $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
может только использоваться через подменю щелчка правой кнопкой. Но мы можем использовать что-то еще для достижения желаемого результата - ярлыки, определенные в системном буфере обмена и настройках.
Наутилус создается в чем-то известном как инструментарий Gtk. Это - обширная библиотека для того, чтобы создать графические приложения, и среди прочего это имеет утилиты для взаимодействия через интерфейс с системным буфером обмена. Наутилус, будучи файловым менеджером, является особенным в том, что он производит список URIs (в форме file:///home/user/Pictures/encoded%image%name.png
) к буферу обмена (который не является известным фактом большинству пользователей, и я учился совсем недавно также). По-видимому, это - способ, которым файловые менеджеры GUI копируют файлы.
Мы можем использовать тот факт путем копирования URI файла (или быть точным, список URI; даже если существует всего один, это принимает значение по умолчанию к списку). Затем мы можем передать тот список gimp
. Эти два решения, представленные ниже, воздействуют точно на ту идею.
Я лично рассматриваю решение № 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 для запросов содержания буфера обмена и в каждом случае, сценарии должны быть связаны с ярлыком.
Использование: выберите файл и нажмите 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()
Использование для этого сценария более просто: выберите файл (файлы) в Наутилусе и нажмите сочетание клавиш.Примечание: Вы должны иметь 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
Присвойте ярлык, чтобы быть чем-то разумным. Например, так как мы звоним Калеке, я присвоил свой сценарий Ctrl+Super+G.
Вдохновленный понятием @Serg (+1), другого подхода к тому, как реализовать его:
#!/usr/bin/env python3
import subprocess
import pyperclip
subprocess.call(["xdotool", "key", "Control_L+c"])
subprocess.Popen(["gimp", pyperclip.paste()])
Для сценария нужны оба 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
Скопируйте сценарий в пустой файл, сохраните его как open_ingimp.py
Добавьте его к 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, не смешивая с приложениями по умолчанию для открытия файла, или смешивая с опциями щелчка правой кнопкой.