Leader Key

さて、前回はキーバインドを落とし込んだわけですが、今回はLeaderキーです。

A leader key is a a modal modifier key. If leader is specified in the configuration then pressing that key combination will enable a virtual LEADER modifier.

Leaderキーは、モーダルモディファイアキーです。Leaderキーが設定されている場合、そのキーの組み合わせを押すと、仮想的なリーダーモディファイアが有効になります。

Leaderキーという概念はWezTerm特有のものではく、tmuxvimなど古参のソフトウェアでも用いられています。

WezTerm でのデフォルトはCtrl-aです。 1

Note

Ctrl-aという表記はCtrlaを同時押しすることを示しています。

ということで、わたしはもうそのままCtrl-aで設定しています。 デフォルトのままでいいやー、って場合は書かなくてもOKです。

wezterm.lua

leader = { key = 'a', mods = 'CTRL', timeout_milliseconds = 2000 },

Note

timeout_millisecondsのパラメータを変えていますが、これは後で触れます。デフォルトは1000です。

vimtmux等を使用する場合は、これとバッティングしていないかチェックしときましょう。

Warning

macOSでUS配列なのに日本語IME使うような環境 2 ではCtrl-Spaceが入力ソースの切り替えに割り当てられています。

OSのショートカットキー等も含め、あらかじめ確認しておきましょう。

他のと被っちゃうと困っちゃいます。

timeout_milliseconds

これは前項で挙げたマニュアルの文章を引用しますが、

LEADER stays active until a keypress is registered (whether it matches a key binding or not), or until it has been active for the duration specified by timeout_milliseconds, at which point it will automatically cancel itself.

LEADERはキーが登録されるまで(キーバインディングにマッチするかどうかに関わらず)、 あるいはtimeout_millisecondsで指定された時間だけアクティブになり、その時点で自動的にキャンセルされます。

Leaderキーが一回押されたら、とりあえず何か次のキーが押されるか、指定ミリ秒経過するまでは待つよ〜。ってことですね。

例えば、

wezterm.lua

{ key = 'u', mods = 'LEADER', action = act.CharSelect },

...と、やる場合、CTRL-auと順番にキーを押す必要があるわけですが、 デフォルトでは、この操作が 1000ミリ秒( = 1秒)以内で完結しないといけないわけです。

1秒を長いと見るか短いと見るかは人それぞれなので、これをお好みに調整できるのが、前項のtimeout_millisecondsです。

で、もう一回キーバインド

さて、皆さんはお気づきだろうか…。

デフォルトのキー設定ではLeaderキーなんて一切使われていないことに…😱

例えばこれ。

Default KeyBinds

{ key = '"', mods = 'ALT|CTRL', action = act.SplitVertical{ domain =  'CurrentPaneDomain' } },
{ key = '%', mods = 'ALT|CTRL', action = act.SplitHorizontal{ domain =  'CurrentPaneDomain' } },

Note

ALT|CTRLAltキーとCtrlキーを同時押しです。

さらに"を押せと言われればShiftキーを押しながら'です。 3

…なんか、難しくないですか?

それだったら、下のようにしたほうが楽じゃないですか?

keybinds.lua

{ key = '"', mods = 'LEADER', action = act.SplitVertical { domain = 'CurrentPaneDomain' } },
{ key = '%', mods = 'LEADER', action = act.SplitHorizontal { domain = 'CurrentPaneDomain' } },

tmuxと同じキーバインドですね。ペイン操作もWezTermに一任しちゃいます。

tmux使ってないのに同等の機能が実現できちゃうんですよ⁉️ すごくないです❓☺️

もしどこかでtmuxを使うことがあっても同一操作なので迷わず使えます、たぶん❗

Note

さらにタイムリーなことに、Copy Modeの各種jump機能も実装されました。

update docs for new copy-mode functions

tmuxのキーバインドを完全に真似るのであれば、CopyModeに入るキーバインドはこれですね。

  { key = '[', mods = 'LEADER', action = act.ActivateCopyMode },

jump機能はデフォルトのままでtmuxと同じキーバインドが割り当てられているようなので、そのままいけます。 4

ということで、キーバインドは色々試してみてほしいです。

A KeyAssignment represents a pre-defined function that can be applied to control the Window, Tab, Pane state typically when a key or mouse event is triggered.

KeyAssignment は、キーまたはマウス イベントがトリガーされたときに、通常 Window、Tab、Pane の状態を制御するために適用できる事前定義された関数を表します。

Success

キーバインドについてはこのくらいでしょうか。次からは外観を変えていきたいと思います。

1: tmux のデフォルトは CTRL-b、vimのデフォルトは\です。 ちょっと遠い位置に置かれていて大変なので、Leaderキーのカスタマイズは一般的に行われているみたいです。 メジャーなカスタマイズ先はCTRL-aや、CTRL-jCTRL-,CTRL-Spaceあたりでしょうか❓

2: 色んな意味で少数派なんですけどね😅 わたしもこの環境です。

3: USキーボードの場合。

4: 3.5 Keybindで「いや、デフォルトのキーバインド無効にしたじゃないかー👿」と思われた方、ごもっともです...。 実はcopy-modeのキーバインドには触れていませんでした。ちょっとこの辺、複雑ですよね...。また今度改編します。