Skip to content

説明書 §3 キーバインディング

Koichi Murase edited this page Jul 10, 2024 · 32 revisions

[ 日本語 | English ] ≫ 説明書 [§1 基本 | §2 描画 | §3 束縛 | §4 編集 | §5 Emacs | §6 Vim | §7 補完 | §8 他 | 索引]

3. キーバインディング

3.1 キー指定子 (kspec) / キー列指定子 (kspecs)

ble.sh では受信した "バイト列" を復号して "文字の列" とし、更にそれをデコードして "キーの列" に変換します。 キー指定子 (kspec) は単一の "バイト" または "文字" または "キー入力" を表現する共通の形式を持った文字列です。 キー指定子は C-M- のような0個以上の修飾の後にキー名 (keyname) を並べた形式を持ちます。 修飾は「一文字 + -」の形式を持ち、有効な修飾は以下の何れかのみです。

修飾の指定 修飾キー
S- Shift キー
C- Control キー
M- Meta キー
A- Alter キー
s- Super キー
H- Hyper キー

但し、Alter, Super, Hyper 修飾は通常端末が対応していないので既定では使われません。 特に、キーボードに Alter キーがある場合でも、 通常は端末によって Meta 修飾として取り扱われることに注意して下さい。

keyname は文字入力またはキー入力を表す非空白文字からなる1文字以上の文字列です。 keyname が1文字からなる場合はその文字の文字入力を表します。 例えば C-M-- は「Control + Meta + -」という入力を表します。 keynameU+hhhh (h は16進数字) の形式の時は、対応する Unicode 文字と解釈されます。 keyname がその他の形式の時は、特殊文字・制御文字または特殊キーの入力と解釈されます。

特殊文字を表す keyname は以下の通りです。

keyname 文字コード keyname 文字コード
SP 32 (空白) DEL 127

C0 制御文字を表す keyname は以下の通りです。 HT 及び CR はそれぞれ TAB 及び RET の別名として取り扱われます。 これらの制御文字は文字として受信されても、キーの列へのデコードの過程で C-@, C-a - C-z, C-[, C-\, C-], C-^, C-_ に変換されるので、実際にキー入力列として自然に現れることは通常ありません

keyname 文字コード keyname 文字コード
NUL 0 DLE 16
SOH 1 DC1 17
STX 2 DC2 18
ETX 3 DC3 19
EOT 4 DC4 20
ENQ 5 NAK 21
ACK 6 SYN 22
BEL 7 ETB 23
BS 8 CAN 24
HT, TAB 9 EM 25
LF 10 SUB 26
VT 11 ESC 27
FF 12 FS 28
CR, RET 13 GS 29
SO 14 RS 30
SI 15 US 31

C1 制御文字を表す keyname は以下の通りです。

keyname 文字コード keyname 文字コード
PAD 128 DCS 144
HOP 129 PU1 145
BPH 130 PU2 146
NBH 131 STS 147
IND 132 CCH 148
NEL 133 MW 149
SSA 134 SPA 150
ESA 135 EPA 151
HTS 136 SOS 152
HTJ 137 SGCI 153
VTS 138 SCI 154
PLD 139 CSI 155
PLU 140 ST 156
RI 141 OSC 157
SS2 142 PM 158
SS3 143 APC 159

修飾キー自体を表す keyname は以下の通りです。

keyname 説明
shift Shift キー
control Control キー
meta Meta キー
alter Alter キー
super Super キー
hyper Hyper キー

特殊キーを表す keyname は以下の通りです。

keyname 説明
insert Insert キー
delete Delete キー
home Home キー
end End キー
prior PageUp キー
next PageDown キー
up ↑ (上) キー
down ↓ (下) キー
left ← (左) キー
right → (右) キー
f1-f20 Function キー
paste_begin Bracketed Paste Mode 開始
paste_end Bracketed Paste Mode 終了

ble.sh で使う特別な keyname は以下の通りです。

keyname 説明
__defchar__ (キーマップの項で後述)
__default__ (キーマップの項で後述)
__batch_char__ (キーマップの項で後述)
__before_widget__ (キーマップの項で後述)
__after_widget__ (キーマップの項で後述)
__attach__ (キーマップの項で後述)
__detach__ (キーマップの項で後述)
__ignore__ (内部使用) 処理済みの受信シーケンスを無視
__error__ (内部使用) 認識できないCSIシーケンス
@ESC (内部使用) 単独受信した ESC を区別する為の文字
@NUL (内部使用) NUL を符号化する時に使う文字

