不确定什么时候发生的,也不知道我做了什么(如果有的话),但我的箭头键在 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
代码。以下是我在启动后按Up、Down、Right、Left、Enter-时看到的内容: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 键→功能键→向下箭头键
我在其他应用程序中也看到过这种现象,但它们也存在同样的问题。