⌨️

Win でも キーボードのホームポジションで Mac (Linux)のショートカットと'同等'の操作でカーソル操作などをしたい場合の一検討

2021/07/03に公開

※ もしかしたら既出のネタかもしれません。よりよい方法を編み出されている方もいらっしゃるだろうと思います。そういった情報をお持ちであれば教えていただけると嬉しいです。

はじめに

昔話

'A' キーの左隣は 'Ctrl' があるキーボードを使い、英語配列に染まったのは大学のコンピュータリテラシーの授業のときからです(そのとき初めて HHKB に出会いました)。Unix の使い方の授業だったので、コンソールでシェルというのが動いていて、そこにコマンドを入力すると、どこかにあるサーバが答えを返してくれました。
それ以来、'Ctrl-f' で右に、'Ctrl-b' で左に、’Ctrl-p'で上、'Ctrl-n' で下に動くショートカットなどに慣れて今でも Mac では不自由なく使っています。

業務においては Win を使うのですが、Win 環境では、そのままでは上記のようなショートカットは使えません。
昔、同期が 窓使いの憂鬱 というソフトを使ってなんとか Win 環境でも Linux ライクなライフを送りたいと頑張っていましたが、やはりショートカットが両 OS 間でバッティングしてしまうところがあり、かなり「憂鬱」そうでした。
例: Win で 'Ctrl-p' は印刷、ですが、Linux では上矢印。ある時は Win の機能であってほしいし、また、ある時はカーソル機能であってほしい。。。困った。

Mac は Mac、Win は Win、と割り切っていました。

転機が訪れる

状況を変えてくれたのがコロナ禍で始めたキーボードの自作です。
キーボードのキーマップをレイヤーという仕組みで切り替えられるということを知り、これは使える!と思いました。

提案内容

同じ自作キーボードを Mac でも Win でも使うのもさる事ながら、Win のショートカットを侵害することなく( Win のショートカットは維持したまま)、時折 Linux ライクなカーソル操作などができるようにした Tips の一検討です(ここでは'Ctrl-何か’のショートカットに絞っています)。

参考になればと思います。また、みなさんの工夫もぜひ伺いたいです♪

作戦

Win 環境で、Linux ライクな操作('Ctrl-何か’)をしたいショートカットを別レイヤーに作成しておきます。'「Ctrl を長押ししながら」っぽい動作'をすることでそのレイヤーに遷移します。そうすることで、Win 環境の 'Ctrl-何か' のショートカットを侵害せず、Linux ライクな操作が可能になります。

'「Ctrl を長押ししながら」っぽい動作' ですが、Ctrl キー(ここでは'A'キーの左にCtrl がある前提で記載してます。)の上にある’Tab’ キーの長押し、で実現しています。

すると、'Ctrl-p' に似た ’Tab長押し-p' という動作で 上矢印、が実行される、といった動作が可能になります。この操作は、左手小指の長押しするボタンが1つ違うだけなので、さほど違和感なくカーソルを操作できます。

やること

これを実現するには以下を行います。

  • Linux ライクな動作を記載したレイヤーの作成
  • '「Ctrl を長押ししながら」っぽい動作' をTab 長押しで実現するためのTab キーの設定

1, Linux ライクな動作を記載したレイヤーの作成

ということで、新たに設けたレイヤーのキーの部分にはそれぞれ以下のような操作を割り当てます。

新たに作ったレイヤーでは、左に示す文字のキーのところに、右の機能を割り当てます。

カーソル操作関連:

  • 'p' -> 'Up'
  • 'n' -> 'Down'
  • 'f' -> 'Right'
  • -b' -> 'Left'
  • 'a' -> 'Home'
  • 'e' -> 'End'

削除関連:

  • 'd' -> 'Delete'
  • 'h' -> 'BackSpace'

その他特殊機能:文字左右入れ替え

  • 't' -> macro ( Shift(Right), Ctrl-x, Left, Ctrl-v)

Undo や 貼り付け

  • '/' -> Ctrl-z  (Emacs 時代の癖???)
  • 'y' -> Ctrl-v  (Yank って vi からの癖ですかね?自分でも不明)

Mac 環境で 'Ctrl-t' を押すと 左右の文字を入れ替えてくれるのですが、その動作はマクロ機能で実現してます。process_record_user() に以下のようなマクロが呼ばれるようにコーディングしました。

SEND_STRING(SS_LSFT(SS_TAP(X_RIGHT)) SS_LCTL("x") SS_TAP(X_LEFT) SS_LCTL("v"));

やっていることは、まずシフトを押しながら右にカーソルを移動することでカーソルの右にあった1文字を選択、'Ctrl-x' により切り取り、左に移動して'Ctrl-v' で貼り付け。

Undo などは キーマップのところに QMK のC()マクロを使って直接以下のような記載をします(下は'Ctrl-z'の例)。

C(KC_Z)

2, '「Ctrl を長押ししながら」っぽい動作' をTab 長押しで実現するためのTab キーの設定

以下を従来 Tab キーがあったマップに割り当てます。LT() は、 QMK のマクロで、長押しのときに最初の引数で指定されたレイヤーに遷移し、単押しで2つ目の引数で指定されたコードを発動します。
_MOD4WIN というのは私が 1, で作成したレイヤーの名前なので、ここはみなさんが作られたレイヤー名に変えてください。

LT(_MOD4WIN,KC_TAB)

文字列数的に長いので、実際には keymap.c冒頭で以下のようにマクロ宣言してます。

#define WIN_TAB LT(_MOD4WIN,KC_TAB)

まとめ

ちょっとややこしい説明になってしまいましたが、Linux や Mac 環境で 'Ctrl-何か' というショートカットを Win 環境のショートカットを侵害する事なく共存させる方法を提案しました。
これで私は Win でのマウス使用頻度が減りましたし、カーソルキーへ手を移動させる必要なくOutlook メール、Word の文章などが打てるようになりました。

vi のカーソルの操作性も捨てがたいので、それも違うレイヤーに盛り込んで使い分けていますが、みなさん結構されているのではないかなと思います。その話はまた別の機会にでもw。

以上です。

P.S. Win と Mac の切り替えでやっている事

Windows キー と Alt キー、 Command キー と Option キー の関係が個人的に逆なので、ここだけは Win と Mac 差し替えたときに 以下のコードを割り当てたキーを押してスワップしてます。

Win を使う時

AG_NORM

Mac を使う時:

AG_SWAP

Discussion