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 |

2012-06-11

Koonies2012-06-11

TortoiseHgのカスタムツールバーを設定する方法

TortoiseHg 2.4.1リリースされました。で、1つ前のバージョン2.4で追加されたカスタムツールバーはどうやって設定するのかずっと気になっていましたがようやく分かったのでメモを兼ねて、書いておきます。

設定方法

[tortoisehg-tools]

# Execute a mercurial command. These _MUST_ start with "hg"

# Note that we can use any built-in TortoiseHg icon

update_to_tip.command = hg update tip

update_to_tip.tooltip = Update to tip

update_to_tip.icon = hg-update

no title

上記のように設定ファイルへ[tortoisehg-tools]という項目を追加し、それに続けてコマンドの設定を書きます。それで書けたらソフトを再起動します。

.command必須で、.tooltip.iconオプション(無くても可)ということです。ちなみに上記の引用元のサイト記述例は

誤:update_to_tip.ico = hg-update

正:update_to_tip.icon = hg-update

という風にnが抜けているためアイコンが正しく設定できていないようです。

それとアイコンの設定にはicoファイルのフルパスの他、hg-updateのように内蔵アイコンも設定可能みたいです。これ以外にも下記のアイコンが使える模様。

(右上のスクリーンショットはコレの一覧)

application-exit

document-new

edit-cut

edit-find

go-down

go-jump

go-next

go-previous

go-up

hg-annotate

hg-archive

hg-clone

hg-commit

hg-grep

hg-incoming

hg-log

hg-merge

hg-outgoing

hg-pull

hg-push

hg-qguard

hg-qpop-all

hg-qpop

hg-qpush-all

hg-qpush

hg-rename

hg-status

hg-tag

hg-update

mail-forward

process-stop

tasktab-refresh

thg-console

thg-log-load-all

thg-mq

thg-qreorder

thg-reporegistry

thg-sync

view-filter

view-refresh

さいごに

どうやって設定するんだろ、と1ヶ月もモヤモヤしてたのがスッキリしました。

よかったら参考にしてください。それでは。

2012-05-11

Koonies2012-05-11

TortoiseHgでAmendを使うと2つ前のコミットをやり直せる

TortoiseHgはバージョン管理ソフトMercurialWindowsフロントエンドで、つい先日にリリースされた最新版v2.4でAmendというコマンドが追加されました。Amendを使えば、お手軽に直前のコミットをやり直すことが可能になります。

以前のバージョンでもロールバックして、コミットし直せば同様のことが可能だった訳ですが、実際の操作手順としてはAmendを使った方がコミットのメッセージコピーする必要もないため地味に便利です。リリースされてからまだ数日ですが、既に何度もお世話になってます。

さてタイトルにも書いた「2つ前」の修正の話。

これまでは「1つ前」の修正ならロールバック、それ以上前の修正をやりたい場合はMQなどのエクステンションを使う必要がありました。

最新版では「1つ前」の修正ならロールバックまたはAmendのどちらでもOKになりました。という事はロールバックして、更にAmendすれば「2つ前」を修正できる??という疑問が湧いてきますよね。それで試してみたら、本当に出来ました

手順

1. まずはロールバック

2. 直前の変更点をシェルフ待避

3. コミットの画面にする

4. コミットボタンの隣の▼をクリックし、"Amend current revision"をクリック*1

5. するとボタン表示がコミット→Amendに変わり、「2つ前」のコミットメッセージが表示されるので、修正してAmendボタンをクリック

6. シェルフで待避した変更点を戻し、あとは普通にコミットをやり直す。

さいごに

Mercurialでも同様のことが出来そうな気がしますね。試してないけど。それでは。

*1:ただしAmendはMQエクステンションが有効でないと使用できないみたいなので注意!

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-08-08

keyhacでクリップボード内のJavaScriptコードを整形/圧縮(JSBeautifier/SlimIt)

JavaScriptをさわってる人ならご存知の人も結構いそうなno title。JavaScriptコードを見やすく整形してくれるWebサービスです。

僕はブックマークレットを作る際など便利でよく使っているのですが、サイトを見てるとコマンドラインバージョンということでPythonコードでも公開されていました。探したらSlimItという圧縮する方も発見。

keyhac*1でクリップボード内のテキストに対して直接実行できたら便利だろうなと書いたのが ↓ のコード。

Win+Jで整形、Win+Sift+Jで高圧縮、Win+Ctrl+Jで低圧縮、というキー配置にしています。

from keyhac import *

## 関数を返す関数にするデコレータ
def ret_func(func):
    import functools

    @functools.wraps(func)
    def _ret_func(*args, **kw):
        @functools.wraps(func)
        def __ret_func():
            return func(*args, **kw)
        return __ret_func
    return _ret_func

## JobQueue/JobItem でサブスレッド処理にするデコレータ
def job_queue(func):
    import functools

    @functools.wraps(func)
    def _job_queue(*args, **kw):

        num_items = JobQueue.defaultQueue().numItems()
        if num_items:   # 処理待ちアイテムがある場合は、その数を表示
            print u"JobQueue.defaultQueue().numItems() :", num_items

        def __job_queue_1(job_item):
            return func(*args, **kw)

        def __job_queue_2(job_item):
            # print "job_queue : ", func.__name__, args, kw
            pass

        job_item = JobItem(__job_queue_1, __job_queue_2)
        JobQueue.defaultQueue().enqueue(job_item)

    return _job_queue