キー列指定子 (kspecs) は連続して入力されるキーの列を表現する文字列です。 キー指定子 (kspec) を 1 つ以上空白で区切って繋げた形式を持ちます。 例えば kspecs C-x C-r は「Control + x を入力した後に Control + r を入力する」という操作を表します。

3.1.1 RET, ESC, TAB, BS, DEL, C-BS の表現

既に述べた通り、端末から送られるデータにおいて制御文字は Control 修飾された通常キーのキーボード入力 (C-@, C-a...C-z, C-[, C-\, C-], C-^, C-_). を表現するのに使われます。 この為、制御文字に関連する一部のキーは、大概異なるキーの Control 修飾として解釈される事になります。 端末が modifyOtherKeys モードに対応していてかつそのモードが有効になっている時に限り、 本来の制御文字として区別されてキーが受信されます。 以下の表にその様なキーをまとめます。 但し、実際の振る舞いは各端末によって異なる可能性があります。

キー 通常の表現 modifyOtherKeys モードでの表現
Return, Enter C-m RET
Tab C-i TAB
Escape C-[ ESC
Backspace, DEL C-? (または C-h) BS, DEL
C-Backspace, C-DEL C-h (または C-?,C-_, C-w) C-BS, C-DEL

特に BackspaceC-Backspace に関しては端末によって大きく振る舞いが異なります。 以下の表に、各端末を、BackspaceC-Backspace に対してどのような制御文字を送信するかで分類します。

Backspace C-Backspace 端末
C-? C-h Linux console, mintty, xterm, konsole, terminator, cygwin (pcon), Windows terminal, rxvt, urxvt, GNOME Terminal, alacritty, kitty
C-? C-? FreeBSD console, lxterminal, termit, mlterm-3.8.8
C-? C-w VSCode Terminal
C-? C-_ contra
C-h C-h Solaris console, terminology, RLogin, Poderosa5
C-h C-? Minix console, Poderosa4

これらのキーに対して束縛する時には、両方の表現に対して同様の束縛を行う事が推奨されます。

#

ble-bind -m emacs -f 'C-m' accept-single-line-or-newline
ble-bind -m emacs -f 'RET' accept-single-line-or-newline

ble-bind -m vi_imap -f 'C-i' 'vi_imap/complete'
ble-bind -m vi_imap -f 'TAB' 'vi_imap/complete'

ble-bind -m vi_imap -f 'ESC' 'vi_imap/normal-mode'
ble-bind -m vi_imap -f 'C-[' 'vi_imap/normal-mode'

# Backspace
ble-bind -m emacs -f 'C-?' 'delete-region-or delete-backward-char'
ble-bind -m emacs -f 'DEL' 'delete-region-or delete-backward-char'
ble-bind -m emacs -f 'C-h' 'delete-region-or delete-backward-char'
ble-bind -m emacs -f 'BS'  'delete-region-or delete-backward-char'

# Control-Backspace (典型的な現代的端末向けの設定)
ble-bind -m emacs -f 'C-h'   'emacs/undo'
ble-bind -m emacs -f 'C-DEL' 'emacs/undo'
ble-bind -m emacs -f 'C-BS'  'emacs/undo'

# Control Backspace (FreeBSD console, Minix console, lxterminal, termit, Poderosa)
ble-bind -m emacs -f 'C-?'   'emacs/undo'
ble-bind -m emacs -f 'C-DEL' 'emacs/undo'
ble-bind -m emacs -f 'C-BS'  'emacs/undo'

# Control Backspace (VSCode terminal)
ble-bind -m emacs -f 'C-w'   'emacs/undo'
ble-bind -m emacs -f 'C-DEL' 'emacs/undo'
ble-bind -m emacs -f 'C-BS'  'emacs/undo'

# Control Backspace (contra)
ble-bind -m emacs -f 'C-_'   'emacs/undo'
ble-bind -m emacs -f 'C-DEL' 'emacs/undo'
ble-bind -m emacs -f 'C-BS'  'emacs/undo'

Escape キー (C-[/ESC) に対して束縛を行う場合には、§3.5 も御参照下さい。

3.2 編集関数 (widget)

ble.sh ではユーザの入力操作に対する処理は全て編集関数 (widget) を実行する事によって実施されます。 各編集関数には名前があり、ble/widget/編集関数名 というシェル関数として実装されます。 個別の編集関数については後の関連する項目の中で説明します。 新しい編集関数の開発方法は "編集関数の作成" を参照して下さい。

3.3 キーマップ (keymap)

キーマップとはどのキー入力 kspecs に対してどの編集関数が呼ばれるかを設定する表で、モード毎にキーマップが存在します。 各キーマップには名前が存在し、名前はCの識別子と同じ形式でなければなりません。 以下は基本的なキーマップの一覧です。

キーマップ名 説明 ロードフック
emacs (Emacs 編集モード) 基底キーマップ hook:keymap_emacs_load
vi_imap (Vim 編集モード) 基底キーマップ (挿入モード) hook:keymap_vi_load
vi_nmap (Vim 編集モード) ノーマルモードのキーマップ hook:keymap_vi_load
vi_omap (Vim 編集モード) オペレータ待機モードのキーマップ hook:keymap_vi_load
vi_xmap (Vim 編集モード) ビジュアルモードのキーマップ hook:keymap_vi_load
vi_smap (Vim 編集モード) 選択モードのキーマップ hook:keymap_vi_load
vi_cmap (Vim 編集モード) コマンドモードのキーマップ hook:keymap_vi_load
vi_digraph (Vim 編集モード) ダイグラフ入力用のキーマップ hook:keymap_vi_load
safe 異常時の基底キーマップ
isearch インクリメンタルサーチのキーマップ
nsearch 非インクリメンタルサーチのキーマップ
read ble.sh の提供する read -e のキーマップ
lastarg insert-last-argument で用いられるキーマップ
auto_complete 自動補完で用いられるキーマップ hook:complete_load
menu_complete メニュー補完で用いられるキーマップ hook:complete_load
dabbrev 動的略語展開で用いられるキーマップ hook:complete_load

上の表でロードフックが指定されているキーマップは初期化が遅延されます。 それらのキーマップに対する操作 (後述の ble-bind による操作) も自動的に遅延されます。 (ble-0.3 以前では操作の遅延は行われず、キーマップに対する操作を行うとその場でキーマップが初期化されます。) キーマップに対する操作を直接記述することも可能ですが、 ロードフックを通して記述することも可能です。

# 例1: 直接記述
ble-bind -m vi_imap -f 'C-^' 'bell'
ble-bind -m vi_omap -f 'a' 'vi-command/text-object-outer'


# 例2: ロードフック経由で記述

# Vim 編集モード初期化用のシェル関数を作成します。
function my-keymap-settings-for-vim-mode {
  ble-bind -m vi_imap -f 'C-^' 'bell'
  ble-bind -m vi_omap -f 'a' 'vi-command/text-object-outer'
}

# 作成した関数を keymap_vi_load に登録(追加)します。
blehook/eval-after-load keymap_vi my-keymap-settings-for-vim-mode
# ble-0.3以前
# ble/array#push _ble_keymap_vi_load_hook my-keymap-settings-for-vim-mode

特別な kspecs として以下の物が利用できます。 これらは特別な状況で呼び出される編集関数を設定するのに使います。

keyname 編集関数が呼び出される状況
__defchar__ 他に束縛のない文字入力があった時
__default__ 他に束縛のない文字入力・キー入力があった時
__batch_char__ 他に束縛のない文字入力が連続してあった時
__before_widget__ そのキーマップで編集関数を呼び出す前
__after_widget__ そのキーマップで編集関数を呼び出した後
__attach__ そのキーマップが基底になった時
__detach__ そのキーマップが基底でなくなった時

但し、束縛がない文字が __defchar__ で処理された場合は、 その文字に対して __default__ は呼び出されません。 __before_widget__, __after_widget__ は、 これらの束縛自体によって呼び出される編集関数の前後には適用されません。

3.4 関数 ble-bind

3.4.1 編集関数への束縛

ble-bind [-m keymap] -f kspecs widget

キー列指定子 kspecs が入力された時に呼び出される編集関数として widget を登録します。 この事を「kspecswidget に束縛する」と表現します。 keymap はキーマップを指定します。 省略した場合はその時の編集モードの基底キーマップに対して束縛が実行されます。

3.4.2 ユーザ定義編集関数への束縛

ble-bind [-m keymap] -x kspecs shell-command

# 互換性: ble-0.2 以前では以下の形式で束縛します
ble-bind [-m keymap] -xf kspecs shell-command   # ble-0.2

kspecs をユーザ定義編集関数 shell-command に束縛します。 ユーザ定義編集関数は Bash の bash -x 'kseq: shell-command' で使えるものと同様に実装します。 つまり、ble.shREADLINE_LINE に現在の編集文字列を設定し、 READLINE_POINT に現在のカーソル位置を設定して、ユーザ定義編集関数を呼び出します。 ユーザ定義編集関数の呼び出し後の READLINE_LINEREADLINE_POINT の値を用いて、 現在の編集内容を更新します。

3.4.3 外部コマンドへの束縛

ble-bind [-m keymap] -c kspecs shell-command

# 互換性: ble-0.2 以前では以下の形式で束縛します
ble-bind [-m keymap] -cf kspecs shell-command   # ble-0.2

kspecs を外部コマンド shell-command に束縛します。 一旦、入力を中断して外部コマンド shell-command を呼び出し、 外部コマンドが終了した後に再び入力を再開します。

3.4.4 マクロへの束縛

ble-bind [-m keymap] -s kspecs keyseq

# 互換性: ble-0.3 以降で利用可能

keyseq には Bash 組み込みの bind で使用する keyseq の形式で指定します。

3.4.5 束縛の削除

ble-bind [-m keymap] [-fxc] kspecs ''
ble-bind [-m keymap] [-fxc] kspecs -

束縛を削除する場合は編集関数名・コマンド名として - または空文字列を指定します。 -f, -x, -c の何れを用いても、 束縛されている関数・コマンドの種類によらず削除を実行します。

3.4.6 タイムアウトの設定

# タイムアウトの設定
ble-bind [-m keymap] -T kspecs timeout

# タイムアウトの削除
ble-bind [-m keymap] -T kspecs ''

指定した kspecs に対するタイムアウトを設定します。 kspecs が入力された時に未だ一意確定でなく更にその kspecs にタイムアウトが設定されている場合、 指定したタイムアウトが経過しても続きの入力がない時にその時点で kspecs を処理します。

3.4.7 キーの CSI シーケンスを登録

これは文字の列からキーの列にデコードする時に参照される設定です。

ble-bind --csi Ft kspec
ble-bind --csi Ps~ kspec

Ft または Ps~CSI に引き続いて受信される文字列です。 FtFt 文字 (@ - ~ の文字) 1つです。 Ps~Ps (整数) にチルダ ~ を繋げた文字列です。 登録されたシーケンスとそれを Function キー修飾したものを、 それぞれ kspec 及びそれを修飾したものにデコードする様に設定します。

#
ble-bind --csi A up
ble-bind --csi '11~' f1

3.4.8 キーの文字シーケンスを登録

これは文字の列からキーの列にデコードする時に参照される設定です。

ble-bind -k kspecs kspec

文字の列 kspecs をキー kspec にデコードする様に設定します。

#
ble-bind -k 'ESC O A' up

3.4.9 キーマップのカーソルの設定

そのキーマップが有効になっている時のカーソル形状を設定できます。

ble-bind -m KEYMAP --cursor CODE

CODE には DECSCUSR コードを指定します。 空文字列を指定した場合、呼び出し元キーマップのカーソル形状を継承します。

実際にカーソル形状を変更するには端末は制御機能 DECSCUSR に対応している必要があります。 ble.sh は terminfo 項目 Ss を参照します。 お使いの端末が実際に DECSCUSR に対応しているのにも拘わらず Ss が terminfo に含まれていない場合には、以下の様に直接 ble.sh の端末データベースを上書きできます。

# 例: blerc

_ble_term_Ss=$'\e[@1 q'

コード 0 は端末の既定のカーソル形状を意味します。 端末マルチプレクサをお使いの場合は、端末マルチプレクサと外側の端末の既定のカーソル形状が矛盾しないようにする必要があります。 例えば tmux はそれ自体が既定のカーソル形状を持っている為、外側の端末と衝突が起こる可能性があります。 tmux の既定のカーソル形状は VT 端末と同様に点滅するブロック 1 です。 tmux-3.4 以降では既定のカーソル形状をオプション cursor-style を通じて変更できます:

# ~/.tmux.conf (必要条件 tmux >= 3.4)

#
set -g cursor-style blinking-block     # 外側の端末の既定のカーソル形状が 1 の時
set -g cursor-style block              # 外側の端末の既定のカーソル形状が 2 の時
set -g cursor-style blinking-underline # 外側の端末の既定のカーソル形状が 3 の時
set -g cursor-style underline          # 外側の端末の既定のカーソル形状が 4 の時
set -g cursor-style blinking-bar       # 外側の端末の既定のカーソル形状が 5 の時
set -g cursor-style bar                # 外側の端末の既定のカーソル形状が 6 の時

tmux オプション cursor-style は実際は tmux-3.3 で導入されましたが、設定が新規ウィンドウに適用されないというバグがある為 tmux-3.4 以降でないと実用にはなりません。 また、set -g cursor-style default は外側の端末に DECSCUSR(0) を送信して外側の既定カーソル形状を指定するのには使えません。 GNU screen はカーソル形状は保持しない為、何も設定しなくても衝突は起こりません。

3.4.10 現在の束縛の確認

ble-bind [-m keymap]... -P        # ≧ ble-0.3
ble-bind [-m keymap]... --print   # ≧ ble-0.3

# 互換性: ble-0.2 以前では以下の形式で確認します
ble-bind -d   # ≦ ble-0.2

指定した keymap に登録されている束縛を出力します。 keymap が一つも指定されていない場合は、 現在ロードされている全てのキーマップについて束縛を出力します。

3.4.11 現在の束縛を内部形式で出力

ble-bind [-m keymap]... -D
ble-bind [-m keymap]... --dump   # ≧ ble-0.3

-P の代わりに -D を使用すると、内部で使用している形式で現在の束縛のデータを出力することができます。 keymap が一つ以上指定されている時、指定された keymap のデータを出力します。 keymap が一つも指定されていない時、現在ロードされている全データを出力します。

3.4.12 編集関数の一覧

ble-bind -L
ble-bind --list-widgets     # ≧ ble-0.3

# 互換性: ble-0.2 以前では以下の形式で確認します
ble-bind -L
ble-bind --list-functions   # ≦ ble-0.2

現在定義されている編集関数名の一覧を出力します。

3.5 ESC の受信と解釈

ESC を受信した直後に次のバイトが受信されずにタイムアウトした時、 その ESC は「単独で受信された」と見なされます。 それ以外の場合は「後続のバイトと一緒に受信された」と見なされます。

後続のバイトと一緒に受信された ESC は、 常に次に受信するキーのメタ修飾 (M-) として解釈されます。 単独で受信された ESC の解釈は、 後述の設定変数 decode_isolated_esc によって制御します。

タイムアウトの長さは端末からシェルまでの経路の各ステップの累積になります。 仮想端末ハンドラのタイムアウト、端末マルチプレクサーのタイムアウト、 GNU Readline のタイムアウトなどが考えられます。 それぞれのタイムアウトの設定方法は続く節を参照して下さい。 特に単独で ESC または C-[ を入力した時に端末から送信される ESC と、 Meta 修飾によって端末から送信される ESC を区別したい時は、 タイムアウトをできるだけ短く設定します。

3.5.1 仮想端末ハンドラーのタイムアウトの設定 (stty)

stty コマンドを使用して設定します。 通常は既定のタイムアウトは 0 なので設定を変更する必要はありません。 タイムアウトは以下のコマンドで変更できます。単位は 1/10 秒です。

# 例: ~/.bashrc または ~/.blerc にて

stty time 0

3.5.2 GNU Readline のタイムアウトの設定 (bind)

Bash 4.3 以降では、readline 変数 keyseq-timeout を用いて Readline のタイムアウトを設定できます。 ~/.bashrc で設定を行うには組み込みコマンド bind を使用します。単位はミリ秒です。

# 例: ~/.bashrc または ~/.blerc にて

bind 'set keyseq-timeout 1'

3.5.3 端末マルチプレクサ screen のタイムアウトの設定 (~/.screenrc)

端末マルチプレクサ GNU Screen (screen) を利用している場合は、 screen のタイムアウトも設定する必要があります。 ~/.screenrc に以下の設定を記述することでタイムアウトを設定できます。 単位はミリ秒です。

# 例: ~/.screenrc にて

maptimeout 1

また、bindkey -t によって ESC から始まるキーシーケンスを登録している場合は、 タイムアウトが無効化される事に注意が必要です。 この時 screen は必ず後続のバイトを待つため、 ble.sh は必ず後続のバイトと一緒に ESC を受信することになります。 単独の ESC を区別して受信したい時は bindkey -t によって ESC から始まるキーシーケンスを登録するべきではありません。

3.5.4 端末マルチプレクサ tmux のタイムアウトの設定 (~/.tmux.conf)

端末マルチプレクサ tmux を利用している場合も、 同様にタイムアウトを設定する必要があります。 ~/.tmux.conf に次の設定を記述します。単位はミリ秒です。

# 例: ~/.tmux.conf にて

set -sg escape-time 1

3.5.5 設定変数 decode_isolated_esc (v0.2)

# 既定値
bleopt decode_isolated_esc=auto

この設定変数に esc が設定されている場合、 単独で受信した ESCC-[ として解釈します。 meta が設定されている場合、 単独で受信した ESC は次に受信するキーの Meta 修飾 (M-) として解釈します。 auto が設定されている場合、 現在有効なキー列の途中ではなくかつ現在のキーマップで C-[ が束縛されている時に 単独で受信した ESCC-[ として解釈し、それ以外の時に Meta 修飾 M- として解釈します。

キーボードに Meta 修飾キーがなく ESC に続けてキーを入力することで Meta 修飾の代わりとしているユーザは meta を設定して下さい。 Meta 修飾キーを押しながら入力したキーと ESC または C-[ を単独で入力した時で振る舞いを変えたいユーザは esc または auto を設定して下さい。

3.6 modifyOtherKeys の設定

ble.sh では様々なキー操作を区別する為に、 端末の modifyOtherKeys 機能を操作します。 端末が対応している場合、modifyOtherKeys には3つの状態があります。 状態 0 は通常の状態で、様々なキー入力はそのまま端末から送信されます。 状態 1 は修飾キーと一緒に通常の文字を入力した時に、 修飾が判別できるように特別なシーケンスとして端末から送信されます。 状態 2RET キーや TAB キーも含めて、 全ての入力が修飾の状態を持った特別なシーケンスとして端末から送信されます。 ble.sh は端末の modifyOtherKeys を変更するために制御シーケンスを端末に送信します。 状態 0 にする時は CSI > 4 m を、 状態 1 にする時は CSI > 4 ; 1 m を、 状態 2 にする時は CSI > 4 ; 2 m を送信します。

tmuxmodifyOtherKeys を利用できるようにするには以下の設定を ~/.tmux.conf に指定してください。 設定を反映させるためには全ての既存セッションを一旦終了する必要があるかもしれません。

# ~/.tmux.conf

set -g extended-keys on

以下に説明する設定変数を用いて、ble.sh がキー入力を待つ時の modifyOtherKeys の状態と、 それ以外 (コマンド実行時など) の modifyOtherKeys の状態をそれぞれ設定することができます。

3.6.1 設定変数 term_modifyOtherKeys_internal (空/非空) (v0.3)

# 既定値
bleopt term_modifyOtherKeys_internal=auto

ble.sh がキー入力を待つ状態に入る時に、端末の modifyOtherKeys をどう変更するかを設定します。 この設定変数に 0 または 1 または 2 が設定されている場合、その状態に変更します。 この設定変数に auto が設定されている場合、 端末の DA2 応答が 1; で始まっている場合を除いて状態 2 にします。 DA2 応答が 1; で始まっている場合は、 制御シーケンスに対応していない libvte の可能性があるので状態を変更しません (制御シーケンスは送りません)。 それ以外の値が設定されている場合、状態を変更しません (制御シーケンスは送りません)。

3.6.2 設定変数 term_modifyOtherKeys_external (空/非空) (v0.3)

# 既定値
bleopt term_modifyOtherKeys_external=auto

コマンド実行時など ble.sh 以外がキー入力を受け取る可能性がある状態に入る時に、 端末の modifyOtherKeys をどう変更するかを設定します。 この設定変数に 0 または 1 または 2 が設定されている場合、その状態に変更します。 この設定変数に auto が設定されている場合、 term_modifyOtherKeys_internal と同様に、 端末の DA2 応答が 1; で始まっている場合を除いて状態 1 にします。 それ以外の値が設定されている場合、状態を変更しません (制御シーケンスは送りません)。

3.6.3 設定変数 term_modifyOtherKeys_passthrough_kitty_protocol (空/非空) (v0.4)

# 既定値
bleopt term_modifyOtherKeys_passthrough_kitty_protocol=

この設定は、一番外側の端末が kitty の時に、kitty keyboard protocol の制御シーケンスを端末マルチプレクサ越しに送信するかどうかを指定します。 非空文字列が指定されている時にマルチプレクサ越しの送信が有効化されます。

  • この設定は特に tmux 3.4+ と組み合わせて使う事が想定されています。 CapsLock または NumLock が有効化されていない限りは tmux 3.3a 以下でもご利用いただけます。 また、この設定を有効化した場合、tmux からデタッチ後にキーボード入力に以下の問題が生じる可能性がありますのでご注意下さい。 拡張キーシーケンスに対応していない端末アプリケーションを操作できなくなる可能性があります。

  • GNU screen と組み合わせて使った場合、高い確率で問題が生じます。 2つ以上の window が screen にあってその内の一つで ble.sh が前面で動作している時または2つ以上の window で ble.sh が動作している時、 拡張キーシーケンスに対応していない端末アプリケーションを操作できなくなります。

3.6.4 modifyOtherKeys に対応していない端末での設定

modifyOtherKeys に対応していない端末でも ble.sh は問題なくお使いいただけます。

但し、C-1C-S-aS-TABC-RET などの特別な組み合わせのキーを端末から送信できないという端末側の制限があります。 もし、お使いの端末が各キーの組み合わせに対して一つ一つシーケンスを設定できる場合には、 お好みのキーの組み合わせに対してシーケンス ESC [ code ; mod u を送信するように設定して下さい。 但し、code は文字の Unicode 値を十進整数で表現したものです。 mod1 + 各修飾の値の和 を十進整数で表現したものです。 各修飾の値は以下の通りです。

修飾 修飾の値
S- 1
M- 2
C- 4
s- 8
H- 16
A- 32

具体例を以下に示します。

キー入力 端末が送信するシーケンス キー入力 端末が送信するシーケンス
S-RET ESC [ 1 3 ; 2 u C-0 ESC [ 4 8 ; 5 u
C-RET ESC [ 1 3 ; 5 u C-1 ESC [ 4 9 ; 5 u
C-S-RET ESC [ 1 3 ; 6 u C-2 ESC [ 5 0 ; 5 u
S-TAB ESC [ 9 ; 2 u C-3 ESC [ 5 1 ; 5 u
C-TAB ESC [ 9 ; 5 u C-4 ESC [ 5 2 ; 5 u
C-S-TAB ESC [ 9 ; 6 u C-5 ESC [ 5 3 ; 5 u
S-SP ESC [ 3 2 ; 2 u C-6 ESC [ 5 4 ; 5 u
C-S-SP ESC [ 3 2 ; 6 u C-7 ESC [ 5 5 ; 5 u
S-BS ESC [ 8 ; 2 u C-8 ESC [ 5 6 ; 5 u
C-S-BS ESC [ 8 ; 6 u C-9 ESC [ 5 7 ; 5 u
C-S-a ESC [ 9 7 ; 6 u C-S-z ESC [ 1 2 2 ; 6 u

以下の Function キー修飾については殆どの端末が対応している筈ですが、もしそうでない場合は一つ一つ設定します。 insertdeleteprior については端末の種類 (xterm系またはvt100系) によってシーケンスが異なります。 現代の端末は基本的にxterm系です。

キー入力 端末が送信するシーケンス キー入力 端末が送信するシーケンス キー入力 端末が送信するシーケンス
S-up ESC [ 1 ; 2 A C-up ESC [ 1 ; 5 A C-S-up ESC [ 1 ; 6 A
S-down ESC [ 1 ; 2 B C-down ESC [ 1 ; 5 B C-S-down ESC [ 1 ; 6 B
S-right ESC [ 1 ; 2 C C-right ESC [ 1 ; 5 C C-S-right ESC [ 1 ; 6 C
S-left ESC [ 1 ; 2 D C-left ESC [ 1 ; 5 D C-S-left ESC [ 1 ; 6 D
S-home ESC [ 1 ; 2 H C-home ESC [ 1 ; 5 H C-S-home ESC [ 1 ; 6 H
S-end ESC [ 1 ; 2 F C-end ESC [ 1 ; 5 F C-S-end ESC [ 1 ; 6 F
S-insert (xterm系) ESC [ 2 ; 2 ~ C-insert ESC [ 2 ; 5 ~ C-S-insert ESC [ 2 ; 6 ~
S-delete (xterm系) ESC [ 3 ; 2 ~ C-delete ESC [ 3 ; 5 ~ C-S-delete ESC [ 3 ; 6 ~
S-prior (xterm系) ESC [ 5 ; 2 ~ C-prior ESC [ 5 ; 5 ~ C-S-prior ESC [ 5 ; 6 ~
S-insert (vt100系) ESC [ 1 ; 2 ~ C-insert ESC [ 1 ; 5 ~ C-S-insert ESC [ 1 ; 6 ~
S-delete (vt100系) ESC [ 4 ; 2 ~ C-delete ESC [ 4 ; 5 ~ C-S-delete ESC [ 4 ; 6 ~
S-prior (vt100系) ESC [ 3 ; 2 ~ C-prior ESC [ 3 ; 5 ~ C-S-prior ESC [ 3 ; 6 ~
S-next ESC [ 6 ; 2 ~ C-next ESC [ 6 ; 5 ~ C-S-next ESC [ 6 ; 6 ~

3.7 入力に関係する設定変数

3.7.1 設定変数 decode_abort_char (整数値) (v0.3)

# 既定値
bleopt decode_abort_char=28

この変数は大量の入力を処理している時にそれを中断する為に使う入力のバイト値を指定します。 既定で C-\ に対応する 28 が設定されています。

3.7.2 設定変数 decode_error_char_abell (空/非空)

# 既定値
bleopt decode_error_char_abell=     # ble-0.2以降
bleopt error_char_abell=            # ble-0.1

この設定変数に非空文字列が設定されている場合、 不正に符号化された文字を受け取った時にベルを鳴らします (BEL を送信します)。

3.7.3 設定変数 decode_error_char_vbell (空/非空)

# 既定値
bleopt decode_error_char_vbell=1    # ble-0.2以降
bleopt error_char_vbell=1           # ble-0.1

この設定変数に非空文字列が設定されている場合、 不正に符号化された文字を受け取った時にビジュアルベルを表示します。

3.7.4 設定変数 decode_error_char_discard (空/非空)

# 既定値
bleopt decode_error_char_discard=   # ble-0.2以降
bleopt error_char_discard=          # ble-0.1

この設定変数に非空文字列が設定されている場合、 不正に符号化された文字を受信した文字の列から除去します。 空文字列が設定されている場合は、 エラーを無視して復元された文字を続く処理に渡します。

3.7.5 設定変数 decode_error_cseq_abell (空/非空) (v0.3)

# 既定値
bleopt decode_error_cseq_abell=

この設定変数に非空文字列が設定されている場合、 認識できない CSI シーケンスを受け取った時にベルを鳴らします (BEL を送信します)。

3.7.6 設定変数 decode_error_cseq_vbell (空/非空) (v0.3)

# 既定値
bleopt decode_error_cseq_vbell=1

この設定変数に非空文字列が設定されている場合、 認識できない CSI シーケンスを受け取った時にビジュアルベルを表示します。

3.7.7 設定変数 decode_error_cseq_discard (空/非空) (v0.3)

# 既定値
bleopt decode_error_cseq_discard=

この設定変数に非空文字列が設定されている場合、 認識できない CSI シーケンスを無視します。 空文字列が設定されている場合は、 改めて CSI シーケンスを構成する一つ一つの文字を解釈します。

3.7.8 設定変数 decode_error_kseq_abell (空/非空)

# 既定値
bleopt decode_error_kseq_abell=1    # ble-0.2以降
bleopt error_kseq_abell=1           # ble-0.1

この設定変数に非空文字列が設定されている場合、 受信したキー列に対応する束縛が存在しない時にベルを鳴らします (BEL を送信します)。

3.7.9 設定変数 decode_error_kseq_vbell (空/非空)

# 既定値
bleopt decode_error_kseq_vbell=1    # ble-0.2以降
bleopt error_kseq_vbell=1           # ble-0.1

この設定変数に非空文字列が設定されている場合、 受信したキー列に対応する束縛が存在しない時にビジュアルベルを表示します。

3.7.10 設定変数 decode_error_kseq_discard (空/非空)

# 既定値
bleopt decode_error_kseq_discard=1  # ble-0.2以降
bleopt error_kseq_discard=1         # ble-0.1

この設定変数に非空文字列が設定されている場合、 受信したキー列に対応する束縛が存在しない時にそれまで読み取った全てのキーを廃棄します。 空文字列が設定されている場合は、 最初のキーだけを除去して2つ目以降のキーから再解釈します。

3.7.11 設定変数 decode_macro_limit (算術式) (v0.4)

# 既定値
bleopt decode_macro_limit=1024

キーボードマクロの再帰実行回数の上限を指定します。

3.7.12 設定変数 default_keymap

# 既定値
bleopt default_keymap=auto

この設定変数は既定の編集モードを設定します。 値 auto は、Bash の編集モードに応じて切り替えることを意味します。 Bash が Emacs 編集モード (set -o emacs 既定) の時、ble.sh の Emacs 編集モードが有効になります。 Bash が Vi 編集モード (set -o vi) の時、ble.sh の Vim 編集モードが有効になります。 値 emacs を指定した時は、Bash の編集モードによらずに、常に ble.sh の Emacs 編集モードを使用します。 値 vi を指定した時は、常に ble.sh の Vim 編集モードを使用します。

3.7.13 設定変数 term_bracketed_paste_mode (空/非空) (v0.4)

# bashrc

# 既定値
bleopt term_bracketed_paste_mode=on
bind 'set enable-bracketed-paste on'

非空文字列が指定されている場合、端末の Bracketed Paste Mode (DEC mode 2004) を有効にします。 Readline 変数 enable-bracketed-paste と同期されます。


[ 日本語 | English ] ≫ 説明書 [§1 基本 | §2 描画 | §3 束縛 | §4 編集 | §5 Emacs | §6 Vim | §7 補完 | §8 他 | 索引]

Clone this wiki locally