Hatena::ブログ(Diary)

Koonies/こりゃいいな! このページをアンテナに追加 RSSフィード

2009 | 06 | 07 | 08 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 10 |
2011 | 01 | 02 | 05 | 06 | 07 | 08 | 09 |
2012 | 05 | 06 |

2011-08-28

keyhacでテキストエディタのF1キーに任意のヘルプファイルのキーワード表示に関連づける

またまたkeyhacでのカスタマイズネタテキストエディタプログラムを書いていると、そのプログラム言語ヘルプファイルが見たいってことがしばしばあります。そんなときに役立つ設定です。

■ 使い方

使い方はカンタン。テキストエディタ上で調べたい単語を選択しF1を押します。

そうすれば設定しておいたchm形式のヘルプファイルからキーワード検索し、その項目を表示します。

コード

・ chm_viewer.py

まずは↓の部分をchm_viewer.pyという名前保存し、extensionフォルダに置いてください。

# chm_viewer.py
# http://d.hatena.ne.jp/pipehead/20071121/1195597559 のCraftLaunchEx用コードをほぼそのまま利用

# Windows 2000/XP では Unicode 版 (HtmlHelpW) を使用し、2000/XP 以外では ANSI 版 (HtmlHelpA) を使用します。
def _IsWinNT5OrLater():
    import sys

    (major, platform) = sys.getwindowsversion()[0:4:3]
    # VER_PLATFORM_WIN32_NT: 2
    return ((platform == 2) and (major >= 5))

winNT5OrLater = _IsWinNT5OrLater()


def _T(string):
    if isinstance(string, str):
        string = unicode(string, 'utf-8')
    if not winNT5OrLater:
        return string.encode('mbcs')
    return string


import ctypes

class c_tchar_p(ctypes._SimpleCData):
    if winNT5OrLater:
        _type_ = 'Z' # c_wchar_p
    else:
        _type_ = 'z' # c_char_p


# WinUser.h
GetDesktopWindow = ctypes.windll.user32.GetDesktopWindow


# HtmlHelp.h
HH_DISPLAY_TOC    = 0x0001
HH_KEYWORD_LOOKUP = 0x000D
HH_CLOSE_ALL      = 0x0012


from ctypes.wintypes import BOOL

class HH_AKLINK(ctypes.Structure):
    _fields_ = [
        ('cbStruct',     ctypes.c_int), # sizeof this structure
        ('fReserved',    BOOL),         # must be FALSE (really!)
        ('pszKeywords',  c_tchar_p),    # semi-colon separated keywords
        ('pszUrl',       c_tchar_p),    # URL to jump to if no keywords found (may be NULL)
        ('pszMsgText',   c_tchar_p),    # Message text to display in MessageBox if pszUrl is NULL and no keyword match
        ('pszMsgTitle',  c_tchar_p),    # Message text to display in MessageBox if pszUrl is NULL and no keyword match
        ('pszWindow',    c_tchar_p),    # Window to display URL in
        ('fIndexOnFail', BOOL)          # Displays index if keyword lookup fails.
    ]


if winNT5OrLater:
    HtmlHelp = ctypes.windll.LoadLibrary('hhctrl.ocx').HtmlHelpW
else:
    HtmlHelp = ctypes.windll.LoadLibrary('hhctrl.ocx').HtmlHelpA


def HtmlHelpDisplayTOC(chmPath, data=None):
    u"""指定されたヘルプウィンドウでヘルプトピックを開く

    引数  : chmPath - 文字列 - コンパイル済みヘルプまたはコンパイル済みヘルプ
            ファイル中のトピック
    引数  : data - 数値 - コンパイル済みヘルプファイル中のトピックへのポインタ
    戻り値: ヘルプウィンドウのハンドルを返す"""
    return HtmlHelp(GetDesktopWindow(), _T(chmPath), HH_DISPLAY_TOC, data)

