右クリックにうんざり Open With 特定のアプリケーションでファイルを開くには、ショートカットを設定して、たとえばギンプ。ただし、デフォルトのオープンアクションは変更しません。 (Ubuntu 14.04)
指定したアプリケーション(gimp)で、選択したNautilusファイルを開くために以下のスクリプトを実行するキーボードショートカットを設定しました。
!/bin/sh
for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
/usr/bin/gimp "$file"
done
そして...
!/bin/sh
/usr/bin/gimp "$1"
ただし、nautilusウィンドウで選択したファイルを適切にピックアップすることはありません。
これを行う方法はありますか?
NOTE:この回答には2つのソリューションがあり、それぞれに利点があります。ユーザーは、特定のケースに最適なものを見つけることをお勧めします。
Nautilus自体は、カスタムキーボードショートカットとそのアクションを定義する方法を提供しません。これが、試行したスクリプトが失敗した主な理由です。 $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
は、右クリックサブメニューでのみ使用できます。ただし、設定やシステムクリップボードで定義されたショートカットなど、他の何かを利用して目的の結果を得ることができます。
Nautilusは、Gtkツールキットとして知られているものに組み込まれています。これは、グラフィックアプリケーションを作成するための広範なライブラリであり、特にシステムクリップボードとインターフェイスするためのユーティリティを備えています。ファイルマネージャであるNautilusは、URIのリスト(file:///home/user/Pictures/encoded%image%name.png
の形式)をクリップボードに出力するという点で特別です(ほとんどのユーザーにはよく知られた事実ではなく、私は学びました- 最近も同様 )。どうやらこれはGUIファイルマネージャがファイルをコピーする方法です。
ファイルのURI(または正確には、URIのリスト。1つだけの場合でも、デフォルトでリストになります)をコピーすることで、この事実を活用できます。次に、そのリストをgimp
に渡すことができます。以下に示す2つのソリューションは、まさにそのアイデアに基づいています。
私は個人的にソリューション1を優先するものと考えています。最初に手動でコピーショートカットを押し、次にスクリプトショートカット(2つのキーボードショートカット)を使用しますが、依存関係が少ないという利点があります。それはより手作業のアプローチですが、かなりまともです。 os.execlp
呼び出しを使用します。これにより、スクリプトのプロセスがGimpに置き換えられ、Gimp
の単なる踏み台として機能します。 exec
関数ファミリを使用することは、スクリプトおよびシステムプログラミングで頻繁に行われます
2つ目のソリューションは、Jacob Vlijmが何らかの理由でexeclp
関数が機能しなかったとコメントで述べているために書かれました。 execlp
はpythonの標準os
モジュールに属しているため、これは非常に奇妙です。これはデフォルトでインストールされるモジュールの1つです。さらに、subprocess.Popen()
のデフォルトはexec()
関数ファミリーです。 subprocess
ドキュメントから:
POSIXでは、Shell = False(デフォルト)を使用します。この場合、Popenクラスはos.execvp()を使用して子プログラムを実行します。 argsは通常シーケンスでなければなりません。文字列は、文字列を唯一の項目(実行するプログラム)としてのシーケンスとして扱われます。
(「POSIXで」は「POSIX準拠のOS」を意味します。UbuntuはPOSIX準拠です)
したがって、機能自体の問題ではなく、ユーザーのシステムの問題のように見えます。それでも、2番目のスクリプトを書きました。その1つはsubprocess
モジュールを使用し、xdotool
に依存しています。これは基本的に押すことを自動化します Ctrl+C ショートカットを使用して、Gimpを起動します。私は個人的にはこれをあまり好きではない。それは追加のアイテムをインストールする必要があるからであるが、キーボードショートカットが一つしか必要ないという利点がある。
ただし、考え方は同じです。 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 __== '__main__': main()
このスクリプトの使用法は簡単です。Nautilusでファイルを選択し、キーボードショートカットを押します。 NOTE:これが機能するには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 __== '__main__': main()
どちらの場合も、スクリプトをショートカットにリンクする必要があります。システム設定->キーボード->ショートカット->カスタムを開きます。クリック + ボタン。コマンドとしてファイルへのフル(!)パスを指定します。たとえば、/home/User_Name/bin/clipboard_launch.py
ショートカットを適切なものに割り当てます。たとえば、Gimpを呼び出しているため、スクリプトを 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
として保存します
ショートカットキーに追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 「+」をクリックして、コマンドを追加します。
python3 /path/to/open_ingimp.py
それでおしまい。有効なドキュメントを選択して、ショートカットキーを押します。ファイルはGimp
で開きます。
押すとき Ctrl+C、ファイルが選択されている間、ファイルへのパスがクリップボードにコピーされます。私たちはそれを次のようにシミュレートしています:
subprocess.call(["xdotool", "key", "Control_L+c"])
python
のpyperclip
モジュールは、pyperclip.paste()
の使用時にfile://
から削除されたパスを生成するだけです(これは文字通り貼り付けられませんが、スクリプト内でパスを使用可能にします)。その後、スクリプトを実行するために必要なのは、gimp
でファイルを開くコマンドを実行することだけです。
subprocess.Popen(["gimp", pyperclip.paste()])
Ifを押す Ctrl+C ショートカットを押してGimpでファイルを開く前に、スクリプトをほぼ1行に短縮することもできます。
#!/usr/bin/env python3
import subprocess
import pyperclip
subprocess.Popen(["gimp", pyperclip.paste()])
これにより、xdotool
のインストールが不要になります。
定義済みの拡張機能でのみ実行されるように、スクリプトを少し修正したり、アプリケーションを引数の対象にすることができます。ただ言及してください。
複数のオプションを設定することもできます。ファイルタイプAをアプリケーション1で開き、ファイルタイプBをアプリケーション2で開き、ファイルを開くデフォルトのアプリケーションをいじったり、右クリックオプションをいじったりします。