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-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-09-06

keyhacでCapsLockをモディファイアキー定義して無理矢理使う

keyhacの話。ある2chのスレを見ていたら、keyhacでCtrlとCapsLockキーを入れ替えようとしたが無理だった、というやりとりを見かけました。

CapsLockというキーは他のキーとは違いDownのイベントは発生するけど、Upは発生しない(ドライバマスクしているらしい)ため、Ctrlと入れ替えた場合、押されっぱなしの状態になるとか。

試しにkeyhacで内部ログON*1にして、CtrlとCapsキーを押してみると

# Ctrlを押して離した場合

IN  : D-LCtrl
TRU : D-LCtrl
IN  : U-LCtrl
TRU : U-LCtrl
IN  : O-LCtrl

# CapsLockを押して離した場合

IN  : D-(240)
TRU : D-(240)

という風にCapsLockは「U-(240)」が出力されていません。だから入れ替えは無理、か。確かにこれは無理だなと思う反面、出来ないと言われると、何とかしたくなるのが人情

で、色々考えた末、入れ替えは無理でもユーザー定義モディファイアキー*2としてなら使えるかもと思い、書いてみました。

コード

# config.py

from keyhac import *


def configure(keymap):

    ## 関数実行時にモディファイアの状態をリセットするデコレータ
    def reset_modifier(func):
        import functools

        @functools.wraps(func)
        def _reset_modifier(*args, **kw):
            # モディファイアの状態を無理矢理リセット
            keymap.modifier = 0
            # 関数実行
            return func(*args, **kw)
        return _reset_modifier

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

    ## 一定時間経過後にモディファイアの状態をリセット
    @job_queue
    def auto_reset_modifier():
        import time
        WAIT_TIME = 0.5  # 秒
        time.sleep(WAIT_TIME)
        # モディファイアの状態を無理矢理リセット
        # if keymap.modifier: print keymap.modifier
        keymap.modifier = 0

    @reset_modifier
    def minimize():
        keymap.getTopLevelWindow().minimize()

    # どのウインドウにフォーカスがあっても効くキーマップ
    keymap_global = keymap.defineWindowKeymap()

    # ユーザモディファイアキーの定義:CapsLock(240) --> U1
    keymap.defineModifier("(240)", "U1")

    # 単体押しは一定時間後にモディファイアの状態をリセット
    # keymap_global["U1"] = auto_reset_modifier     # これだとキー表記エラー
    keymap_global["(240)"] = auto_reset_modifier

    # Caps + a : ウィンドウ最小化
    keymap_global["U1-a"] = minimize

関数定義で@reset_modifierのデコレータを使うと、関数の実行時にモディファイアキーの状態をリセットします。これによりCapsLockキーの押されっぱなしを防止しています。

これで一応モディファイアっぽく使えます。ただしタイトルに「無理矢理」と書いたように同時押しでなくても

CapsLockを押す → 離す → (0.5秒以内に)Aを押す

でも認識されてしまいます。また、CapsLockを押したままA、Aと2回押すと、2回目のAは同時押しではないAになってしまう等の欠点があります。

■ さいごに

日頃からCapsLockキーって押しやすい場所にあるのに全然使ってないなと思っている方はどうぞ。

■ 参考リンク

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

キーカスタマイズソフト 2

*1:トレイアイコンクリック→内部ログONをクリック

*2:Ctrl・Shift・Alt・Winキーのような装飾キー

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-05-04

Notepad++のNppExecの出力からタグジャンプする設定方法

とりあえずできるようになったのでメモ。

メニューの プラグイン>NppExec>Execute... (F6)

でコンパイラやコーディングチェッカを実行する

例. pep8 --show-source "$(FULL_CURRENT_PATH)"

するとConsoleというウィンドウにファイル名と行数が表示される。

C:\Program Files\keyhac\config.py:565:2: W291 trailing whitespace

↑こんな感じ(書式は実行するソフト等による)

これをダブルクリックすると、その行にジャンプするようにしたい。

設定

メニューの プラグイン>NppExec>Console Output Filters...

を選択し、HighLightタブで

%ABSFILE%:%LINE%:*

↑はConsoleに出力されるメッセージ書式に合わせる

%ABSFILE% フルパスのファイル名

%LINE% 行数

これでその行のチェックボックスをONにすれば設定完了。

ちなみにConsoleウィンドウの書式はAdvanced OptionsとChange Console Fontで変更可能。

2011-02-04

検索結果の「Amazon.co.jpが販売」以外半透明化のgreasemonkey&bookmarklet

最近のAmazonに多いぼったくり転売屋に引っかからないための検索フィルター(greasemonkeyスクリプト/bookmarklet)を作ってみました。

まずは次のスクリーンショットを見ていただくのが早いと思います。発売間近のニンテンドー3DSで検索したときの画面です。

ビフォー

before

アフター(上から2つのアイテムが半透明になる)

after

ニンテンドー3DSは定価25000円なんですが、マーケットプレイスにて転売業者が現在37000円〜で販売しています。

インストール

好みでお好きな方をどうぞ!

★ greasemonkeyスクリプト版( ↓ のリンククリック

このUserscriptをインストールする

★ ブックマークレット版( ↓ のリンクをブックマーク)

いまのところIEは非対応です。Google Chrome、Firefox、Operaでは動作確認OK、AutoPagerize・AutoPatchWorkにも対応しています。

おまけ

こっちも最近つくったAmazon系bookmarkletです。Amazonの商品ページで実行すると、そのカテゴリの売れ筋を表示します。

おわりに

何か不具合があればコメント等でご連絡ください。

結構便利だと思うのでよければどうぞ。

関連記事


激安!Amazonで初回限定版のDVD付きCDを買うとお得な理由(わけ)

「普通のAmazon」を「ダイナミックなAmazon」にするchrome拡張 AmazonImageSizeChanger

超簡単Amazonアソシエイトリンク生成greasemonkeyの「AmaGrea」

Amazonのぼったくり業者にはご注意!のgreasemonkey

任天堂
Amazonで詳細を見る by AmaGrea

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