def HtmlHelpKeywordLookup(chmPath, kwd):
    u"""コンパイル済みヘルプファイルからキーワードを検索する

    引数  : chmPath - 文字列 - コンパイル済みヘルプファイル
    引数  : kwd - 文字列 -  検索するキーワード
            複数の項目はセミコロン `;' で区切る
    戻り値: ヘルプウィンドウのハンドルを返す"""
    aklnk = HH_AKLINK(ctypes.sizeof(HH_AKLINK), False, _T(kwd), None, None,
                      None, None, True)
    return HtmlHelp(GetDesktopWindow(), _T(chmPath), HH_KEYWORD_LOOKUP,
                    ctypes.byref(aklnk))

def HtmlHelpCloseAll():
    u"""呼び出しプログラムによって開かれたヘルプウィンドウをすべて閉じる

    戻り値: なし"""
    HtmlHelp(None, None, HH_CLOSE_ALL, 0)
config.py

で、↓ がconfig.pyの設定部分で、キーの割り当てとヘルプファイルのパス設定などを行います。

下記の例ではメモ帳F1を押すとPythonヘルプファイル(ダウンロードファイル一覧 - Python Japanese Environment - OSDN)を表示します。

# config.py

from keyhac import *

def configure(keymap):

    ## 選択文字列をヘルプファイル(*.chm)から検索
    def select_word_help():
        def _select_word_help():
            # ヘルプファイルのフルパス
            chm_path = r"C:\Program Files\craftware\keyhac\Python26-DocJa1.chm"

            before = getClipboardText()

            # 選択文字列をコピー
            copy_key = "C-c"
            keymap.command_InputKey(copy_key)()

            maxcnt = 10
            while maxcnt > 0:
                maxcnt -= 1

                # クリップボードから文字列取り込み
                select_word = getClipboardText()
                if select_word != before:
                    break

                # クリップボードの反映待ち
                import time
                time.sleep(0.1)

            if select_word:
                import chm_viewer
                chm_viewer.HtmlHelpKeywordLookup(chm_path, select_word)

            # クリップボードを元の状態に戻して終わり
            setClipboardText(before)

        # ホットキー経由での関数呼び出し
        keymap.callHotKey(_select_word_help)

    # メモ帳のキーマップ
    keymap_notepad = keymap.defineWindowKeymap(exe_name=u"notepad.exe")

    keymap_notepad["F1"] = select_word_help

■ さいごに

この前コードを書いていたら、ふとVisual Studioみたいに普段使いのエディタでもヘルプ表示ができたらいいのになァと思い立ち、ちょっと調べてみたら、ほぼそのまま流用可能なこちらのエントリを見つけたので、設定してみました。よければどうぞ。

■ 参考リンク

ページが見つかりませんでした - craftware

HTML ヘルプを表示する - anonymous苦労者

2011-08-18

keyhacで[半角/全角]キーの1回・2回押しでIME OFF・ONを切り替える

またまたkeyhacでのカスタマイズネタについて。IMEのON/OFFはいつまで経っても大して使い勝手が良くならない。どうゆうことかと言うと文字をタイプし始めてから「あ!半角のままだった……」と気づきIMEをONにして漢字入力する。またその逆も。

これは[半角/全角]キーがトグルスイッチになっているためで、いまどちらの状態にあるのかを把握せずにON/OFFできるようになれば大幅に打ち損じが減るんじゃないかと思いついた。つまり……

★ 現状

IME OFFの状態でキーを押すとIMEがONONのときに押すとOFFになる。

★ 変更後

1回ポンっと押すとIMEをOFFダブルクリックのようにタタンっと2回連続押しだとIMEがONになる。

これをkeyhacで実現するのが、以下のスクリプトです。

コード

from keyhac import *

