6

Не уверен, когда это произошло, или что я сделал (если что-нибудь), но мои клавиши со стрелками больше не работают в htop для прокрутки. Они привыкли, хотя.

Вы должны иметь возможность нажимать вверх и вниз для прокрутки вверх и вниз по списку процессов, но они не работают. Некоторые ключи имеют тенденцию быть эквивалентом «вернуться» или что-то в этом роде. Если я нахожусь на экране настроек, влево, вверх и вниз все возвращаются на главный экран.

htop, кажется, единственная затронутая программа.

  • СРОК ХТЕРМ
  • меньше не влияет (можно прокручивать вверх и вниз)
  • htop пришел из homebrew, который использует репозиторий htop-osx на github, который не изменился с середины 2009 года
  • ТЕРМИНФО пуст

Мой кот -в вывод

% 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 и установил htop из ncurses, и теперь это работает.

6 ответов6

11

Приложение: Видимо 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. Это, вероятно, слишком много, чтобы оставлять здесь сообщения.

2

Похоже, что это было исправлено в 10.6.4, который был выпущен 15 июня 2010 года. Я только что обновил свой iMac, который работал с 10.6.3, и клавиши прокрутки (включая клавиши со стрелками) правильно реагируют в моих приложениях.

0

Если вы не хотите проходить реальные шаги, чтобы действительно исправить это, и просто хотите, чтобы что-то работало быстро, попробуйте удерживать нажатой клавишу выбора, а затем использовать клавиши со стрелками.

0

Спасибо за помощь в попытке отладить это. У меня та же проблема, и список библиотек при установке 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)
0

Для справки, копирование /usr/lib/libncurses.5.4.dylib с машины 10.6.5 на машину 10.6.3 решило проблему для меня.

(Это было сделано как быстрое решение, чтобы заставить работать конкретную программу ncurses, а именно TestGisk CGSecurity. Конечно, обновление до 10.6.5 может быть хорошей идеей.)

0

У меня есть небольшая клавиатура Apple Bluetooth, в которой нет клавиш Page UP и Page Down. Таким образом, чтобы заставить эти функции работать в htop, я использую эти нажатия клавиш:

Страница вверх: клавиша Shift → функциональная клавиша → стрелка вверх
Страница вниз: клавиша Shift → функциональная клавиша → стрелка вниз

Я видел эту работу в других приложениях, которые также имеют такую же проблему.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .