0
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

(USキーボードでも)ホームポジションで移動キー入力したい!

はじめに

本エントリは高知工科大 Advent Calendar 2018の4日目の記事です。

皆さんも普段生活している中で「あー、ホームポジションのままカーソル移動ができたらなー」と思うことは多いと思う。思わない?僕は思う。
このエントリでは、左手のCtrlと、右手の「I」「J」「K」「L」キーの組み合わせで、移動キー(Up, Left, Down, Right)と同じ振る舞いができるようにする。
使用ツールはAutoHotkey

「USキーボードでも」というのは、JISキーボードでCtrlではなく無変換キーを利用したものなら既に結構記事があることからきている。USには無変換キーは無いからどうなることか...。

環境

  • Windows 10 Home x64
  • USキーボード (ctrl2capでCapsLockをCtrlにしてある)

AHKスクリプトを書く

試行錯誤1 シンプル

^i::Send,{Up}
^j::Send,{Left}
^k::Send,{Down}
^l::Send,{Right}

移動キーは問題なく発行される。
Shiftを組み合わせると、移動キーは無効化され、その環境のショートカットが発行される。

試行錯誤2 Shiftに対応したい

^i::Send,{Blind}{Up}
^j::Send,{Blind}{Left}
^k::Send,{Blind}{Down}
^l::Send,{Blind}{Right}

Shift同時押しを受け付けさせるために{Blind}を入れたが、CtrlならShift+Ctrl+i+Upになってしまい、期待通りの振る舞いをしない。

試行錯誤3 GetKeyState

^i::
    if GetKeyState("shift","P"){
        Send,+{Up}
    }else{
        Send,{Up}
    }
    return

^j::
    if GetKeyState("shift","P"){
        Send,+{Left}
    }else{
        Send,{Left}
    }
    return

^k::
    if GetKeyState("shift","P"){
        Send,+{Down}
    }else{
        Send,{Down}
    }
    return

^l::

    if GetKeyState("shift","P"){
        Send,+{Right}
    }else{
        Send,{Right}
    }
    return

AutoHotKeyで簡単にカーソル移動、範囲選択:カタカタめもWindowsのキー配置を入れ替えて作業効率化 | たまに、更新するかもしれないブログ丸パクリ参考に。
試行錯誤2とは違い、移動は出来ず、Shift+Ctrl+k(行削除)が発行される。ホットキーを全く乗っ取れていない。

試行錯誤4 無職修飾キー

LWin::Send, {vk88 Down}

試行錯誤3

参考ブログが無変換キー利用でできてるということは、USキーボードに無変換キーをつくればいけるんでは?という発想。無理でした。

キーを乗っ取ってそれを修飾キーにすることができない理由

ホットキー - AutoHotKeyJpのコンビネーションキーの説明から。

コンビネーションキー
&を使うことで、2つの任意のキー(ジョイスティック以外)の組み合わせをホットキーに指定することが可能。
一つ目に指定したキーが修飾キーとなり、一つ目のキーを押しながら二つ目のキーを押すと発動する。
一つ目のキーを押して、ホットキーを発動させずに離すと、一つ目のキー単独に割り当てられたサブルーチンが実行される。
一つ目のキー自体のもともとの機能は無効化される。

結論

要件達成ならず。

おわりに

できたことよりも、できないことを確認したというエントリということでひとつ。

レジストリをいじってUSキーボードに無変換キーなりの無職修飾キーを作って、Ctrlではなくそれを利用すればいけそうだが、それをするならAHK使わず全部レジストリで実現すればいいじょのいこと言う話で…。
現在は試行錯誤1にHome、End、Backspace、DeleteをそれぞれU、O、N、Mに割り当てを追加して使っている。範囲選択のときは本物の移動キーを使うことになってしまうが、まあ便利。

レジストリいじってうまくいったら第2話ということでまた投稿する。できたらいいな。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?