def configure(keymap):

    ## IMEを切り替える
    #
    #  @param flag      切り替えフラグ(True:IME ON / False:IME OFF)
    #
    def switch_ime(flag):

        # バルーンヘルプを表示する時間(ミリ秒)
        BALLOON_TIMEOUT_MSEC = 500

        # if not flag:
        if flag:
            ime_status = 1
            message = u"[あ]"
        else:
            ime_status = 0
            message = u"[_A]"

        # IMEのON/OFFをセット
        keymap.wnd.setImeStatus(ime_status)
        # IMEの状態をバルーンヘルプで表示
        keymap.popBalloon("ime_status", message, BALLOON_TIMEOUT_MSEC)

    ## キーの1回/2回押しで引数の関数コールを切り替える
    #
    #  @param func      コールする関数
    #
    #  引数の func は1回押しなら func(True)、2回連続押しなら func(False)
    #  でコールされる
    #
    def double_key(func, cache_t={}):

        # 2回連続押し判断の許容間隔(ミリ秒)
        TIMEOUT_MSEC = 500

        func_name = func.__name__

        # 前回時刻
        t0 = 0
        if func_name in cache_t:
            t0 = cache_t[func_name]
        # 現在時刻を保存
        import time
        cache_t[func_name] = time.clock()
        # 前回実行からの経過時間(ミリ秒)
        delta_t = (cache_t[func_name] - t0) * 1000

        # 関数コール
        if delta_t > TIMEOUT_MSEC:
            func(False)     # 1回押し
        else:
            func(True)      # 2回連続押し

    keymap_global = keymap.defineWindowKeymap()

    if 1:   # [半角/全角]
        keymap_global["U-(243)"] = lambda: double_key(switch_ime)  # 押す
        keymap_global["D-(243)"] = lambda: None                    # 離す
        keymap_global["U-(244)"] = lambda: double_key(switch_ime)  # 押す
        keymap_global["D-(244)"] = lambda: None                    # 離す

    if 0:   # [変換]
        keymap_global["S-(28)"] = "(28)"            # Shift+[変換]で再変換
        keymap_global["(28)"] = lambda: double_key(switch_ime)

    if 0:   # [無変換]
        keymap_global["(29)"] = lambda: double_key(switch_ime)

↑ [変換]・[無変換]キーがいい場合は、if 1 に変更してください。

■ さいごに

慣れれば便利だと思うので、よかったら使ってみてください!

■ 参考リンク

2011-08-09

keyhacでカラーピッカー(画面上の任意の場所から色コード取得)

20110808232618現在はまっているkeyhac*1Win+Cを押すとマウスカーソル位置の色コードを取得し、クリップボードコピーするようにしてみました。

■ コード

from keyhac import *

def configure(keymap):

    ## バルーンヘルプ(ツールチップ)を指定の位置に開く
    #
    # keyhac_keymap.py / popBalloon() を流用
    #
    def pop_balloon(name, text, timeout=None, pos=None):
        if pos == None:
            # オフセット量
            OFFSET_X = 0
            OFFSET_Y = -20

            # マウスカーソルの位置を取得
            pos_x, pos_y = pyauto.Input.getCursorPos()
            pos_x += OFFSET_X
            pos_y += OFFSET_Y
        else:
            pos_x, pos_y = pos

        keymap.balloon.setText(pos_x, pos_y, text)

        if keymap.balloon_timer:
            keymap.killTimer(keymap.balloon_timer)
            keymap.balloon_timer = None

        if timeout:
            def onTimerCloseBalloon():
                keymap.closeBalloon(name)
            keymap.balloon_timer = onTimerCloseBalloon
            keymap.setTimer(keymap.balloon_timer, timeout)

        keymap.balloon_name = name

    ## カーソル位置のRGB情報取得
    def color_picker():
        root = pyauto.Window.getDesktop()
        img = root.getImage()

        width, height = img.getSize()
        x, y = pyauto.Input.getCursorPos()

        if not (0 <= x < width and 0 <= y < height):
            rgb = u"範囲外"
        else:
            start = (width * y + x) * 3
            buf = img.getBuffer()[start:start + 3]
            r, g, b = [ord(c) for c in buf]

            if 0:  # 10進表記
                rgb = u"(%d,%d,%d)" % (r, g, b)
            else:  # 16進表記
                hex_24_bit = lambda val: u"#%06X" % val
                rgb = hex_24_bit((0x10000 * r) + (0x100 * g) + b)

        pop_balloon("color_picker", rgb, 1500)
        setClipboardText(rgb)
        print rgb

    keymap_global = keymap.defineWindowKeymap()

    # カーソル位置のRGB情報取得
    keymap_global["W-c"] = color_picker

