箭頭鍵在 OS X 終端機的 htop 中不起作用

箭頭鍵在 OS X 終端機的 htop 中不起作用

不確定它是什麼時候發生的,或者我做了什麼(如果有的話),但我的箭頭鍵不再在 htop 中滾動。但他們以前也這樣。

您應該能夠按向上和向下鍵來上下滾動進程列表,但它們不起作用。有些按鍵往往相當於“返回”或其他功能。如果我在設定畫面上,向左、向上和向下都會回到主畫面。

htop 似乎是唯一受影響的程式。

  • 術語是 xterm-顏色
  • less 不受影響(可以上下滾動)
  • htop 來自自製的,它使用htop-osxgithub 上的 repo,自 2009 年中期以來未曾更改
  • TERMINFO 為空

我的 cat -v 輸出

% cat -v
^[[A^[[B^[[C^[[D
^[[A^[[B^[[C^[[D
%
  • less 和 htop 都使用系統(因此相同)ncurses
  • root用戶同樣的問題

sh 腳本的輸出

Type <Up> <Down> <Right> <Left> <Control-D> <Control-D>
(no output until after the first <Control-D>, please type "blindly")
    ^[OA^[OB^[OC^[OD
Expected:
    ^[OA^[OB^[OC^[OD

我也嘗試過使用iTerm它給出了相同的結果,所以它不是專門的 Terminal.app

第 6 集:絕地大反攻

它想要連結 libncurses,但自製 ncurses 使用寬字元模式編譯,因此您獲得的所有庫都是 libncursesw。我刪除了在brew中使用寬字元進行編譯的標誌,安裝了自製ncurses,並從ncurses安裝了htop,現在它可以工作了。

答案1

附錄:顯然 10.6.3 中的 ncurses 已損壞

對SO的回答連結到部落格條目描述了對該問題的一些其他調查。一種報告的解決方法是從 10.6.2 複製 ncurses 庫,但這可能會產生意想不到的副作用。


ESC 通常是終端(或終端仿真程序,如終端)用於特殊鍵(如方向鍵、F1HomePage Up等)。

ESC也可用作“返回”鍵頂部(通常僅在延遲之後,以便慢速連接有足夠的時間發送恰好以 ESC 開頭的完整控制序列)。

請更新您的問題並回答以下問題:

什麼是期限?

也許您的 TERM 環境變數有一個奇怪的值?echo $TERM在視窗中報告什麼頂部行為如您所描述的?TERM可能應該是xterm-color,或類似的東西。

你從哪裡得到頂部? Mac埠?芬克?其他?

使用系統提供的 ncurses 編譯的應用程式將使用來自/usr/share/terminfo/. MacPorts 通常使用/opt/local/作為其前綴,因此使用 MacPorts 中的 ncurses 的應用程式將使用/opt/local/share/terminfo/. Fink 通常使用/sw/作為其前綴,因此使用 Fink 中的 ncurses 的應用程式將使用/sw/share/terminfo/.

TERMINFO環境變數有值嗎?如果是這樣,ncurses(無論來源)將在其中指定的目錄中尋找。

可能是您在 TERM 中指定的終端的 terminfo 定義部分損壞(“部分損壞”,因為輸出控制序列必須正常,否則您會看到明顯的顯示異常)。

有哪些不受影響的程式範例?

如果您有基於 ncurses 的程式可以正常處理箭頭鍵(可能使用不同的 ncurses 安裝),您可以嘗試使用其他 terminfo 條目頂部反之亦然(透過設定TERMINFO其他 ncurses 安裝中的項目的位置)。

您的終端實際發送什麼代碼?

用於cat -v檢查使用箭頭鍵時發送的代碼。以下是啟動後按Up, Down, Right, Left, Enter, Control-看到的內容:Dcat -v

% cat -v
^[[A^[[B^[[D^[[C
^[[A^[[B^[[D^[[C
% 

第一組代碼是 tty 設備產生的回顯。第二組是由並且可能與第一次發送的不同,具體取決於存在的確切代碼。

這些代碼可以配置在終端,但通常沒有必要,因為有特殊模式可以更改代碼(有時 Up 發送ESC [ A,有時發送ESC O A.

最終的問題是頂部無法識別正在發送的任何代碼作為箭頭鍵的代碼,因此了解實際正在發送的代碼可能很有用。


附錄:頂部來自自製軟體;較少的還可以

ncurses 是針對哪個頂部連結?

看來頂部'公式'曾是2009 年底進行了更改,不再依賴 Homebrew 版本的 ncurses。想必這意味著版本頂部根據這個新公式建構的程式將使用系統 ncurses。那麼,哪一個 ncurses 是你的頂部二進制使用?

ls -l "$(which htop)"
otool -L "$(which htop)"

如果你的頂部早於 2009-12-18 或它與您的 Homebrew ncurses 連結(可能/usr/local/lib/libncurses.5.dylib),那麼您可能會考慮重建頂部公式 (brew remove htop; brew install htop?)。或者,如果您現有頂部二進位檔案正在使用 Homebrew 版本的 ncurses(或者重建版本也仍然使用 Homebrew ncurses),那麼您可以嘗試重建 ncurses 公式。

你提到那個較少的工作正常。似乎沒有 Homebrew 公式較少的,所以您可能正在使用系統提供的較少的。值得注意的是,這會詛咒你的較少的用於比較頂部

otool -L "$(which less)"

附錄:頂部較少的使用系統ncurses

如果問題是由某些每個使用者配置引起的,那麼如果您建立一個全新用戶並以他們的身份登入時嘗試。如果問題在全新用戶下仍然存在,您就知道這是系統範圍的問題(或者問題出在為所有新用戶提供的基本初始配置中!)。完成測試後,只需刪除使用者即可避免登入選擇器等混亂。

終端其他 VT100 型終端和終端模擬器具有「應用程式遊標鍵」模式,其中遊標鍵向應用程式發送不同的控制序列。在「應用」模式下,終端發送^[OA^[OB^[OC^[OD而非^[[A^[[B^[[C^[[D(分別為上、下、右、左)。終端發送的非“應用”模式序列與終端期望的代碼相同收到作為遊標控制代碼。

您的終端未發送正確的應用程式遊標鍵代碼。既然你這麼說,這似乎不太可能較少的有效(它也使用“應用程式”模式)。想必您的意思是箭頭鍵可以用於導航較少的。由於“肌肉記憶”,我幾乎總是使用- 樣式鍵 ( kjlh) 進行導航較少的

“應用程式遊標鍵”代碼是什麼終端發送?

你可以檢查一下終端正在發送預期的“應用程式遊標鍵”序列,如下所示:

sh -c "$(cat <<\EOF
noecho_appmode() {
  stty -echo
  printf '\033[?1h'
}
modes="$(stty -g)"
restore_echo_and_appmode() {
  stty "$modes"
  printf '\033[?1l'
}
printf '\nType <Up> <Down> <Right> <Left> <Control-D> <Control-D>\n'
printf '(no output until after the first <Control-D>, please type "blindly")\n\t'
noecho_appmode             ; trap 'restore_echo_and_appmode' 0
cat -v
restore_echo_and_appmode   ; trap ''                         0
printf '\nExpected:\n\t'
printf 'kcu%c1\n' u d f b | /usr/bin/tput -S | cat -v
printf '\n\n'
EOF
)"

標記為「預期:」的輸出是基於您的系統 terminfo 條目TERM,因此它應該是基於 ncurses 的程式期望看到的內容。

如果實際代碼與預期代碼不同,那麼您應該調查以下配置終端尋找配置了錯誤代碼的位置。

如果這沒有表明任何問題(代碼來自終端匹配預期的程式碼),我將運行一個非 setuid 副本頂部在下面追蹤(或者可能是一點 DTrace?)來查看原位 I/O。 I/O 的性質可能會為某人提供問題原因的線索。完整輸出來自轉儲文件由於報告了加載共享庫和支援數據文件的詳細信息,它會非常大,但即使去掉這些內容,我仍然得到近 2000 行和 100kB 的輸出轉儲文件。在這裡發布的內容可能太多了。

答案2

這似乎已在 2010 年 6 月 15 日發布的 10.6.4 中修復。

答案3

感謝您在嘗試調試此問題時提供的幫助。我遇到了同樣的問題,並在預設的 OSX 10.6 安裝上獲取了庫列表,這也是使用像 Daniel 這樣的自製軟體完成的。這是螢幕轉儲,對我來說看起來是相同的版本:

marvin:~ sheldon$ otool -L "$(which htop)"
/usr/local/bin/htop:
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)
marvin:~ sheldon$ otool -L "$(which less)"
/usr/bin/less:
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)

答案4

我有小型 Apple 藍牙鍵盤,沒有 Page UP 和 Page Down 鍵。因此,為了讓這些功能在 htop 中運作,我使用以下按鍵:

向上翻頁:Shift 鍵→功能鍵→向上箭頭鍵向下
翻頁:Shift 鍵→功能鍵→向下箭頭鍵

我在其他也有同樣問題的應用程式中看到過這種情況。

相關內容