web-dev-qa-db-ja.com

Zshは修飾子付きのterminfoキーを取得します

ZshのArchLinux Wikiページには、terminfoからキーシーケンスを取得する例があります。

typeset -g -A key

key[Home]="${terminfo[khome]}"
key[End]="${terminfo[kend]}"
...

しかし、どうすれば修飾子付きのものを入手できますか?具体的には、Alt + jおよびAlt + kです。

ありがとうございました。

1
aaa

ncursesターミナルデータベースはこれらを定義します(ncurses FAQの shift-またはcontrol-modifiersを使用するにはどうすればよいですか? を参照してください)。

これのほとんどは、xtermに対して行われた作業に基づいています(たとえば、 このページ を参照)。

これらは一意の名前です(事前定義された端末名の辞書にないため、zshは無視します— Src/Modules/terminfo.c を参照)。たとえば、データを変数に取り込むには、tputの出力にシェルを割り当てる必要があります。

Altjkxtermなどの通常のキーに適用される場合、通常は修飾子とは見なされません。

モード( modifyOtherKeys )があり、さまざまな組み合わせのエスケープシーケンスを送信するように指示できます( プログラムでcontrol-Iとタブを区別する方法を参照) ?xterm FAQ)。

この場合、zshはまったく役に立ちません。同様に、端末は結果のテーブルを提供しません(特殊キーを処理します)。カスタマイズされたアプリケーションが必要になります。

メタ機能を念頭に置いているかもしれません。これにはterminfo機能があります(smm有効にする、rmm無効にする)。ただし、ほとんどの端末(xtermを除く)は、これを documented 動作とは異なる方法で実装します。 terminfo(5)

端末にシフトキーとして機能する「メタキー」があり、送信される文字の8番目のビットを設定する場合、この事実はkmで示すことができます。それ以外の場合、ソフトウェアは8番目のビットがパリティであると見なし、通常はクリアされます。この「メタモード」をオンまたはオフにする文字列が存在する場合、それらはsmmおよびrmmとして指定できます。

これは、bashドキュメントにある後方定義が原因の1つです(詳細については、 私の回答 を参照してください)。ただし、いずれの場合も、terminfoは、どの文字の前に付けることができるかをスクリプトに伝える情報を保持しません。 Escape

3
Thomas Dickey