OS Xのターミナルのhtopで矢印キーが機能しない

OS Xのターミナルのhtopで矢印キーが機能しない

いつ起こったのか、何をしたのか(もし何かしたとしても)はわかりませんが、htop で矢印キーを使ってスクロールできなくなりました。以前はスクロールできていたのですが。

プロセス リストを上下にスクロールするには、上下に押す必要がありますが、機能しません。一部のキーは、「戻る」などの機能に相当する傾向があります。設定画面にいる場合、左、上、下のすべてでメイン画面に戻ります。

影響を受けるプログラムは htop のみのようです。

  • TERMはxterm-colorです
  • less は影響を受けません (上下にスクロールできます)
  • htopの由来自家製、これはhtop-osx2009年半ばから変更されていないgithubのリポジトリ
  • TERMINFO が空です

私のcat -v出力

% cat -v
^[[A^[[B^[[C^[[D
^[[A^[[B^[[C^[[D
%
  • lessとhtopはどちらもシステム(つまり同じ)ncursesを使用します。
  • ルートユーザーでも同じ問題

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

私も使ってみましたアイターム同じ結果が得られるので、Terminal.appに限ったことではありません

エピソード6: ジェダイの帰還

libncurses にリンクしたかったのですが、homebrew ncurses はワイド文字モードでコンパイルされるため、取得するライブラリはすべて libncursesw です。brew でワイド文字でコンパイルするためのフラグを削除し、homebrew ncurses をインストールし、ncurses から htop をインストールしたところ、動作するようになりました。

答え1

追記: どうやら 10.6.3 の ncurses は壊れているようです

SOの回答リンク先ブログ記事この問題に関するその他の調査について説明しています。報告されている回避策の 1 つは、10.6.2 から ncurses ライブラリをコピーすることですが、これには意図しない副作用がある可能性があります。


ESCは通常、端末(または端末エミュレーションプログラム)によって送信される「制御シーケンス」の最初の文字です。ターミナル特殊キー(矢印キー、、、など)の場合は )を使用しF1ます。HomePage Up

ESCまた、「戻る」キーとしても機能しますhトップ(通常は、低速接続でも ESC で始まる完全な制御シーケンスを送信するのに十分な時間を確保するために、遅延が経過した後でのみ実行されます)。

以下の質問への回答を質問に含めて更新してください。

TERMとは何ですか?

TERM環境変数の値がおかしいのではecho $TERMhトップ説明したとおりに動作しますか?TERMおそらくxterm-color、 またはそれに類似したものになるはずです。

どこで手に入れたの?hトップ? MacPorts? Fink? その他?

システム提供の ncurses でコンパイルされたアプリは、 のエントリを使用します/usr/share/terminfo/。MacPorts は通常 を/opt/local/プレフィックスとして使用するため、MacPorts の ncurses を使用するアプリケーションは のエントリを使用します/opt/local/share/terminfo/。Fink は通常 を/sw/プレフィックスとして使用するため、Fink の ncurses を使用するアプリケーションは のエントリを使用します/sw/share/terminfo/

環境変数に値がありますかTERMINFO? 値がある場合、ncurses (ソースが何であれ) はそこに指定されたディレクトリを検索します。

TERM で指定された端末の terminfo 定義が部分的に破損している可能性があります (「部分的に破損している」というのは、出力制御シーケンスが正常でなければ、明らかな表示異常が発生するためです)。

影響を受けないプログラムの例にはどのようなものがありますか?

矢印キーを問題なく処理できるncursesベースのプログラムがある場合(おそらくncursesの別のインストールを使用している場合)、他のterminfoエントリを使用してみてください。hトップ逆も同様です (TERMINFO他の ncurses インストールからのエントリの場所を設定することによって)。

端末は実際にどのようなコードを送信しますか?

cat -v矢印キーを使用するとどのコードが送信されるかを調べるには、を使用します。を起動した後、、、、、、-を押すUpと、Down次の画面が表示されますRightLeftEnterControlDcat -v

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

最初のコードセットはttyデバイスによって生成されるエコーです。2番目のセットは存在するコードによっては、最初に送信されたものと異なる場合があります。

これらのコードは、ターミナルただし、コードを変更する特別なモードがあるため、通常は必要ありません (Up は を送信したりESC [ A、 を送信したりすることがありますESC O A)。

結局のところ問題はhトップ矢印キーのコードとして送信されているコードを認識しないため、実際に送信されているコードを知ることは役に立つかもしれません。


補遺:hトップHomebrew から;少ない大丈夫です

これに対してncursesはhトップリンクされていますか?

どうやら、hトップ'式'だった2009年後半にncursesのHomebrewバージョンに依存しないように変更されましたおそらくこれは、hトップこの新しい方式で構築されたシステムはncursesを使用します。それで、どのncursesがhトップバイナリを使用していますか?

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

もしあなたのhトップ2009-12-18より古いか、Homebrew ncurses(おそらく/usr/local/lib/libncurses.5.dylib)にリンクされている場合は、再構築を検討してください。hトップ式(brew remove htop; brew install htop?)。または、既存のhトップバイナリが Homebrew バージョンの ncurses を使用している場合 (または再構築されたバージョンでも Homebrew ncurses がまだ使用されている場合)、ncurses フォーミュラを再構築してみてください。

あなたはそう言っています少ない問題なく動作します。Homebrewのフォーミュラはないようです少ないなので、システム提供の少ない。あなたの少ない比較対象として使用しているhトップ

otool -L "$(which less)"

補遺:hトップそして少ないシステムncursesを使用する

問題がユーザーごとの設定によって発生している場合は、真新しいユーザーを作成し、そのユーザーとしてログインして試してください。新しいユーザーでも問題が解決しない場合は、システム全体の問題であることがわかります (または、すべての新しいユーザーに提供される基本的な初期構成に問題があります)。テストが終了したら、ログイン チューザーなどが乱雑にならないように、ユーザーを削除してください。

ターミナルその他のVT100スタイルの端末や端末エミュレータには、「アプリケーションカーソルキー」モードがあり、カーソルキーはアプリケーションに異なる制御シーケンスを送信します。「アプリケーション」モードでは、端末は(それぞれ上、下、右、左、両方)^[OA^[OB^[OC^[ODの代わりに送信します^[[A^[[B^[[C^[[D。端末が送信する非「アプリケーション」モードシーケンスは、端末が期待するコードと同じです。受け取るカーソル制御コードとして。

あなたのターミナル正しいアプリケーションカーソルキーコードを送信していません。これはありそうにありません。少ない動作します(「アプリケーション」モードも使用します)。おそらく、矢印キーで移動できるという意味だと思います。少ない筋肉の記憶のおかげで、私はほとんどいつも6 六スタイルキー(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 ベースのプログラムが期待する内容になるはずです。

実際のコードが予想されるコードと異なる場合は、ターミナル誤ったコードが設定されている場所を見つけます。

これが問題を示していない場合(ターミナル期待されるコードと一致する場合、setuidでないコピーを実行します。hトップktrace(またはDTraceを少し使って)その場のI/Oを確認してください。I/Oの性質から、問題の原因がわかるかもしれません。ダンプ共有ライブラリとサポートデータファイルの読み込みの詳細を報告するため、非常に大きくなりますが、それらを取り除いたとしても、約2000行と100kBの出力が得られます。ダンプ。おそらくここに投稿するには多すぎるでしょう。

答え2

これは、2010 年 6 月 15 日にリリースされた 10.6.4 で修正されたようです。10.6.3 を実行していた iMac を更新したところ、アプリで curses キー (矢印キーを含む) が正しく応答するようになりました。

答え3

これをデバッグする手助けをしてくれてありがとう。私も同じ問題を抱えていて、Daniel のように homebrew でインストールしたデフォルトの OSX 10.6 でライブラリ リストを取得しました。これがスクリーン ダンプです。私には同じバージョンのように見えます。

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)

答え4

私は Page UP キーと Page Down キーのない小さな Apple Bluetooth キーボードを持っています。そのため、これらの機能を htop で動作させるには、次のキーストロークを使用します。

Page Up: Shift キー→ファンクションキー→矢印キー(上)
Page Down: Shift キー→ファンクションキー→矢印キー(下)

同じ問題を抱えている他のアプリでもこれが機能することを確認しました。

関連情報