Keyboard-Shortcuts

為什麼 Esc-[ 在 less 中不向左滾動?

  • November 28, 2019

根據手冊頁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 鍵的一個怪癖?

這是因為ESC [也恰好是某些終端上的幾個功能鍵發送的字元序列的開頭,例如HomeorEndPageUp… 這些也綁定到less.

因此,當less收到 a時ESC [,它會等待更多(不會像其他應用程序那樣超時)。

在我的終端ESC[6~上是PageDown. 如果我按Alt+[,我ESC [會像你一樣看到。但是然後我可以進入6並且~確實向下滾動。

如果您執行TERM=vt100 less而不是less,則vt100terminfo 頁面沒有任何條目Homeor End… 您會看到ESC [有效。

但是,如果您添加\e[ left-scroll到您的~/.lesskey(並執行lesskey將其編譯為~/.less),您會注意到ESC [作品向左滾動,但所有Home, PageUP… 停止工作,它們都向左滾動並且它們發送的額外字元會引起一些嗶嗶聲。

查看程式碼,這完全是關於命令表的處理順序。~/.less命令表最後添加,但插入到頭部,因此它的條目在內置條目之前處理。

ESC [輸入時,如果\e[ left-scroll首先找到 for 的條目,則對其進行處理,如果首先找到 for \kD forw-screen(在許多終端上轉換為\e[6~ forw-screen),則它只是一個前綴match,並less等待更多 input

所以,這是一個錯誤。解決方法是添加超時。然而,增加一個短暫的超時將意味著放棄多鍵命令;長時間超時以給使用者足夠的時間輸入多鍵命令可能會導致ESC [反應遲鈍。

現在,具有PageUp等的終端通常也具有LeftRight鍵,它們也綁定到left-scroll,,right-scroll因此您可能希望使用它來代替滾動。

引用自:https://unix.stackexchange.com/questions/554478