■ さいごに

カーソル位置の色を取得するAutoHotkeyスクリプト - Hail2uに触発され書いてみました。このリンク先とは違って取得するカラーコードは16進表記になっています。もし10進表記の方がよければコードの中の「if 0:」を「if 1:」へ変更してからお使い下さい。

■ 参考リンク

*1:Autohotkeyみたいなフリーソフトで、Pythonコードで色んなソフトのショートカットキーを設定できる

2011-05-08

超便利なChrome拡張のSmooth Gesturesのカスタムアクション設定方法

20110508173109

Google Chromeの拡張機能であるSmooth Gestures。たぶん定番拡張だと思うのですが、カスタムアクション(bookmarkletでの機能追加)の設定方法について検索してみたのですが、公式のヘルプも無いし解説ページも見つからなかったので自力でなんとかしてみました。

以下そのメモです。

・設定方法

■ オプションを開く

[+カスタムアクションを追加]のボタンを押す

20110508173107

■ javascriptでコードを書く&その他設定

ブロックが追加されるので、各項目を設定します。とりあえず手始めに「選択文字列でGoogle検索」です。

20110508173106

1.「starting anywhere」を「有効な選択がされているときのみ」に変更

2.アクションの名前として「Google 検索」を入力

3.アクションの説明として「選択文字列で検索」を入力

4.javascriptのコードを入力 ↓

(function(url){
    window.open(url.replace("%s",encodeURIComponent(window.getSelection())));
})("http://www.google.co.jp/search?q=%s&num=100")

5:[save]ボタンを押す

■ジェスチャーを設定する

他のアクションと同様に登録すればOKです。

20110508173108

これでOK!できてしまえば何てことはないですね。

・検索結果を背面のタブで開く場合は

それと上記のスクリプトだとアクション後に前面のタブで開くのですが、バックグラウンドのタブで開きたい場合は以下のようにすれば良いみたいです。

(function(url){
    var a=document.createElement("a");
    a.href=url.replace("%s",encodeURIComponent(window.getSelection()));
    var event=document.createEvent("MouseEvents");
    event.initMouseEvent("click",true,true,window,0,0,0,0,0,false,false,false,false,1,null);
    a.dispatchEvent(event);
})("http://www.google.co.jp/search?q=%s&num=100")

・他の検索も登録

ちなみに↓の★の部分を変更すれば、色々な検索エンジンも使えます。

(背面タブバージョンも同様です)

(function(url){
    window.open(url.replace("%s",encodeURIComponent(window.getSelection())));
})("★")

↑ の★を ↓ のURLに置き換える

検索エンジンURL
■ google
■ amazon.co.jp
■ amazon.de(ボードゲーム:amazon販売のみに限定)
■ play:game

(ボードゲーム)

■ はてなブックマーク
■ はてなブックマーク

(タグで検索)

