Приложение: Видимо ncurses в 10.6.3 не работает
Ответ на SO ссылается на запись в блоге, которая описывает некоторые другие исследования проблемы. Один из найденных решений - скопировать библиотеку ncurses из 10.6.2, но это может привести к непреднамеренным побочным эффектам.
ESC обычно является первым символом «последовательности управления», отправляемой терминалом (или программой эмуляции терминала, такой как Terminal) для специальных клавиш (таких как клавиши со стрелками, 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, которые обрабатывают клавиши со стрелками OK (возможно, с использованием другой установки ncurses), вы можете попробовать использовать другие записи terminfo с htop и наоборот (установив TERMINFO
на расположение записей из других ncurses). монтаж).
Какие коды на самом деле отправляет ваш терминал?
Используйте cat -v
чтобы проверить, какие коды отправляются при использовании клавиш со стрелками. Вот что я вижу, когда нажимаю Вверх, Вниз, Вправо, Влево, 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. Предположительно это означает, что версии htop , созданные на основе этой новой формулы, будут использовать системные ncurses. Итак, какие ncurses использует ваш двоичный файл htop ?
ls -l "$(which htop)"
otool -L "$(which htop)"
Если ваш htop старше 2009-12-18 или он связан с вашими доморощенными ncurses (вероятно, /usr/local/lib/libncurses.5.dylib
), то вы можете подумать о перестройке формулы htop (brew remove htop; brew install htop
?) В качестве альтернативы, если в существующем бинарном файле htop используется версия ncurses для Homebrew (или в восстановленной версии также используются ncurses для Homebrew), вы можете попытаться перестроить формулу ncurses.
Вы упоминаете, что меньше работает хорошо. Кажется, что не существует формулы Homebrew за меньшие деньги, поэтому вы, вероятно, используете поставляемую системой меньшую сумму. Стоит отметить, какие ncurses использует меньше для сравнения с htop.
otool -L "$(which less)"
Приложение: htop и менее используйте системные ncurses
Если проблема вызвана какой-то настройкой для каждого пользователя, она должна исчезнуть, если вы создадите нового пользователя и попробуете его во время входа в систему как они. Если проблема сохраняется у нового пользователя, вы знаете, что это проблема всей системы (или проблема в базовой, начальной конфигурации, которая предоставляется всем новым пользователям!). Как только вы закончите тестирование, просто удалите пользователя, чтобы не загромождать выбор входа в систему и т.д.
Терминал и другие терминалы и эмуляторы терминала в стиле VT100 имеют режим «Application Cursor Key», при котором клавиши курсора отправляют различные последовательности управления приложению.
В режиме «приложения» терминал отправляет ^[OA^[OB^[OC^[OD
вместо ^[[A^[[B^[[C^[[D
(для Вверх, Вниз, Вправо, Влево, оба соответственно).
Последовательности режима, не относящиеся к «приложению», которые отправляет терминал, идентичны кодам, которые терминал ожидает получить в качестве кодов управления курсором.
Возможно, ваш терминал не отправляет правильные коды клавиш курсора приложения.
Это кажется маловероятным, так как вы говорите, что меньше работает (он также использует режим «приложения»).
Предположительно, вы имеете в виду, что клавиши со стрелками работают меньше. Из-за «мышечной памяти» я почти всегда использую клавиши стиля vi (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
)"
Вывод, помеченный «Expected:», основан на записях системного terminfo для вашего TERM
, поэтому он должен быть тем, что ожидают увидеть программы на основе ncurses.
Если фактические коды отличаются от ожидаемых кодов, то вам следует изучить конфигурацию Терминала, чтобы определить, где были настроены неправильные коды.
Если это не указывает на какую-либо проблему (коды из терминала соответствуют ожидаемым кодам), я бы запустил копию htop без setuid в ktrace (или, может быть, немного DTrace?) чтобы увидеть ввод / вывод на месте. Характер ввода / вывода может дать кому-то подсказку в качестве причины проблемы. Полный вывод из kdump будет очень большим из-за сообщения о деталях загрузки общих библиотек и поддержки файлов данных, но даже после того, как этот материал был удален, я все равно получаю почти 2000 строк и 100 КБ вывода из kdump. Это, вероятно, слишком много, чтобы оставлять здесь сообщения.