在 OS X 的终端中,htop 中的箭头键不起作用

在 OS X 的终端中,htop 中的箭头键不起作用

不确定什么时候发生的,也不知道我做了什么(如果有的话),但我的箭头键在 htop 中不再能滚动了。不过以前它们可以。

您应该能够按向上和向下键来上下滚动进程列表,但它们不起作用。有些键往往相当于“返回”之类的。如果我在设置屏幕上,左、上、下都可以返回主屏幕。

htop 似乎是唯一受影响的程序。

  • TERM 是 xterm-color
  • 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

我也尝试过使用终端并且它给出了相同的结果,所以它不是特定的 Terminal.app

第 6 集:绝地归来

它想要链接到 libncurses,但自制 ncurses 使用宽字符模式进行编译,因此您获得的所有库都是 libncursesw。我删除了 brew 中使用宽字符进行编译的标志,安装了自制 ncurses,并从 ncurses 安装了 htop,现在它可以正常工作了。

答案1

附录:显然 10.6.3 中的 ncurses 已损坏

关于SO的回答链接到一篇博客文章描述了对该问题的一些其他调查。一个报告的解决方法是从 10.6.2 复制 ncurses 库,但这可能会产生意想不到的副作用。


ESC 通常是终端(或终端仿真程序,如终端) 为特殊键(例如箭头键、、、、等F1)。HomePage Up

ESC也可以作为“返回”键顶部(通常仅在延迟之后,以便慢速连接有足够的时间发送恰好以 ESC 开头的完整控制序列)。

请使用以下问题的答案来更新您的问题:

TERM 是什么?

也许你的 TERM 环境变量有一个奇怪的值?echo $TERM在窗口中报告什么顶部其行为是否如您所述?TERM应该是xterm-color,或者类似的东西。

你从哪里得到顶部? MacPorts? Fink? 其他?

使用系统提供的 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代码。以下是我在启动后按UpDownRightLeftEnter-时看到的内容:ControlDcat -v

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

第一组代码是 tty 设备产生的回显。第二组代码由并且可能与第一次发送的不同,这取决于目前的具体代码。

这些代码可以配置在终端,但通常没有必要,因为有特殊模式可以改变代码(有时 Up 发送ESC [ A,有时发送ESC O A

最终的问题是顶部无法将发送的任何代码识别为箭头键的代码,因此了解实际发送的代码可能会很有用。


附录:顶部来自 Homebrew;较少的没问题

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 公式。

你提到较少的工作正常。似乎没有自制配方较少的,因此您可能正在使用系统提供的较少的。值得注意的是你的较少的用于比较顶部

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 中得到修复。我刚刚更新了运行 10.6.3 的 iMac,并且 curses 键(包括箭头键)在我的应用程序中响应正常。

答案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 键→功能键→向下箭头键

我在其他应用程序中也看到过这种现象,但它们也存在同样的问题。

相关内容