Las teclas de flecha no funcionan en htop en OS X en Terminal

6

No estoy seguro de cuándo sucedió o qué hice (si es que lo hizo), pero mis teclas de flecha ya no funcionan en htop para desplazarse. Aunque solían hacerlo.

Debería poder presionar hacia arriba y hacia abajo para desplazarse hacia arriba y hacia abajo en la lista de procesos, pero no funcionan. Algunas teclas tienden a ser el equivalente de 'regresar' o algo así. Si estoy en la pantalla de configuración, izquierda, arriba y abajo, todo vuelve a la pantalla principal.

htop parece ser el único programa afectado.

  • TERM es xterm-color
  • menos no se ve afectado (puede desplazarse hacia arriba y hacia abajo)
  • htop vino de homebrew , que usa el repositorio htop-osx en github, que no ha cambiado desde mediados de 2009
  • TERMINFO está vacío

Mi salida cat -v

% cat -v
^[[A^[[B^[[C^[[D
^[[A^[[B^[[C^[[D
%
  • Tanto less como htop usan el sistema (y por lo tanto el mismo) ncurses
  • Mismo problema para el usuario root

Salida del script 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

También intenté usar iTerm y da los mismos resultados, por lo que no es específicamente Terminal.app

Episodio 6: El retorno del Jedi

Quería vincularse contra libncurses, pero homebrew ncurses se compila con el modo char amplio, por lo que todas las bibliotecas que obtienes son libncursesw. Eliminé las banderas para compilar con ancho char en la preparación, instalé ncurses homebrew e instalé htop desde ncurses, y ahora funciona.

Daniel Huckstep
fuente

Respuestas:

11

Anexo: Aparentemente ncurses en 10.6.3 está roto

Una respuesta en SO enlaza con una entrada de blog que describe algunas otras investigaciones sobre el problema. Una solución alternativa es copiar la biblioteca ncurses de 10.6.2, pero esto puede tener efectos secundarios no deseados.


CES es por lo general el primer carácter de la “secuencia de control” enviado por un terminal (o un programa de emulación de terminal como terminal ) para las teclas especiales (como las teclas de flecha, F1, Home, Page Up, etc.).

ESCtambién sirve como una tecla de 'retroceso' en htop (generalmente solo después de un retraso, para que las conexiones lentas tengan tiempo suficiente para enviar una secuencia de control completa que comienza con ESC).

Actualice su pregunta con las respuestas a las siguientes preguntas:

¿Qué es el PLAZO?

¿Quizás su variable de entorno TERM tiene un valor impar? ¿Qué echo $TERMinforma en una ventana donde htop se comporta como usted ha descrito? TERMprobablemente debería ser xterm-color, o algo similar.

¿De dónde sacaste htop ? MacPorts? ¿Soplón? ¿otro?

Las aplicaciones compiladas con los ncurses proporcionados por el sistema utilizarán entradas de /usr/share/terminfo/. MacPorts generalmente usa /opt/local/como prefijo, por lo que las aplicaciones que usan ncurses de MacPorts usarán entradas de /opt/local/share/terminfo/. Fink generalmente usa /sw/como prefijo, por lo que las aplicaciones que usan ncurses de Fink usarán entradas de /sw/share/terminfo/.

¿La TERMINFOvariable de entorno tiene un valor? Si es así, ncurses (cualquiera que sea la fuente) buscará en el directorio especificado allí.

Puede ser que tenga una definición de terminal parcialmente corrompida para el terminal especificado en TERM ('parcialmente corrompida' porque las secuencias de control de salida deben estar bien o verá anomalías obvias en la pantalla).

¿Cuáles son algunos ejemplos de programas que no se ven afectados?

Si tiene programas basados ​​en ncurses que manejan las teclas de flecha OK (tal vez usando una instalación diferente de ncurses), puede intentar usar las otras entradas de terminfo con htop y viceversa (configurando TERMINFOla ubicación de las entradas de la otra instalación de ncurses) )

¿Qué códigos envía realmente su terminal?

Use cat -vpara examinar qué códigos se envían cuando usa las teclas de flecha. Lo siguiente es lo que veo cuando pulso Up, Down, Right, Left, Enter, Control- Ddespués de comenzar cat -v:

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

El primer conjunto de códigos es un eco producido por el dispositivo tty. El segundo conjunto es producido por cat y puede ser diferente del primero enviado, dependiendo de los códigos exactos presentes.

Este código se puede configurar en la Terminal , pero generalmente no es necesario, ya que hay un modo especial que cambia los códigos (a veces envía hacia arriba ESC [ A, a veces envía ESC O A.

En última instancia, el problema es que htop no reconoce los códigos que se envían como códigos para las teclas de flecha, por lo que puede ser útil saber que los códigos se envían realmente.


Anexo: htop de Homebrew; menos está bien

¿Contra qué ncurses está vinculado htop ?

Parece que la "fórmula" de htop se modificó a fines de 2009 para no depender de la versión Homebrew de ncurses . Presumiblemente, esto significa que las versiones de htop que se crearon a partir de esta nueva fórmula utilizarán el sistema ncurses. Entonces, ¿qué ncurses está usando tu binario htop ?

ls -l "$(which htop)"
otool -L "$(which htop)"

Si su htop es anterior a 18/12/2009 o está relacionado con sus errores Homebrew (probablemente /usr/local/lib/libncurses.5.dylib), entonces podría considerar reconstruir la fórmula htop ( brew remove htop; brew install htop?). Alternativamente, si su binario htop existente está utilizando una versión Homebrew de ncurses (o la versión reconstruida también usa Homebrew ncurses), entonces puede intentar reconstruir la fórmula ncurses.

Mencionas que menos funciona bien. Parece que no hay una fórmula Homebrew por menos , por lo que probablemente esté usando menos el suministrado por el sistema . Vale la pena señalar qué maldiciones usa menos para comparar con htop .

otool -L "$(which less)"

Anexo: htop y menos uso ncurses del sistema

Si el problema es causado por un poco de configuración por usuario, debería desaparecer si crea un nuevo usuario y lo intenta mientras está conectado como ellos. Si el problema persiste bajo el nuevo usuario, usted sabe que es un problema de todo el sistema (¡o el problema está en la configuración inicial básica que se le da a todos los nuevos usuarios!). Una vez que haya terminado la prueba, simplemente elimine el usuario para evitar saturar el selector de inicio de sesión, etc.

Los terminales y otros terminales y emuladores de terminales de estilo VT100 tienen un modo de "Clave de cursor de aplicación" donde las teclas de cursor envían diferentes secuencias de control a la aplicación. En el modo "aplicación", el terminal envía en ^[OA^[OB^[OC^[ODlugar de ^[[A^[[B^[[C^[[D(Para arriba, Abajo, Derecha, Izquierda, ambos respectivamente). Las secuencias en modo no "aplicación" que envía el terminal son idénticas a los códigos que el terminal esperaría recibir como códigos de control del cursor.

Es posible que su Terminal no envíe los códigos de tecla de cursor de aplicación correctos. Esto parece poco probable ya que usted dice que menos funciona (también usa el modo "aplicación"). Presumiblemente quiere decir que las teclas de flecha funcionan para navegar en menos . Debido a la 'memoria muscular', casi siempre uso las teclas de estilo vi ( kjlh) para navegar en menos .

¿Qué códigos de "teclas de cursor de aplicación" envía Terminal ?

Puede verificar que el Terminal esté enviando las secuencias esperadas de "tecla de cursor de aplicación" con algo como esto:

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
)"

El resultado etiquetado como "Esperado:" se basa en las entradas de terminfo del sistema para usted TERM, por lo que debería ser lo que los programas basados ​​en ncurses esperan ver.

Si los códigos reales difieren de los códigos esperados, entonces debe investigar la configuración de la Terminal para encontrar dónde se han configurado los códigos incorrectos.

Si esto no indica ningún problema (los códigos de Terminal partido de los códigos esperados), me gustaría correr una copia no setuid de HTOP bajo ktrace (o tal vez un poco de DTrace?) Para ver in situ de E / S. La naturaleza de la E / S puede dar a alguien una pista como la causa del problema. La salida completa de kdump será muy grande debido a los detalles de carga de las bibliotecas compartidas y los archivos de datos de soporte, pero incluso con esas cosas eliminadas, todavía obtengo casi 2000 líneas y 100kB de salida de kdump . Probablemente sea demasiado para publicar aquí.

Chris Johnsen
fuente
Se agregó información sobre la biblioteca ncurses.
Daniel Huckstep
Buscaré compilar ncurses a través de brew y probaré eso.
Daniel Huckstep
Parece que no puedo hacer que use los trucos caseros sin importar lo que haga. Probablemente me estoy perdiendo algo simple que es específico de OSX ...
Daniel Huckstep
Bien, en realidad, ncurses no está en homebrew, es ncursesw ... compilando ncurses por mi cuenta ahora ...
Daniel Huckstep
Oh, veo que la w es para un amplio apoyo de personajes ...
Daniel Huckstep
2

Esto parece haberse solucionado en 10.6.4, que se lanzó el 15 de junio de 2010. Acabo de actualizar mi iMac que ejecutaba 10.6.3 y las teclas de maldición (incluidas las teclas de flecha) responden correctamente en mis aplicaciones.

David Parry-Smith
fuente
0

Gracias por la ayuda en tratar de depurar esto. Tengo el mismo problema y obtuve la lista de bibliotecas en una instalación predeterminada de OSX 10.6 también realizada con homebrew como Daniel. Aquí está el volcado de pantalla, me parece las mismas versiones:

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)

fuente
0

Para el registro, copiar /usr/lib/libncurses.5.4.dylib de una máquina 10.6.5 a la máquina 10.6.3 resolvió el problema para mí.

(Esto se realizó como una solución rápida para que un programa ncurses específico, a saber, TestDisk de CGSecurity, funcione. Por supuesto, actualizar a 10.6.5 podría ser una buena idea independientemente).

Ilya
fuente
0

Tengo el pequeño teclado bluetooth de Apple que no tiene teclas Page UP y Page Down. Entonces, para que estas funciones funcionen en htop, uso estas teclas:

Re Pág: tecla Shift → Tecla de función → Tecla de flecha hacia arriba Re
Pág: tecla Shift → Tecla de función → Tecla de flecha abajo

He visto este trabajo en otras aplicaciones que también tienen este mismo problema.

lexton
fuente
0

Si no está dispuesto a seguir los pasos reales para solucionar esto y solo quiere que algo funcione rápidamente, intente mantener presionada la tecla de opción y luego usar las teclas de flecha.

eliasbagley
fuente