2014年6月8日日曜日

keyhac ver 1.64

keyhac ver 1.64 を公開した。

https://sites.google.com/site/craftware/keyhac

1.64
  • Python33 から Python34 に移行
  • ckit.Window の代わりに ckit.TextWindow を使うようにした。(ckitの設計変更に追従)
  • デフォルト設定ファイルに、クリップボードのテキストの全角/半角を変換して貼りつける機能の例を追加。(To Half-Width, To Full-Width)

25 件のコメント:

  1. 素晴らしいプログラムをありがとうございます。
    Google日本語入力を無効にしたいのですが、対応をご検討くださいませんでしょうか。
    よろしくお願いいたします。

    返信削除
  2. コメントをありがとうございます。
    Google日本語入力は使ったことがないのですが、無効にする、の所をもう少し詳細に伺えますか?

    返信削除
  3. NTEmacsと他のプログラムは、emacsのキーバインドで、Google日本語入力は、Google日本語入力のキーバインドで使いたいのです。例えば、Google日本語入力では、"C-e"は前の候補に移動、"C-o"は半角にするです。

    返信削除
  4. Google日本語入力を「除外設定」できれば、希望が実現できるのではないかと思っています。

    返信削除
    返信
    1. daemoncamel さん、
      以前いただいたご要望について、もう少し伺いたいのですが、
      Google日本語入力がON/OFFを判定して、一部のキーカスタマイズを無効にするのか、Google日本語入力を使って、文字列を編集中(未確定な文字列が存在する間)だけ、一部のキーカスタマイズを無効にするのか、どちらがご希望に合致する動作でしょうか?

      ちょっと試してみているのですが、keyhacから他アプリのIMEのON/OFFは取得できるものの、IMEを使って入力中であるかどうかは取得できないかもしれません。

      削除
    2. ご検討くださいまして、大変ありがとうございます。
      希望は後者です。
      よろしくお願いいたします。

      削除
    3. 以下の設定でほぼ望み通りのことが実現できました。
      違いは、「SHIFT」キーの押下が必要なことだけです。

      http://www49.atwiki.jp/ntemacs/pages/25.html

      削除
  5. なるほど理解しました。ご説明ありがとうございました。

    返信削除
  6. 一点お願いがあります。keyhacの内部ログをONにすると、操作しているウインドウで起動しているアプリケーションのclass名を表示させることができます。ただし、ここで表示されるclass名は、Window.find関数に指定するためのclass名とは異なるもののようです。AutoHotKeyというソフトにActive Window Infoというソフトが付属していますが、このソフトで表示されるahk_classというものをkeyhacの内部ログでも表示されると便利だと思っております。ご検討をお願いします。

    返信削除
    返信
    1. 内部ログONで表示しているウインドウ情報は、フォーカスを持つウインドウです。Window.findに渡すのはトップレベルウインドウです。

      defineWindowKeymap() に渡す class_name は、トップレベルウインドウではなく、フォーカスを持つウインドウを指定するので、内部ログで表示されるクラス名をそのまま使用します。

      Keymap.getTopLevelWindow() で、現在フォーカスを持つウインドウのトップレベルウインドウが取得できますので、適当なキーで、クラス名を自分で表示するようにして対処していただくとよいとおもいます。

      削除
    2. Keymap.getTopLevelWindow()を使ってみたいと思います。ご回答いただき、ありがとうございました。

      削除
    3. 関連して、一つ教えていただけますか?
      現在フォーカスのあるウインドウから一つ前にフォーカスのあったウインドウに移動するコマンドを作りたいと思っております。
      ポインタでも構いませんのでアドバイスをお願いいたします。

      削除
    4. デフォルトの config.py ファイルに、下のようなセクションがあると思います。

      # Ctrl-Tab で、コンソール関係のウインドウを切り替え

      これは、コンソール系のウインドウ間を、Ctrl-Tabで切り替えるためのものですが、これと似たことをすると、ご所望の機能が実現できるのではないかと思います。

      ClassNameではなく、isVisible / isMinimized / isEnabled などを使う必要がありそうです。また、最後に見つかったWindowではなくて、今Focusをもっているウインドウの次に見つかったWindowを探す必要がありそうです。

      削除
    5. アドバイスありがとう御座います。
      以下の様な感じでなんとなくは動いたのですが、if分が変なウィンドウをOKと
      してしまうことがあり、setForegroundが正常に機能しない場合があります。
      内部ログで表示されるクラスを抽出できれば良いと思うのですが、そのような
      ことは可能なものでしょうか?

      wnd = keymap.getTopLevelWindow().getNext()
      while wnd:
      if wnd.isVisible() and wnd.isEnabled():
      # print(wnd.getClassName())
      wnd.setForeground()
      break
      wnd = wnd.getNext()

      削除
    6. setForeground() のまえに、wnd = wnd.getLastActivePopup() を入れてみてはどうでしょうか?
      あるいは、別のアプローチで、keymap_global[ "C-TAB" ] = "A-Tab" でも十分かもしれません。

      直前にフォーカスがあったウインドウは、keyhacの標準的な動作では保存していません。

      削除
    7. A-TabはWindows7ではキーの置き換えができるのですが、Windows8以降ではできないようです。
      http://jinblog.at.webry.info/201305/article_1.html
      その対策を考えていての質問でした。wnd.getLastActivePopup()もダメでしたので、別なアプローチを
      検討してみたいと思います。ご回答いただき、ありがとうございました。

      削除
  7. あるアプリケーションがターゲットとして登録されているキーマップの定義が複数あり、そのキーマップで同じキーに
    対して設定がなされている場合、どのような優先の仕組みでキーマップが選択されるかを教えていただけますか?
    キーマップの登録順となる..など。よろしくお願いします。

    返信削除
    返信
    1. 後で登録したキーマップの方が優先されます。

      削除
    2. 回答いただき、ありがとうございます。

      削除
    3. 本質問の挙動が、1.64と1.70で異なるようです。(1.70で回答頂いた挙動でなくなりました。)これは仕様となりますか? もしくは1.70の更新(修正)が行われる可能性はありますか?

      削除
    4. 上記の問い合わせは間違いでした。keyhac が 1.70 になり、Keyhac(k が大文字)となったようですが、これに伴いアプリケーションソフトのクラス名も変更となっており、これが影響しておりました。スクリプトの修正で正常な挙動に戻すことができました。失礼しました。

      削除
  8. keyhacの環境で定期されているライブラリをつかって、直接pythonのスクリプトを書き、コマンドラインから実行したいと考えています。(例えば、コマンドの引数をkeymap.command_ShellExecuteで起動するコマンドを作成することなどを行いたい。)
    やり方があれば、御指南いただければと思います。よろしくお願いします。

    返信削除
    返信
    1. Githubでソースコードが公開されていますので、分解して、お使いいただけると思います。

      また、keyhac の中で使っている pyauto ライブラリは、独立して使えるようになっています。これもGithubにソースがあります。

      あるいは、使いたいのがShellExecuteだけでしたら、ctypes を使って、自分で実装することも可能かと思います。

      削除
    2. 返信ありがとうございます。試してみたいと思います。

      削除
  9. このコメントは投稿者によって削除されました。

    返信削除