web-dev-qa-db-ja.com

nautilusで選択したファイルを開くためのショートカットキーを設定するにはどうすればよいですか?

右クリックにうんざり 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ウィンドウで選択したファイルを適切にピックアップすることはありません。

これを行う方法はありますか?

3
Seek Truth

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つのソリューションは、まさにそのアイデアに基づいています。

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ツールを使用してクリップボードの内容を照会しますが、それぞれの場合、スクリプトはショートカットにバインドする必要があります。

ソリューション#1、2つのショートカット、最小限の依存関係

使用法:ファイルを選択して押します 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()

解決策2:単一のショートカット、xdotool依存関係

このスクリプトの使用法は簡単です。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

enter image description here

ショートカットを適切なものに割り当てます。たとえば、Gimpを呼び出しているため、スクリプトを Ctrl+Super+G

4

特定のアプリケーションで選択したファイルをショートカットから開く

@Serg(+1)の概念に触発され、それを実装する方法に関する別のアプローチ:

スクリプト

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

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

使い方

  1. スクリプトには、pyperclipxdotoolの両方が必要です(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. ショートカットキーに追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 「+」をクリックして、コマンドを追加します。

    python3 /path/to/open_ingimp.py
    

それでおしまい。有効なドキュメントを選択して、ショートカットキーを押します。ファイルはGimpで開きます。

説明

  • 押すとき Ctrl+C、ファイルが選択されている間、ファイルへのパスがクリップボードにコピーされます。私たちはそれを次のようにシミュレートしています:

    subprocess.call(["xdotool", "key", "Control_L+c"])
    
  • pythonpyperclipモジュールは、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で開き、ファイルを開くデフォルトのアプリケーションをいじったり、右クリックオプションをいじったりします。

2
Jacob Vlijm