3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Autohotkey]一つのキーに対して、単独で押した時と他のキーと組み合わせて押した時の挙動を変える

Posted at

こんにちは。
泡アハです。

私は別の記事でも書いた通り、キー配列をがちがちにカスタマイズしています。
windows,mac,linuxでキー配列を変更していますが、
唯一Autohotkeyだけは少し癖があります。

karabiner(mac用), xremap(linux用)では、設定ファイルに単体押しとキーコンビネーション時に押し続けた場合の役割を定義することができます。

例:xremapの場合(Space単体押し=Space, 押し続けたとき=CapsLock)

modmap:
  - name: Global
    remap:
      Space:
        held: CapsLock
        alone: Space

※xremapは、設定ファイルを簡潔に書くことができ、なおかつ後から見返した場合にわかりやすくて個人的に好きです。

そんな中でAutohotkeyでも、一つのキーに対して、単独で押した時と他のキーと組み合わせて長押しした時で、それぞれ異なる機能を割り当てたかったのですが、解決策をみつけたので、共有します。

同じようにAutohotkeyで単体押しとキーコンビネーション時の場合分けをしたい方がいれば、ご参考いただければと思います。

なお、本スクリプトは、Autohotkey ver2で実装しています。
おそらくver1.0でも書き方を工夫すれば同じことはできると思いますが、この点ご注意ください。

結論

例:

Spaceキー単体押し = Space
Space + i = up

としたい場合、以下のようなスクリプトで実現できます。

SinglePress(lastkey, sendkey) {
    KeyWait lastkey
    If (A_PriorKey = lastkey)
    {
        Send sendkey
    }
    return
}

Space:: SinglePress("Space", "{Space}")
~Space & i::up

解説

SinglePress

概要

SinglePress(lastkey, sendkey) {
    KeyWait lastkey
    If (A_PriorKey = lastkey)
    {
        Send sendkey
    }
    return
}

Space:: SinglePress("Space", "{Space}")

このスクリプトでは、スペースキーが押されてすぐには何も実行せず、スペースキーが離されるまで待つ動作を行います。
その後、最後に押されたキーがスペースキーだった場合(つまり、他のキーとのコンビネーションではない場合)、スペースキーが押されたことをシミュレート(再送)します。

引数

SinglePressには、lastkeyとsendkeyを引数に受け取りますが、それぞれ以下のような意味となっています。

引数名 意味
lastkey 最後に押されたキー
sendkey 単押しだった場合に送信するキー

なぜlastkeyとsendkeyをわけているかというと、Alt+Spaceのようにキーコンビネーションを制限したいケースを考慮したからです。
Alt + Spaceは、コマンドランチャーを起動したいけど、Alt + Space + iの場合、Alt + upとして動いてほしいというときに有効です。

!Space:: SinglePress("Space", "!{Space}")

私の場合、VSCodeでAlt + Space + iでAlt + up(行の移動)を実現したかったのですが、

~Space & i::up

とだけ設定しても先にAlt + Spaceが先に動いてしまうため、SinglePressを使うとやりたかったことができるようになります。

要点

このスクリプトの肝は、

    KeyWait lastkey
    If (A_PriorKey = lastkey)

の部分です。
単押しかどうかを判断するために

KeyWait "Space"

で、スペースキーが離されたかどうかを検知し、

If (A_PriorKey = "Space")

最後に押されたキーがスペースキーだった場合(つまり、スペースキーが単体で押された場合)に条件を満たして、Send sendkeyするという仕組みになっています。

まとめ

いかがでしたでしょうか?

Autohotkeyは、ほかのキーバインドツールにくらべ、スクリプトで記述する分、自由度は高いですが、その分難易度も高いと思っています。

とはいえ、マスターすれば、強力なツールになることは間違いないと思いますので、
ぜひこの記事を参考に素晴らしいキーボードライフを楽しんでください。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?