smzht / fakeymacs

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

Emacs キーバインドと連携可能な SpaceFN の機能を実装する #30

Closed smzht closed 10 months ago

smzht commented 1 year ago

Emacs キーバインドと連携可能な SpaceFN の機能を実装します。既に、拡張機能 space_fn として概ね動くようになっています。

smzht commented 1 year ago

SpaceFN の説明は以下が詳しいです。

smzht commented 1 year ago

Windows で動く実装には以下のものなどがあるようです。

QMK/VIA 対応キーボードであれば、キーボードの HOLD/TAP を使って実現する方法もあります。

smzht commented 1 year ago

上記の上から2つが key rollover の対策がされているようです。

spacefn-win については、対策についてかなり詳しく書かれていますが、読んでもなかなか理解できません。

smzht commented 1 year ago

Dual-role key の情報が以下にありました。

smzht commented 1 year ago

拡張機能 space_fn の特徴1

本拡張機能の SpaceFN では、SpaceFN 用のモディファイアキー(初期値は Space。以降の説明では Space が設定されているものとして説明します!)からキーを押した場合のみ、機能が働くようにしています。例えば、Emacs キーバインドで利用する Ctrl+Space(set-mark-command) は、Ctrl キーからキーが押されるため、Space を押しても SpaceFN の機能は発動しません(Space の押下が確定する)。これで、Ctrl+Space の後に Ctrl+F を素早く押した場合など、key rollover の状態が発生した場合でも、Emacs キーバインドの操作が正常に行われるようにしています。

smzht commented 1 year ago

拡張機能 space_fn の特徴2

一般の SpaceFN では、SpaceFN の機能を割り当てていないキーが押された場合、Space を取り除いたキーがそのまま入力されるという仕様があるようです。本拡張機能の SpaceFN では、この状態のキーが押された場合に、Emacs キーバインドに定義されている機能ではなく、Windows 本来のキーの機能が働くようにしています。例えば、Space + Ctrl +F に SpaceFN の機能を割り当てていない状態でこのキーを入力すると、Emacs キーバインドの forward-char ではなく、Windows の「検索」の機能が働きます。この機能は、キーボードの左側に Ctrl キーが一つしかない HHKB で Ctrl を使った Windows ショートカットを入力したい場合に、有効な機能になると思っています。_confiig_personal_2.py は、この機能を利用するために Space と Shift キー以外の モディファイアキー(Ctrl や Alt キーなど)を使ったキー設定を敢えてしないようにした、config_personal.py のサンプル設定となっています。

smzht commented 1 year ago

拡張機能 space_fn の特徴3(2023/11/30 仕様変更)

一般的に SpaceFN では、機能の仕組み上、「Space」を入力したい場合は、1-key rollover になるという制約が発生します。つまり、Space キーを離した後でないと、次のキーが入力できないという制約です。ただし、キーを高速に入力する場合は、n-key rollover の機能が働かないと入力ミスが発生し、利用に耐えない状況が発生します。この対策のため、本拡張機能の SpaceFN では、SpaceFN 用の最後のキーが押されてから一定の時間(初期時:0.1秒)前に SpaceFN 用のモディファイアキーが離されると、押下したキーがそのまま入力される仕様にしています。 例えば、「foo bar」と高速に入力した場合、Space と b のキーは同時に押されている時間が発生する可能性がありますが、Space が b キーが押されてから 0.1 秒以内に離されていれば、SpaceFN の機能は発動せず、Space と b がそれぞれ押されたものとして処理をしています。 また、上記の問題は、Space を「変換」に利用する日本語入力時に顕著に発生します。上記で説明した対策により、日本語入力時に発生する問題も回避できるようにはなっていますが、本拡張機能の SpaceFN では SpaceFN を適用するキーマップを指定する機能をもっており、初期設定では「Emacs 日本語入力モード」利用時(キーマップは、keymap_ei になる)には SpaceFN が機能しないようにしています。この対策により、日本語入力時は全く SpaceFN の影響を受けない入力を可能としています。

smzht commented 1 year ago

拡張機能 space_fn で、マルチストロークキーを設定することができるようになりました。key rollover の対策も行っています。 以下の README にサンプルコードを載せていますので、お試しください。

smzht commented 10 months ago

SpaceFN の拡張機能は安定して動作する実装になりましたので、本 issue は close としたいと思います。