## JavaScriptコードを整形
# JSBeautifier : http://jsbeautifier.org/
@job_queue
def jsbeautifier():
    import jsbeautifier
    clipboard_text = getClipboardText()
    if clipboard_text:
        js_options = jsbeautifier.default_options()

        js_options.jslint_happy = True
        new_code = jsbeautifier.beautify(clipboard_text, js_options)

        setClipboardText(new_code)
        print
        print "/*  jsbeautifier  */"
        print "// before --------------------"
        print clipboard_text
        print "// after --------------------"
        print new_code

## JavaScriptコードを圧縮
# SlimIt : http://slimit.org/
# PLY : http://www.dabeaz.com/ply/
@ret_func
@job_queue
def jsminify(mangle=False):
    import slimit
    clipboard_text = getClipboardText()
    if clipboard_text:
        new_code = slimit.minify(clipboard_text, mangle)

        setClipboardText(new_code)
        print
        print "/*  SlimIt (mangle=%s)  */" % mangle
        print "// before --------------------", len(clipboard_text), "byte"
        print clipboard_text
        print "// after --------------------", len(new_code), "byte"
        print new_code

def configure(keymap):

    keymap_global = keymap.defineWindowKeymap()

    # JavaScriptコードを整形
    keymap_global["W-j"] = jsbeautifier

    # JavaScriptコードを圧縮(高圧縮)
    keymap_global["W-S-j"] = jsminify(mangle=True)

    # JavaScriptコードを圧縮(低圧縮)
    keymap_global["W-C-j"] = jsminify(mangle=False)

■ ライブラリのインストール

・JSBeautifier

https://github.com/einars/js-beautify/raw/master/python/jsbeautifier.py

↑ のファイルをkeyhacのextensionフォルダへコピーする。

・SlimItとPLY(コード解析)

https://github.com/rspivak/slimit

圧縮ファイルをダウンロードし、圧縮ファイルのsrcフォルダ下にslimitをフォルダごとkeyhacのextensionフォルダへコピーする。

http://www.dabeaz.com/ply/

圧縮ファイルをダウンロードし、圧縮ファイルのplyをフォルダごとkeyhacのextensionフォルダへコピーする。

■ さいごに

ブックマークレットをよく書くという方は特に便利だと思うので、よかったら使ってみてください。

■ 参考リンク

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

2011-07-18

keyhacからcomtypes経由でExcelマクロ関数をコールする

前回に引き続き、keyhacネタ。keyhacはPythonコードでWindowsのショートカットキーをカスタマイズできるフリーソフト。バージョン1.34からcomtypesが使用できるようになった。

このおかげでWScriptでやれていたことがkeyhacでもできるようになった。下記コードのようにすればExcel側で定義している自作マクロ関数も呼び出せる。

from keyhac import *


def configure(keymap):

    def personal_xls(macro_name, *args):
        def _job_1(job_item):
            import comtypes.client
            xl = comtypes.client.GetActiveObject("Excel.Application")

            is_older_than_2007 = lambda: float(xl.Version) < 12
            if is_older_than_2007():
                book_name = "PERSONAL.XLS"
            else:
                book_name = "PERSONAL.XLSB"

            xl.Run(book_name + "!" + macro_name, *args)

        def _job_2(job_item):
            # print macro_name, args
            pass

        job_item = JobItem(_job_1, _job_2)
        JobQueue.defaultQueue().enqueue(job_item)

    # Excel用キーマップ
    keymap_excel = keymap.defineWindowKeymap(exe_name=u"EXCEL.EXE")
    # ボタンを大きくするマクロ
    keymap_excel["C-S-b"] = lambda: personal_xls("SwitchLargeButtons")
    # 引数付きの関数もコール可能!
    keymap_excel["C-S-m"] = lambda: personal_xls("Macro1", u"abcde.")
    keymap_excel["C-S-n"] = lambda: personal_xls("Macro1", u"あいうえお!")

一応Excel2003も2007も動くようにしている。

それとSwitchLargeButtonsは前に書いたやつ → 一発でエクセルのボタンをビッグサイズに切り替えるマクロ

ちなみにこのコードではJobQueueを使っているが、これを使わずに直に関数コールするとエラーにになってしまう。

ERROR : _onKeyDown failed
[Error -2147417843] アプリケーションが入力同期呼び出しをディスパッチしているため、呼び出せません。
Traceback (most recent call last):
  File "keyhac_keymap.pyo", line 804, in _onKeyDown
  File "keyhac_keymap.pyo", line 728, in _keyAction
  File "C:\Program Files\craftware\keyhac\config.py", line 1764, in <lambda>
  File "C:\Program Files\craftware\keyhac\config.py", line 1747, in personal_xls
  File "comtypes\client\__init__.pyo", line 180, in GetActiveObject
  File "comtypes\__init__.pyo", line 1165, in GetActiveObject
  File "_ctypes/callproc.c", line 936, in GetResult
WindowsError: [Error -2147417843] アプリケーションが入力同期呼び出しをディスパッチしているため、呼び出せません。

Excelは無理なのかなと色々試してたら一応動いた。結果オーライ。ますますkeyhacが便利になったなー。

■ 参考リンク

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
あわせて読みたいブログパーツ