■ 英辞郎
■ クックパッド
■ twitter検索
■ 価格.com (注意*1
■ -

これ以外にもChromeの検索エンジン設定(chrome://settings/searchEngines)からURLを持ってくれば大体イケると思います。

リンク上で開始するアクションの設定例

1.「starting anywhere」を「有効なリンクのみ」に変更

2.アクションの名前として「Twitter 検索」を入力

3.アクションの説明として「リンクを検索」を入力

4.javascriptのコードを入力 ↓

(function(url){
    window.open(url.replace("%s",encodeURIComponent(b.targets[0].href)));
})("http://search.twitter.com/search?q=%s")

リンク先のページについてTwitterでの評判が見られます。

ちなみにこれも最後のURL部分を他に変えることで流用が可能です。

・画像上で開始するアクションの設定例

1.「starting anywhere」を「有効な画像のみ」に変更

2.アクションの名前として「TinEye(類似画像検索)」を入力

3.アクションの説明として「画像を検索」を入力

4.javascriptのコードを入力 ↓

(function(url){
    window.open(url.replace("%s",encodeURIComponent(b.targets[0].src)));
})("http://tineye.com/search?pluginver=bookmark_1.0&url=%s")

・さいごに

前は別のマウスジェスチャの拡張を使っていましたが、思い切って乗換えてみました。まだ使い始めてから日が浅いので↑のコードも何か不具合があるかもしれませんが、いまのところは良い感じです。よければご参考に。

*1:価格.comのみコード部分のencodeURIComponent→escapeに変更の必要あり、しないと検索結果が文字化け

2010-04-09

便利!Chromeでライブブックマーク再現のExtension「RSS Live Links」

FirefoxからChromeに乗換えたとき、Chromeにはライブブックマーク機能がないことを知り、ちょっと不便だなと思いながら、使い続けて1年、最近になってライブブックマークを再現するエクステンションを見つけたので、それの紹介です。

そのエクステンションの名前は「RSS Live Links」。

以下、導入方法です。

1.「RSS Live Links」のダウンロード

RSS Live Links - Google Chrome extension gallery

上記サイトに行き、「Install」 ボタンを押し、インストールをします。

20100408220650

2.ライブブックマーク用のブックマークフォルダの作成

ブックマークマネージャーまたは、ブックマークバー上で右クリックの「フォルダの追加...」で、「RSS Live Links」という名前のブックマークフォルダを作ります。(場所はドコでもOK)

20100408220651

3.フィード登録用のエクステンションもインストール

一応RSS Live Links本体でもフィード登録は可能ですが、若干使いにくいのでフィード登録専用のエクステンションもインストールします。

RSS Subscription Extension (by Google) - Google Chrome extension gallery

上記サイトに行き、「Install」 ボタンを押し、インストールをします。

そして「chrome://extensions/」から、この拡張のオプションを開きます。オプション画面の「追加」ボタンを押すと次のような画面になるので

20100408223545

説明:

RSS Live Links

URL

chrome-extension://hcamnijgggppihioleoenjmlnakejdph/subscribe.html?%s

と入力し、「保存」ボタンを押します。

(*他のRSSリーダーを使用しないなら「フィードの登録時に常にデフォルトのリーダーを使用します。」にチェックボックスをONにする)

以上で、RSS Live Linksと連携させる設定は完了です。

4.RSSフィードの登録

ではRSS登録のサンプルとして、このホームページで試してみます。

  • Koonies/こりゃいいな!」を開くとアドレスバーの右側にRSSアイコンが表示されるので、これをクリックします。

20100408233404

  • 次に、「RSS 2.0」をクリック ↓

20100408233403

  • それから「RSS Live Links」を選択し、「今すぐ登録」をクリック ↓

20100408233402

  • フィードの名前を入力し、「Save」をクリック ↓

20100408233401

  • 以上で、登録は完了しました。

(もしかすると、ここで一度だけ再起動が必要かも? 上記手順2で追加した「RSS Live Links」フォルダの中が空なら再起動をして下さい。そうすれば登録が反映されていると思います。)

20100408233400

これでようやく、Chromeでもライブブックマークが使えるようになりました。

なお英語ですが、この拡張のヘルプは「RSS Live Links README - Google ドキュメント」でみることができます。

★ さいごに

そんな訳で、Firefoxでライブブックマークを使っていたのにChromeに移行したら使えなくなってGoogleリーダーを使いだしたという方や、ライブブックマーク未体験の方も一度は試してみてはいかがでしょうか。かなーり便利です。

★ 追記

いまのバージョンでは、

1.オプション画面で「Subscriptions」で対象の項目を選択

2.「Modify」ボタンを押す

3.その先のオプション画面で「Use bookmark folder」にチェックを付ける

4.最後に「Save Options」を押す

という設定をしないとフォルダに反映されないようです。

2009 | 06 | 07 | 08 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 10 |
2011 | 01 | 02 | 05 | 06 | 07 | 08 | 09 |
2012 | 05 | 06 |
日記の検索

ads
最近のコメント
etc
あわせて読みたいブログパーツ