Ubuntu 仮想端末のカーソルスタイルのリセット

Ubuntu 仮想端末のカーソルスタイルのリセット

私はUbuntu 14.04を実行しており、仮想端末の1つ(TTY[1-6]、Ctrl-Alt-F[1-6]でアクセス可能)を使用しています。カーソルの外観を、デフォルトの点滅する下線から点滅するボックスに永続的に変更したいと考えています。一時的に変更することはできますが、特定のアプリケーションを実行すると常にリセットされてしまいます。

当初、TTY セッションのカーソル スタイルは点滅する下線でした。次のコマンドで点滅するボックスに変更できることが分かりました。

printf '\e[?8c'

これにより、ターミナル内のカーソルが変更され、emacs や elinks などのプログラムに反映されます。そこで、上記のコマンドを .bashrc に配置しました。

ただし、一部のアプリケーションではカーソルのスタイルが点滅する下線に戻ってしまうようで、そのアプリケーションを終了した後もこの状態が続きます。上記のコマンドを再発行するか、.bashrc をソースするか、ログアウトして再度ログインすることで、カーソルのスタイルを点滅するボックスにリセットできます。

たとえば、次の 3 つのアプリケーション (tmux、emacs、elinks) がカーソル スタイルにどのように影響するかを考えてみましょう。

  • tmux:カーソルのスタイルはすぐに点滅する下線に設定され、このスタイルは tmux 内で実行されるすべてのアプリケーションで維持され、変更は tmux を終了した後も持続します。上記の printf コマンドは tmux では効果がありません。
  • エマック:カーソルのスタイルは、実行時にアクティブだったスタイルになり、emacs を終了すると、スタイルが点滅する下線に変わります。
  • リンク:カーソル スタイルは、実行時にアクティブだったスタイルであり、elinks を終了してもカーソル スタイルは変更されません。

なお、emacs の設定でカーソル スタイル (emacs 内) をボックスに設定するのですが、tmux 内でカーソル スタイルを設定する設定を検索しましたが、tmux のマニュアル ページのエントリ以外には何も見つかりませんでした。そこには次のように書かれています。

tmux understands some extensions to terminfo(5):

 [...]

 Cs, Csr
         Change the cursor style.  If set, a sequence such as this may be used to change the cursor to an underline:

               $ printf '\033[4 q'

         If Csr is set, it will be used to reset the cursor style instead of Cs.

残念ながら、「Cs を設定する」方法がわかりません。また、前述のように、printf コマンドを発行して tmux 内でカーソル スタイルを設定しようとしましたが、効果はありませんでした。

もう 1 つの興味深い点は、XFCE4 ターミナルなどの X ターミナル エミュレーターを実行しているときにはカーソル スタイルの変更に関する問題が発生しないことです。この問題は TTY でのみ発生するようです。

この問題に遭遇した他の人や、問題の原因となっている可能性のある上記のアプリケーション内の設定に関する情報が見つからないようです。この問題の原因は何ですか? また、点滅するブロック カーソル スタイルを常に維持するには、どのように解決すればよいですか?

答え1

ターミナル機能はすべてのターミナルで使用できるわけではなく、tmux のバージョンによって異なる場合があります。Debian 7 の tmux 1.6 で説明が引用されています。Ubuntu 14.04 は少し古く、tmux 1.8 (同じ説明) があります。

マニュアルページに示されている例は のようになりますDECSCUSR。これはxtermパッチ #2522009年。参照XTerm 制御シーケンス:

CSI Ps SP q
          Set cursor style (DECSCUSR, VT520).
            Ps = 0  -> blinking block.
            Ps = 1  -> blinking block (default).
            Ps = 2  -> steady block.
            Ps = 3  -> blinking underline.
            Ps = 4  -> steady underline.
            Ps = 5  -> blinking bar (xterm).
            Ps = 6  -> steady bar (xterm).

これらを使用するには、ncursesのticを使用して修正されたterminfoエントリを作成します。例:

infocmp -x >foo
vi foo
tic -x foo

次の行を追加します (他の機能と同様に先頭にタブを付けます)。

Cs=\E[%p\sq, Csr=\E[0\sq,

ただし、tmux 2.1 のソースを確認すると、それらの terminfo 機能は読み込まれなくなり、色の設定にCsと を使用するように変更されています (古いバージョンではと を使用していました)。新しいバージョンには、terminfo 拡張機能なしでを認識するためのロジックが組み込まれています。CrCcCrDECSCUSR

VTE ベースの端末 (XFCE 端末など) は (バージョンに応じて) を実装する場合がありますが、Linux コンソールは VT220 のサブセットのみを実装しているのに対し、 は端末 (VT220 のスーパーセット)からのものであるDECSCUSRため、これを実行する可能性は低いです。DECSCUSRVT520

DECSCUSR点滅カーソル機能などの他のカーソル スタイルの機能は、terminfo の および の機能cvvisと重複しているため、emacs などの他のアプリケーションとの違いがわかります。cnormxterm

CSI ? Pm h
          DEC Private Mode Set (DECSET).
            Ps = 1 2  -> Start Blinking Cursor (att610).

ただし、Linux コンソール (仮想コンソールとも呼ばれます) のカーソルの外観を変更したいようです。 DECSCUSRそこには効果がありません。

カーソルを点滅するブロックにするには全てそのとき、使用している端末記述のカーソル外観機能を変更する必要があります。これは、civis(カーソルを非表示にする)、cnorm(カーソルを「通常の」外観にする)、cvvis(カーソルを非常に目立つようにする) です。

  • これら両方を\e[?8c「linux」エントリに作成すると、そのエントリを使用する emacs などのプログラムに点滅ボックス カーソルを使用するように指示します。
  • cnormtmux は、とを参照して、ターミナル エントリも読み取りますcivis
  • 一方、elinks はハードコードされており、端末データベースを無視します。ソースをざっと読んでみたところ、端末をリセットしたりカーソルの外観を変更したりするエスケープ シーケンスは見つかりませんでした。

を使用しているためtmux、 も変更する必要があるかもしれませんxterm(内部で実行されているアプリケーションがそのカーソルスタイルを使用するようにするためtmux)。ただし、まずこれなしでテストしてください。しなければならないは を無視するので、を\e[?8c既存の文字列と組み合わせることができる可能性があります。cnormxterm\e[?8c

関連情報