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 $TERM
informa en una ventana donde htop se comporta como usted ha descrito? TERM
probablemente 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 TERMINFO
variable 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 TERMINFO
la ubicación de las entradas de la otra instalación de ncurses) )
¿Qué códigos envía realmente su terminal?
Use cat -v
para 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^[OD
lugar 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í.