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キーを押して離す処理を実行する
ようにした。もっと自然な対策をご存知の方がいたら、教えてもらいたい。

5 件のコメント:

  1. keyhacの更新お疲れ様です。いつも便利に使わせていただいております。

    Altキーを使ったカスタマイズとはあまり関係ない話なのですが、Win+Lで画面ロックをしてロックから復帰すると、内部ログを見る限りWinキーが押しっぱなしであると認識してしまっているように見受けられます。お手数ですが、ご確認いただけないでしょうか。

    よろしくお願いいたします。

    返信削除
  2. slack4u さんこんにちは。

    こちらでも、起こせました。調査します。
    レポートをありがとうございます。

    返信削除
  3. 1.23で修正してみました。ご確認いただけると幸いです。

    返信削除
  4. おぉ!早速の修正ありがとうございます。

    試してみましたが、押しっぱなしの状況は解消されたようです。ありがとうございました!

    ちなみに Win+* のようなキーバインドを設定すると、期待している処理が実行された後にWindowsメニューが表示されてしまうのですが・・・これは仕様ということでしょうか?

    あと、サイトのkeyhacのページのAPIリファレンスのリンク先がCraftMemoのものになってしまっているようです。一応報告まで。。。

    返信削除
  5. レポートありがとうございます。

    > ちなみに Win+* のようなキーバインドを設定すると、
    > 期待している処理が実行された後にWindowsメニューが
    > 表示されてしまうのですが・・・これは仕様ということでしょうか?

    1.24で、Altと同じようにWinをキャンセルする処理を入れました。


    > あと、サイトのkeyhacのページのAPIリファレンスの
    > リンク先がCraftMemoのものになってしまっているようです。

    これも修正しました。

    返信削除