`less` では Esc-[ で左にスクロールしないのはなぜですか?

`less` では Esc-[ で左にスクロールしないのはなぜですか?

によるマニュアルページの場合lesskey、次のキーは左スクロールと右スクロールにバインドされています。

\e[       left-scroll
\e]       right-scroll
\e(       left-scroll
\e)       right-scroll
\kl       left-scroll
\kr       right-scroll

矢印キーとEsc-(/ はEsc -)、右スクロールの場合と同様に正常に機能しますEsc-]が、Esc-[左スクロールの場合は機能しません。代わりに、コマンド ライン プロンプトに次のように表示されます。

ESC[

~/.lesskey回避策として、次の行を関数に追加します。

\e[ left-scroll

しかし、なぜデフォルトでは機能しないのでしょうか?

私は、Debian Stretch および Kubuntu 18.04 の XFCE4、およびさまざまなターミナル エミュレーターでこの動作を確認しました。

$ less --version
less 487 (GNU regular expressions)
Copyright (C) 1984-2016  Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less

バグレポートを提出することも考えましたが、既知のバグと機能リクエストのリスト これは既知の動作であることを示唆しています。

機能強化の要望

[ . 。 。 ]

参照番号: 175

実装バージョン: 322

ESC-[ の代替コマンドを追加します。

これは実際には の制限事項なのでしょうかless、それとも端末が Escape キーを処理する際の癖なのでしょうか?

答え1

これは、ややESC [など、一部の端末のいくつかのファンクション キーによって送信される文字シーケンスの開始でもあるためです。これらも 内の何らかのアクションにバインドされています。HomeEndPageUpless

したがって、lessが を受信するとESC [、さらに待機します (他のアプリケーションのようにタイムアウトすることはありません)。

私の端末にはESC[6~がありますPageDown。 を押すとAlt+[、あなたと同じように表示されますESC [。しかし、 と を入力する6~、下にスクロールします。

TERM=vt100 lessの代わりにを実行するとlessvt100terminfo ページに または のエントリがない場合HomeEnd、 がESC [機能します。

ただし、\e[ left-scrollを に追加し~/.lesskey(lesskeyを実行して にコンパイル~/.less)、ESC [は左にスクロールしますが、 、... はすべてHome機能PageUPしなくなり、すべてが左にスクロールし、送信される余分な文字によってビープ音が鳴ります。

コードを見ると、コマンドテーブルが処理される順序がすべてです。~/.lessコマンドテーブルは最後に追加、 しかし頭に挿入、そのエントリは処理される前に組み込みのもの。

入力時にESC [、 のエントリ\e[ left-scrollが最初に見つかった場合はそれが処理され、 のエントリ\kD forw-screen(多くの端末では と解釈される\e[6~ forw-screen)が最初に見つかった場合は、それはただの接頭辞マッチ、 そしてlessさらに入力を待つ

つまり、これは一種のバグです。修正するには、タイムアウトを追加します。ただし、短いタイムアウトを追加すると、マルチキー コマンドが使用できなくなります。ユーザーがマルチキー コマンドを入力するのに十分な時間を与えるために長いタイムアウトを追加すると、ESC [応答が遅くなりすぎる可能性があります。

さて、 などを持つ端末には、 、にもバインドされているおよびキーPageUpも一般的に備わっているため、スクロールには代わりにそれを使用するとよいでしょう。LeftRightleft-scrollright-scroll

関連情報