smzht / fakeymacs

Emacs-like key bindings for Keyhac
MIT License
112 stars 49 forks source link

アクティブアプリの切替機能 #28

Closed k9i closed 1 year ago

k9i commented 1 year ago

アクティブウィンドウと同じアプリケーションを順に切り替える機能はありますでしょうか?

fc.window_switching_key はアプリの区別無しで順次アクティブウィンドウが切り替わると思います。 これの切り替え先を同一アプリ間に限定するもので、イメージは(タブ非対応の)シングルウィンドウアプリによくあった Ctrl-Tab での同じアプリ間のウィンドウ切替を chrome でも行えるようにするものです。

MDI やタブを持つアプリでは、Ctrl-Tab は MDI ウィンドウ間やタブ切替になっており、同一アプリ間の切替キーは無いように思っています。 (もしあった場合は申し訳ありません)

smzht commented 1 year ago

アクティブウィンドウと同じアプリケーションを順に切り替える機能はありませんが、作ることはできそうな気がします。 検討してみます。

smzht commented 1 year ago

window_switching_key という拡張機能として作成してみました。お試しください。

最小化されているウィンドウを切り替えの対象に含めるか迷いましたが、現在は含めるようにしています。 コンフィグレーションパラメータでの指定も考えましたが、とりあえず直接指定としています。

k9i commented 1 year ago

素早いご対応、ありがとうございます! 試してみます。

k9i commented 1 year ago

git pull で同期後、config_personal.py に下記のように Window-TABキーに設定して試してみました。

# (snip)
fc.window_switching_key2 = [["W-tab", "W-S-tab"]]  # DDD
# (snip)
# 現在アクティブなウィンドウと同じプロセスのウィンドウを順に切り替えるキーを設定する
if 1:
    exec(readConfigExtension(r"window_switching_key\config.py"), dict(globals(), **locals()))

ゆっくり打つと機能するのですが、素早く連打すると Windows のタスクビューが起動されてしまいます。 Keyhac コンソールウインドウに「選択したウィンドウは存在しませんでした」と表示されていましたが、これはタスクビュー起動中の打鍵で表示されたようでした。(タスクビュー起動直後のコンソール出力は無し) chromeやFirefoxでは高確率で発生し、WindowsTerminal、Windows Explorer、コマンドプロンプト(cmd.exe) でも発生するようです。 (TeraTerm5 は発生しない(?)ようですが、たまたまかもしれません。。)

また、タスクビューが起動しない場合でも切替にワンテンポ遅れる感じがあり、キーを離した後もしばらく切替動作が継続するようです。 (キー入力がキューイングされているような感じ)

何か対策はあるでしょうか。。

smzht commented 1 year ago

多少の速度改善はしてみましたが、大きく改善はしておりません。

今回の機能は A-l で表示されるウィンドウリストを利用しています。このリストを生成するのに多少時間が掛かるようで、対策を検討してみましたが、改善は難しいようでした。

また、キーを連打した場合に Windows 本来のキーの機能が起動されてしまう件ですが、これも Fakeymacs としての対策は難しいと思っています。 ただし、次の方法をとると回避することはできますので、お試しいただければと思います。

  1. Microsoft Store から PowerToys をインストールする
  2. Keyboard Manager を起動する
  3. ショートカットの再マップで、Win(Left) + Tab を F13 に割り当てる
  4. fc.window_switching_key2 を次のように設定する
      fc.window_switching_key2 = [["(124)", "S-(124)"]]
smzht commented 1 year ago

PowerToys を使いたくない場合、多少の混乱はありますが、fc.window_switching_key2 を次のように設定する方法もあるかと思います。

fc.window_switching_key2 = [["LC-Tab", "S-LC-Tab"]]

CapsLock キーがあるキーボードをお使いで、そのキーを RCtrl キーとして利用している場合に使える方法かと思います。

smzht commented 1 year ago

次にあるコードを W-Tab に結びつけて実行してみたところ、キーの取りこぼしは発生しないようです。

キーの取りこぼしの原因をもう少し調べてみたいと思います。

smzht commented 1 year ago

キーの取りこぼしは、次の対応でかなり改善されました。

delay を 0 にするとより改善するのですが、画面切り替え時の IME の status 表示がついてこなくなるため、20ms がぎりぎりの数値でした。

smzht commented 1 year ago

ほんの少しですが、性能改善を行いました。

smzht commented 1 year ago

さらに性能の改善を行いました。これで、LC-Tab のキーであれば、問題なく利用できるレベルになっているかと思います。

smzht commented 1 year ago

いろいろ対策をしていたら、以下の設定でもほぼ問題なく動くようになっておりました。

fc.window_switching_key2 = [["W-tab", "W-S-tab"]] 
k9i commented 1 year ago

返信遅くなり済みません。 一度 PowerToys をインストールして https://github.com/smzht/fakeymacs/commit/186c8498d7c17a23395e17b2cf6b90215796207c と組み合わせてみたところ、連打で Time stamp inversion が頻発、タスクビューは出ないものの、以後の切替動作もできなくなる状態になって試用を中断していました。 (キーを全て離すと元に戻ります。PowerToys は Time stamp inversion の原因と思い削除しました)

https://github.com/smzht/fakeymacs/commit/e3f6579f699601816dd335e292c0975d500c93d7 を試したところ、かなり動作が軽くなっていました。 ただ、W-tab を押しっぱなしにしたり、素早く連打した場合は切替動作が止まったり、タスクビューが表示されたりするようです。 押しっぱなしにしなければ、ほぼ問題ないようなので、このまま使わせて頂こうと思います。

機能拡張のご対応、どうもありがとうございました。

smzht commented 1 year ago

まずは現在のもので使ってみていただければと思います。また、何か対策することができればご連絡します。

以上、よろしくお願いします。

また、本件クローズとさせて頂きますのでよろしくお願いします。

smzht commented 5 months ago

次の対応を行いました。window_switching_key 拡張機能が window_operation 拡張機能に統合されましたので、ご留意ください。