2014年05月24日

KRunnerのプラグインを作ってみる

私がWindows使ってて非常によく使うショートカットが「Win+R」です。
何が便利かって、主に以下の理由です。

1.「c:」や「e:」でドライブルートを即開ける(キーを5回押すだけ!)
2.「cmd」や「calc」等、パスが通ってるexeを即開ける
3.あらゆるWindowsで動作する

頻繁に使うものは自前で作ったランチャーで開くんですが、
そうでもないものは大体これで開く癖がついています。
(なので、スタートメニューから起動ってほとんどしません)

KDEにしてみた時、KRunnerがそれっぽかったんで
キー割り当てて使ってたんですが、やっぱりWin+Rみたいにはいかない。

一応Linuxルートは「/」だけで開けるんですが、
ドライブのルートを開くには「/media/USER/C」まで打たないといけない。
端末は「konsole」と7文字も必要。c:とかcmdとか使わせて欲しい。

なので、作ってみました。KRunnerのプラグイン。

で、まず困ったのは、日本語の情報少なすぎィ!
2大デスクトップの1機能のプラグインですよ?Windowsだったら
掃いて捨てるほど出てくるでしょうに、もう全然ない。皆無。空虚。

まあいい。仕方ない。英語大嫌いな私が頑張りました。
※ これ見たLinux好きでPGではなくて翻訳できる人、頑張ってください。

本家はこっち。英語出来る人ならすぐ分かります。
http://techbase.kde.org/Development/Tutorials/Plasma/PythonRunner
私はNifty翻訳先生に聞きながら。半分はソースなんで楽ではありました。
ディレクトリ構成は本家に書いてますので割愛。

まずはmetadata.desktop
[Desktop Entry]
Name=プログラムの実行 for Linux
Comment=安西先生…Win+Rをやりたいです…
Type=Service
Icon=dialog-information
ServiceTypes=Plasma/Runner
X-Plasma-API=python
X-Plasma-MainScript=code/main.py
X-KDE-PluginInfo-Author=私の名前
X-KDE-PluginInfo-Email=
X-KDE-PluginInfo-Name=winrplugin
X-KDE-PluginInfo-Version=0.10
X-KDE-PluginInfo-Website=
X-KDE-PluginInfo-License=WTFPL
X-KDE-PluginInfo-EnabledByDefault=true


こんな感じ。超適当。
次にmain.py
# -*- coding: utf-8 -*-
# とりあえずサンプルをまんまパクります
from PyKDE4 import plasmascript
from PyKDE4.plasma import Plasma
from PyKDE4.kdeui import KIcon
import os
import re

"""
# 必須インターフェース(っぽい)
class testclass(plasmascript.Runner):
  def init(self):            # 初期化?
  def match(self, context):      # 検索がヒットしたかどうかかな?
  def run(self, context, match):    # ヒットして実行する場合?
def CreateRunner(parent):      # クラス外でクラスのインスタンスを作成して返せってことらしいよ!
"""

#------ メインクラス ------#
class winr(plasmascript.Runner):
  
  def init(self):
    # called upon creation to let us run any intialization
    # tell the user how to use this runner
    
    # 意味なさそうなので削除
    #self.addSyntax(Plasma.RunnerSyntax("m :q:", "Display :q: in a messagebox"))

    # ドライブがマウントされてる場所。
    # 取得方法が分からなかったんで直書きしました。
    self.mountpath = "/media/USER/"

  def match(self, context):
    
    # called by krunner to let us add actions for the user
    if not context.isValid():
      return

    q = context.query()
    
    # 処理予定フラグ
    ismine = 0

    # cmdかな?
    if q == "cmd":
      ismine = 1
    
    # Windows風パスかな?
    if re.match("^[a-zA-Z]:.*$",q) is not None:
      # linuxパスに変換
      q = self.mountpath + unicode(q).replace(u":\","/").replace(":","/").replace(u"\","/")
      # パスがあるかな?
      if os.path.exists(q):
        ismine = 1
    
    # 処理予定がないなら終了
    if ismine == 0:
      return
    
    # 共通処理
    m = Plasma.QueryMatch(self.runner)
    m.setType(Plasma.QueryMatch.ExactMatch)
    m.setData(q)
    
    # メッセージとアイコン追加
    # KIconには/usr/share/icons/default.kde4/のものが使える?
    if q == "cmd":
      m.setIcon(KIcon("utilities-terminal.png"))
      m.setText(u"端末(konsole)を開きます")
    else:
      m.setIcon(KIcon("folder.png"))
      m.setText(u"ディレクトリを開きます " + q)
    
    # 一致した旨を通知
    context.addMatch(q, m)

  def run(self, context, match):
    # called by KRunner when the user selects our action,    
    # so lets keep our promise
    
    q = str(match.data().toString())
    if q == "cmd":
      # cmdの場合はkonsole実行
      os.system("konsole")
    else:
      # それ以外はパスなんでxdg-open実行
      os.system("xdg-open " + q)

def CreateRunner(parent):
  # called by krunner, must simply return an instance of the runner object
  return winr(parent)
コピペする場合は全角空白×2をTabか半角空白4文字に置換。
後は本家通りにplasmapkgでインストール。


今回初めてpythonを使ってみたんですが、フィトンって読むんだとばかり。
たぶんphytonと空目したんでしょうね。英語圏の人も間違うみたいです。

このpythonなんですが、日本では流行ってません。Linux自体もそうですが。
なんでかなーって思ってたんですが、少し理由が分かった気がします。
どっちも日本語を使い出すと途端にハードルが跳ね上がるんですよ。

pythonもasciiだけで作ってる時はかなり楽しかった。なのに
Unicode使い出した途端、もうしっちゃかめっちゃかな言語に成り下がる。
python3.0はそこら辺随分楽になってるみたいですが、下位互換性を捨てて
再設計したのかも知れませんね。

ま、KDEはpython2.7.5を使ってるので
3.0以降を使うという選択肢は無かったわけですが。

LinuxもUbuntuあたりならほぼ大丈夫でしょうが、
LinuxMintKDEだと日本語化出来ないことがちょくちょくありますし。
やっぱ日本語だけで使いたいもんです。
タグ:python KRunner
posted by Nick at 15:10| Comment(0) | TrackBack(0) | Linux
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/97915098

この記事へのトラックバック