
Não tenho certeza de quando isso aconteceu ou o que fiz (se alguma coisa), mas minhas teclas de seta não funcionam mais no htop para rolar. Eles costumavam fazer isso.
Você deve conseguir pressionar para cima e para baixo para rolar para cima e para baixo na lista de processos, mas eles não funcionam. Algumas teclas tendem a ser equivalentes a ‘voltar’ ou algo assim. Se eu estiver na tela de configurações, esquerda, cima e baixo, tudo volta para a tela principal.
htop parece ser o único programa afetado.
- TERM é xterm-color
- less não é afetado (pode rolar para cima e para baixo)
- htop veio decerveja caseira, que utiliza ohtop-osxrepositório no github, que não mudou desde meados de 2009
- TERMINFO está vazio
Minha saída cat -v
% cat -v
^[[A^[[B^[[C^[[D
^[[A^[[B^[[C^[[D
%
- Tanto less quanto htop usam o sistema (e portanto o mesmo) ncurses
- O mesmo problema para o usuário root
Saída do 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
Eu também tentei usarTermoe dá os mesmos resultados, então não é especificamente Terminal.app
Episódio 6: O Retorno dos Jedi
Ele queria vincular-se ao libncurses, mas o homebrew ncurses compila com o modo wide char, então todas as bibliotecas que você obtém são libncursesw. Eu removi os flags para compilar com wide char no brew, instalei o homebrew ncurses e instalei o htop do ncurses, e agora funciona.
Responder1
Adendo: Aparentemente, ncurses em 10.6.3 está quebrado
Uma resposta no SOlinks parauma entrada de blogque descreve algumas outras investigações sobre o problema. Uma solução alternativa relatada é copiar a biblioteca ncurses da versão 10.6.2, mas isso pode ter efeitos colaterais indesejados.
ESC é geralmente o primeiro caractere da “sequência de controle” enviada por um terminal (ou programa de emulação de terminal comoterminal) para teclas especiais (como as teclas de seta, F1, Home, Page Up, etc.).
ESCtambém serve como uma tecla de 'voltar'htop(geralmente somente após um atraso, para que conexões lentas tenham tempo suficiente para enviar uma sequência de controle completa que começa com ESC).
Atualize sua pergunta com as respostas às seguintes perguntas:
O que é TERMO?
Talvez sua variável de ambiente TERM tenha um valor estranho? O que echo $TERM
informa em uma janela ondehtopse comporta como você descreveu? TERM
provavelmente deveria ser xterm-color
, ou algo semelhante.
Onde você conseguiuhtop? MacPorts? Fink? outro?
Os aplicativos compilados com ncurses fornecidos pelo sistema usarão entradas do /usr/share/terminfo/
. MacPorts geralmente usa /opt/local/
como prefixo, portanto, aplicativos que usam ncurses de MacPorts usarão entradas de /opt/local/share/terminfo/
. O Fink geralmente usa /sw/
como prefixo, então os aplicativos que usam ncurses do Fink usarão entradas de /sw/share/terminfo/
.
A TERMINFO
variável de ambiente tem um valor? Nesse caso, ncurses (qualquer que seja a fonte) procurará no diretório especificado nele.
Pode ser que você tenha uma definição terminfo parcialmente corrompida para o terminal especificado em TERM ('parcialmente corrompida' porque as sequências de controle de saída devem estar OK ou você veria anomalias óbvias na exibição).
Quais são alguns exemplos de programas que não são afetados?
Se você tiver programas baseados em ncurses que lidam com as teclas de seta OK (talvez usando uma instalação diferente do ncurses), você pode tentar usar as outras entradas terminfo comhtope vice-versa (definindo TERMINFO
o local das entradas da outra instalação do ncurses).
Quais códigos seu terminal realmente envia?
Use cat -v
para examinar quais códigos são enviados quando você usa as teclas de seta. O seguinte é o que vejo quando pressiono Up, Down, Right, Left, Enter, Control- Dapós iniciar cat -v
:
% cat -v
^[[A^[[B^[[D^[[C
^[[A^[[B^[[D^[[C
%
O primeiro conjunto de códigos é um eco produzido pelo dispositivo tty. O segundo conjunto é produzido porgatoe pode ser diferente do primeiro enviado, dependendo dos códigos exatos presentes.
Esses códigos podem ser configurados emterminal, mas geralmente não é necessário, pois existem modos especiais que alteram os códigos (às vezes Up envia ESC [ A
, às vezes envia ESC O A
.
Em última análise, o problema é quehtopnão está reconhecendo quaisquer códigos que estão sendo enviados como códigos para as teclas de seta, portanto, pode ser útil saber que os códigos estão realmente sendo enviados.
Termo aditivo:htopdo Homebrew;menosestá bem
Contra o qual nmaldições sãohtopvinculado?
Parece que ohtop'Fórmula'eraalterado no final de 2009 para não depender da versão Homebrew do ncurses. Presumivelmente, isso significa que as versões dohtopque foram construídos a partir desta nova fórmula usarão o sistema ncurses. Então, qual maldição é a suahtopbinário usando?
ls -l "$(which htop)"
otool -L "$(which htop)"
Se seuhtopé anterior a 18/12/2009 ou está vinculado ao seu Homebrew ncurses (provavelmente /usr/local/lib/libncurses.5.dylib
), então você pode considerar reconstruir ohtopFórmula ( brew remove htop; brew install htop
?). Alternativamente, se o seu existentehtopbinário está usando uma versão Homebrew de ncurses (ou a versão reconstruída também ainda usa o Homebrew ncurses), então você pode tentar reconstruir a fórmula ncurses.
Você mencionou issomenosfunciona bem. Parece que não existe uma fórmula Homebrew paramenos, então você provavelmente está usando o fornecido pelo sistemamenos. Vale a pena observar quais são as suas maldiçõesmenosestá usando para comparação comhtop.
otool -L "$(which less)"
Termo aditivo:htopemenosusar ncurses do sistema
Se o problema estiver sendo causado por alguma configuração por usuário, ele deverá desaparecer se você criar umnovo em folhausuário e experimente enquanto estiver logado como ele. Se o problema persistir no novo usuário, você sabe que é um problema de todo o sistema (ou o problema está na configuração inicial básica que é fornecida a todos os novos usuários!). Depois de terminar o teste, basta excluir o usuário para evitar sobrecarregar o seletor de login, etc.
terminale outros terminais e emuladores de terminal estilo VT100 possuem um modo “Tecla de Cursor de Aplicativo”, onde as teclas de cursor enviam diferentes sequências de controle para o aplicativo. No modo “aplicativo”, o terminal envia ^[OA^[OB^[OC^[OD
em vez de ^[[A^[[B^[[C^[[D
(Para Cima, Baixo, Direita, Esquerda, ambos respectivamente). As sequências de modo não “aplicativo” que o terminal envia são idênticas aos códigos que o terminal esperaria enviar.recebercomo códigos de controle de cursor.
Pode ser possível que o seuterminalnão está enviando os códigos corretos das teclas do cursor do aplicativo. Isso parece improvável já que você diz issomenosfunciona (também usa o modo “aplicativo”). Presumivelmente, você quer dizer que as teclas de seta funcionam para navegarmenos. Devido à 'memória muscular', quase sempre uso oviteclas de estilo ( kjlh
) para navegarmenos.
O que são códigos de “teclas de cursor de aplicativo”terminalenviando?
Você pode verificar issoterminalestá enviando as sequências esperadas de “tecla do cursor do aplicativo” com algo assim:
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
)"
A saída denominada “Esperado:” é baseada nas entradas terminfo do sistema para o seu TERM
, portanto, deve ser o que os programas baseados em ncurses esperam ver.
Se os códigos reais diferirem dos códigos esperados, você deverá investigar a configuração doterminalpara descobrir onde os códigos incorretos foram configurados.
Se isso não indicar nenhum problema (os códigos determinalcorresponder aos códigos esperados), eu executaria uma cópia não setuid dehtopsobktrace(ou talvez um pouco de DTrace?) para ver a E/S in situ. A natureza da E/S pode dar a alguém uma pista sobre a causa do problema. A saída completa dekdumpserá muito grande devido ao relatório dos detalhes de carregamento de bibliotecas compartilhadas e arquivos de dados de suporte, mas mesmo com esse material removido, ainda recebo quase 2.000 linhas e 100kB de saída dekdump. Provavelmente é demais postar aqui.
Responder2
Isso parece ter sido corrigido na versão 10.6.4, lançada em 15 de junho de 2010. Acabei de atualizar meu iMac que estava executando a versão 10.6.3 e as teclas de maldição (incluindo as teclas de seta) estão respondendo corretamente em meus aplicativos.
Responder3
Obrigado pela ajuda na tentativa de depurar isso. Estou tendo o mesmo problema e obtive a lista de bibliotecas em uma instalação padrão do OSX 10.6 também feita com homebrew como Daniel. Aqui está o despejo de tela, parece as mesmas versões para mim:
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)
Responder4
Eu tenho um pequeno teclado bluetooth da Apple que não possui as teclas Page UP e Page Down. Então, para fazer essas funções funcionarem no htop, eu uso estas teclas:
Página para cima: tecla Shift → tecla de função → tecla de seta para cima
Página para baixo: tecla Shift → tecla de função → tecla de seta para baixo
Já vi isso funcionar em outros aplicativos que também apresentam o mesmo problema.