2010年8月22日日曜日

pymono で CPython と C# を組み合わせる

pymono という Python拡張モジュールを作ってみた。
これは、Pythonから.NET Frameworkの仮想マシンを呼び出したり、C#からPythonの関数を呼び出したり
するモジュールだ。

Mono をアプリへの組み込み用仮想マシンとして使う可能性を検討するための学習課題として
作ってみただけ。

.NETとPythonといえば、IronPythonがあって、
pymonoのほうはジョーク&実験用という位置づけだ。

2010年8月14日土曜日

keyhac で Winキー

keyhacの1.24で、Winキーをモディファイアとして使えるようにした。

1.23以前では、たとえば "Win-H" のように、 Winキーをモディファイアとして使ったときに、
Winキーは、スルーするけど、Hキーは、keyhacが処理してスルーしないので、
OSには、Winキー単体として処理されてしまい、スタートメニューが出てしまっていた。

1.22でAltキーに対して対策したように、Winキーにも単体押しをキャンセルする (Ctrlキーを
押したことにする) 処理を追加して、一見うまくいっているようだ。

2010年8月13日金曜日

keyhac で Emacs 風キーバインド

keyhacのマルチストロークなキーカスタマイズ機能をつかって、
メモ帳をEmacs風に操作できるようにしてみよう。

とくに、僕がEmacsを常用しているわけではないが、
マルチストロークがうまくいくかどうかの実験だ。

------------------------------------------------------------------------------------

    # Editボックスで、C-Dを削除に当てるなど
    if 1:
        keymap_edit = keymap.defineWindowKeymap( class_name=u"Edit" )

        keymap_edit[ "C-D" ] = "Delete"              # 削除
        keymap_edit[ "C-H" ] = "Back"                # バックスペース
        keymap_edit[ "C-K" ] = "S-End","C-X"         # 行末まで切り取り

   
    # メモ帳を Emacs 風にカスタマイズする
    # keymap_edit の条件と重複するため、keymap_editの設定と混ざって機能する。
    if 1:
        keymap_notepad = keymap.defineWindowKeymap( exe_name=u"notepad.exe", class_name=u"Edit" )
   
        # Ctrl-X を マルチストロークの1段目として登録
        keymap_notepad[ "C-X" ] = keymap.defineMultiStrokeKeymap("C-X")

        keymap_notepad[ "C-P" ] = "Up"                  # カーソル上
        keymap_notepad[ "C-N" ] = "Down"                # カーソル下
        keymap_notepad[ "C-F" ] = "Right"               # カーソル右
        keymap_notepad[ "C-B" ] = "Left"                # カーソル左
        keymap_notepad[ "C-A" ] = "Home"                # 行の先頭
        keymap_notepad[ "C-E" ] = "End"                 # 行の末尾
        keymap_notepad[ "A-F" ] = "C-Right"             # 単語右
        keymap_notepad[ "A-B" ] = "C-Left"              # 単語左
        keymap_notepad[ "C-V" ] = "PageDown"            # ページ下
        keymap_notepad[ "A-V" ] = "PageUp"              # ページ上
        keymap_notepad[ "A-Comma" ] = "C-Home"          # バッファ先頭
        keymap_notepad[ "A-Period" ] = "C-End"          # バッファ末尾
        keymap_notepad[ "C-X" ][ "C-F" ] = "C-O"        # ファイルを開く
        keymap_notepad[ "C-X" ][ "C-S" ] = "C-S"        # 保存
        keymap_notepad[ "C-X" ][ "C-W" ] = "A-F","A-A"  # 名前を付けて保存
        keymap_notepad[ "C-X" ][ "U" ] = "C-Z"          # アンドゥ
        keymap_notepad[ "C-S" ] = "C-F"                 # 検索
        keymap_notepad[ "A-X" ] = "C-G"                 # 指定行へ移動
        keymap_notepad[ "C-X" ][ "H" ] = "C-A"          # 全て選択
        keymap_notepad[ "C-W" ] = "C-X"                 # 切り取り
        keymap_notepad[ "A-W" ] = "C-C"                 # コピー
        keymap_notepad[ "C-Y" ] = "C-V"                 # 貼り付け
        keymap_notepad[ "C-X" ][ "C-C" ] = "A-F4"       # 終了
------------------------------------------------------------------------------------



ここで、A-F など、Altキーを使ったキーのカスタマイズに問題があることが分かり、
keyhac 1.22 で修正を行った。Altキーは、CtrlやShiftと違って、単体で押して離すと、
メニューバーにフォーカスが行ってしまうから、特別な対応が必要なのだ。

対策として、A-Fのようなキーバインドでは、仮想的にCtrlキーを押して離す処理を実行する
ようにした。もっと自然な対策をご存知の方がいたら、教えてもらいたい。