xcape を使用すると、修飾キーを単独で押したり離したりしたときに、別のキーとして使用できます。キーが放されるまで押されたイベントが発生しないため、元のキーを押すよりもわずかに遅くなることに注意してください。デフォルトの動作では、左コントロールを押して放したときに、Esc キーが自動的に生成されます。 (なぜこれを欲しがる人がいるのか理解できないのであれば、Vim はあなたのお気に入りのテキスト エディタではないのだと思います ;)
まず、開発の依存関係をインストールします。 Debian ベースのシステム (Ubuntu および Linux Mint を含む) では、次のコマンドを実行します。
$ sudo apt-get install git gcc make pkg-config libx11-dev libxtst-dev libxi-dev
Fedora ベースのシステムでは、次を実行します。
$ sudo dnf install git gcc make pkgconfig libX11-devel libXtst-devel libXi-devel
次に、次を実行します。
$ git clone https://github.com/alols/xcape.git
$ cd xcape
$ make
$ sudo make install
$ xcape [-d] [-f] [-t <timeout ms>] [-e <map-expression>]
-d
デバッグモード。バックグラウンドには分岐しません。デバッグ情報を出力します。
-f
フォアグラウンドモード。バックグラウンドには分岐しません。
-t <timeout ms>
このタイムアウトよりも長くキーを押し続けると、xcape はキー イベントを生成しません。デフォルトは 500 ミリ秒です。
-e <map-expression>
式の文法は'ModKey=Key[|OtherKey][;NextExpression]'
です。
キー名のリストは、ヘッダー ファイルX11/keysymdef.h
にあります ( XK_
プレフィックスを削除します)。 X11 の制限により、シフト キーは、文字の実際の名前ではなく、シフト キーの後に押すキーを指定する必要があることに注意してください。たとえば、「{」を生成するには'ModKey=Shift_L|bracketleft'
という式を使用できます (「[」の上に「{」を含むキーがあると仮定します)。
10 進数 (プレフィックス#
)、8 進数 ( #0
)、または 16 進数 ( #0x
) でキーを指定することもできます。対応するキー名が見つからない限り、キーコードとして解釈されます。
これにより、左 Shift は単独で押して離したときに Escape を生成し、左コントロールは単独で押して離したときに Ctrl-O の組み合わせを生成します。
xcape -e 'Shift_L=Escape;Control_L=Control_L|O'
xmodmap と併用すると、通常のキーを追加の修飾子として機能させることができます。まず、xmodmap を使用してキーを修飾子にマップし、次に xcape を使用して修飾子をキーに戻します。ただし、これにはいくつかの制限があります。キーは放されるまで通常どおりに機能しません。特に、入力が速すぎると意図せずに修飾子として機能する可能性があります。これは xcape のバグではなく、このようにこれら 2 つのツールを一緒に使用することによる避けられない結果です。例として、次の一連のコマンドを使用して、スペース バーを押したときに追加の Ctrl キーとして機能させることができます (Space2ctrl と同様)。
# Map an unused modifier's keysym to the spacebar's keycode and make it a
# control modifier. It needs to be an existing key so that emacs won't
# spazz out when you press it. Hyper_L is a good candidate.
spare_modifier="Hyper_L"
xmodmap -e "keycode 65 = $spare_modifier"
xmodmap -e "remove mod4 = $spare_modifier" # hyper_l is mod4 by default
xmodmap -e "add Control = $spare_modifier"
# Map space to an unused keycode (to keep it around for xcape to
# use).
xmodmap -e "keycode any = space"
# Finally use xcape to cause the space bar to generate a space when tapped.
xcape -e "$spare_modifier=space"
キーコードを keysym に再マッピングする習慣がある場合 (たとえば、xmodmap を使用する)、遭遇する可能性のある 2 つの問題があります。
キーコードから keysym へのマッピング (xmodmap など) を変更するたびに、xcape を再起動する必要があります。そうしないと、xcape は古いマッピングを引き続き使用します。
送信するキーには、定義されたキーコードが必要です。したがって、たとえば、デフォルトのマッピングControl_L=Escape
の場合でも、xmodmap マッピングで定義されたエスケープ キーが必要です。 (私のキーボードでは送信できない 255 を使用することでこれを回避しています)。
最新バージョンは https://github.com/alols/xcape で見つけてください。
著者への連絡先は、albin dot olsson at gmail dot com です。