
Не уверен, когда это произошло, или что я сделал (если вообще сделал), но мои клавиши со стрелками больше не работают в htop для прокрутки. Хотя раньше работали.
Вы должны иметь возможность нажимать вверх и вниз, чтобы прокручивать вверх и вниз список процессов, но они не работают. Некоторые клавиши, как правило, эквивалентны «вернуться» или чему-то подобному. Если я нахожусь на экране настроек, то влево, вверх и вниз возвращают на главный экран.
Похоже, htop — единственная затронутая программа.
- TERM — это xterm-color
- less не влияет (можно прокручивать вверх и вниз)
- htop пришел издомашнее пиво, который используетhtop-osxрепозиторий на github, который не менялся с середины 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, но homebrew ncurses компилируется в режиме wide char, поэтому все библиотеки, которые вы получаете, — это libncursesw. Я удалил флаги для компиляции с wide char в brew, установил homebrew ncurses и установил htop из ncurses, и теперь это работает.
решение1
Дополнение: Судя по всему, ncurses в 10.6.3 сломан
Ответ на SOссылки назапись в блогекоторый описывает некоторые другие исследования проблемы. Один из известных обходных путей — скопировать библиотеку ncurses из 10.6.2, но это может иметь непреднамеренные побочные эффекты.
ESC обычно является первым символом «управляющей последовательности», отправляемой терминалом (или программой эмуляции терминала, напримерТерминал) для специальных клавиш (например, клавиш со стрелками, F1, Home, Page Upи т. д.).
ESCтакже служит клавишей «возврата» вhtop(обычно только после некоторой задержки, чтобы у медленных соединений было достаточно времени для отправки полной управляющей последовательности, которая начинается с ESC).
Пожалуйста, обновите свой вопрос, ответив на следующие вопросы:
Что такое ТЕРМ?
Может быть, ваша переменная окружения TERM имеет странное значение? Что сообщается echo $TERM
в окне, гдеhtopведет себя так, как вы описали? TERM
вероятно, должно быть xterm-color
, или что-то похожее.
Где ты досталhtop? MacPorts? Fink? другие?
Приложения, скомпилированные с помощью системных ncurses, будут использовать записи из /usr/share/terminfo/
. MacPorts обычно использует /opt/local/
в качестве своего префикса, поэтому приложения, использующие ncurses из MacPorts, будут использовать записи из /opt/local/share/terminfo/
. Fink обычно использует /sw/
в качестве своего префикса, поэтому приложения, использующие ncurses из Fink, будут использовать записи из /sw/share/terminfo/
.
Имеет ли TERMINFO
переменная окружения значение? Если да, ncurses (независимо от источника) будет искать в указанном в ней каталоге.
Возможно, у вас частично повреждено определение terminfo для терминала, указанного в TERM («частично повреждено», поскольку последовательности управления выводом должны быть в порядке, иначе вы увидите очевидные аномалии отображения).
Приведите примеры программ, на которые это не повлияло?
Если у вас есть программы на основе ncurses, которые нормально обрабатывают клавиши со стрелками (возможно, с использованием другой установки ncurses), вы можете попробовать использовать другие записи terminfo сhtopи наоборот (путем установки TERMINFO
расположения записей из другой установки ncurses).
Какие коды на самом деле отправляет ваш терминал?
Используйте cat -v
для проверки того, какие коды отправляются при использовании клавиш со стрелками. Ниже приведено то, что я вижу, когда нажимаю Up, Down, Right, Left, Enter, Control- Dпосле запуска cat -v
:
% cat -v
^[[A^[[B^[[D^[[C
^[[A^[[B^[[D^[[C
%
Первый набор кодов — это эхо, производимое устройством tty. Второй набор производитсякоти может отличаться от отправленного первым, в зависимости от точных присутствующих кодов.
Этот код можно настроить вТерминал, но обычно это не нужно, так как существуют специальные режимы, которые изменяют коды (иногда Up отправляет ESC [ A
, иногда он отправляет ESC O A
.
В конечном итоге проблема в том, чтоhtopне распознает отправляемые коды как коды для клавиш со стрелками, поэтому может быть полезно знать, отправляются ли коды на самом деле.
Приложение:htopот Homebrew;меньшевсе в порядке
Против которого ncurses естьhtopсвязаны?
Кажется, чтоhtop«формула»былизменено в конце 2009 года, чтобы не зависеть от версии ncurses Homebrew. Предположительно это означает, что версииhtopкоторые были построены из этой новой формулы будут использовать систему ncurses. Итак, какой ncurses вашhtopдвоичный код с использованием?
ls -l "$(which htop)"
otool -L "$(which htop)"
Если вашhtopстарше 2009-12-18 или он связан с вашими Homebrew ncurses (вероятно /usr/local/lib/libncurses.5.dylib
), то вы можете рассмотреть возможность пересборкиhtopформула ( brew remove htop; brew install htop
?). В качестве альтернативы, если ваш существующийhtopдвоичный файл использует версию ncurses Homebrew (или пересобранная версия также по-прежнему использует версию ncurses Homebrew), то вы можете попробовать пересобрать формулу ncurses.
Вы упоминаете, чтоменьшеработает нормально. Кажется, что нет формулы Homebrew дляменьше, поэтому вы, вероятно, используете поставляемый системойменьше. Стоит отметить, какие проклятия вашименьшеиспользует для сравненияhtop.
otool -L "$(which less)"
Приложение:htopименьшеиспользовать системные ncurses
Если проблема вызвана какой-либо частью конфигурации для каждого пользователя, она должна исчезнуть, если вы создадитесовершенно новыйuser и попробуйте войти под ним. Если проблема сохраняется под новым пользователем, вы знаете, что это общесистемная проблема (или проблема в базовой, начальной конфигурации, которая дается всем новым пользователям!). После завершения тестирования просто удалите пользователя, чтобы не загромождать окно выбора входа и т. д.
Терминали другие терминалы и эмуляторы терминалов в стиле VT100 имеют режим «Application Cursor Key», в котором клавиши курсора отправляют различные последовательности управления приложению. В режиме «application» терминал отправляет ^[OA^[OB^[OC^[OD
вместо ^[[A^[[B^[[C^[[D
(для Up, Down, Right, Left, и того и другого соответственно). Последовательности режима non-application, которые отправляет терминал, идентичны кодам, которые терминал ожидает получитьполучатькак коды управления курсором.
Вполне возможно, что вашТерминалне отправляет правильные коды клавиш курсора приложения. Это кажется маловероятным, поскольку вы говорите, чтоменьшеработает (он также использует режим «приложения»). Вероятно, вы имеете в виду, что клавиши со стрелками работают для навигации вменьше. Благодаря «мышечной памяти» я почти всегда используюви-клавиши в стиле ( 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 копиюhtopподктрассировка(или, может быть, немного DTrace?) для просмотра ввода-вывода на месте. Характер ввода-вывода может дать кому-то подсказку о причине проблемы. Полный вывод откдампбудет очень большим из-за необходимости сообщать подробности загрузки общих библиотек и вспомогательных файлов данных, но даже если убрать все это, я все равно получу около 2000 строк и 100 КБ вывода откдамп. Это, наверное, слишком много, чтобы здесь размещать.
решение2
Кажется, это было исправлено в версии 10.6.4, выпущенной 15 июня 2010 года. Я только что обновил свой iMac, на котором была установлена версия 10.6.3, и клавиши curses (включая клавиши со стрелками) теперь работают правильно в моих приложениях.
решение3
Спасибо за помощь в попытке отладки. У меня та же проблема, и я получил список библиотек на установке OSX 10.6 по умолчанию, также сделанный с помощью homebrew, как 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 bluetooth, на которой нет клавиш Page UP и Page Down. Поэтому, чтобы эти функции работали в htop, я использую эти нажатия клавиш:
Page Up: клавиша Shift→функциональная клавиша→клавиша со стрелкой вверх
Page Down: клавиша Shift→функциональная клавиша→клавиша со стрелкой вниз
Я видел, как это работает в других приложениях, в которых также возникает та же проблема.