太字のフォントレンダリングを制御するターミナルエミュレータの設定

太字のフォントレンダリングを制御するターミナルエミュレータの設定

太字のフォント(ANSI:)の効果は、CSI 1 mターミナルエミュレータによって異なります。たとえば、他の端末エミュレータで次のスクリプトを実行します。

#!/bin/sh
echo "TERM = $TERM"
for mode in 0 2 1 '1;2'; do
    printf '\033[%s;38;5;%dm\033[48;5;%dm%s\033[0m\n' "$mode" 0 15 "testing ($mode)"
done

次の出力を提供します

ここに画像の説明を入力してください。

テストされた端末エミュレータでは、太字のxtermテキストのみが正しくレンダリングされました(モード= 1)。他の端末エミュレータは、太字のフォントに対してより明るい色を選択するようです(しばしば太字のフォントと組み合わせることもできます)。奇妙なことstに、引数が与えられると、対応する1;2正しい色の太字のテキストが生成されますbold;faint

これらの端末エミュレータには他の太い制御シーケンスが必要かもしれないと思いましたが、確認しましたが、一貫性があることがわかりましたterminfo

$ for term in xterm-256color st-256color rxvt-unicode-256color tmux-256color; do printf "%-24s" "$term"; TERM=$term tput bold | cat -v; echo; done
xterm-256color          ^[[1m
st-256color             ^[[1m
rxvt-unicode-256color   ^[[1m
tmux-256color           ^[[1m

これは、どのターミナルエミュレータパラメータが太字フォントの効果を制御するかについて質問をします。より明るい色への切り替えを防ぐ方法は?カスタマイジングで解決できますかXresourcesterminfo(しかし、対応するパラメータはありますかvim?同様の動作を示しますが、それを実行している端末エミュレータの動作と必ずしも一致しません。)

答え1

CSI 1 mご存知のように、太字のフォントを表示するエスケープシーケンスは1つだけです。

このためダメ本物vimterminfo 定義のような構成を経ずにアプリケーション(例)側で動作を変更する方法です。 (この声明は後で修正いたします。)

所望の動作を達成する方法は、それに応じて端末エミュレータを構成することである。xterm +pcまたは、urxvt +isマニュアルに示すように適切なXresource設定を探しています。stそのようなオプションがあるかどうかはわかりません。

tmux私はグラフィックエミュレータの実際の動作を制御しないそのようなオプションが本当にないと思います。理論的には、後で言及するトリックを試すこともできますが、実際にはそうではありません。


いくつかの歴史的背景を説明すると、次のようになります。

基準によるとCSI 1 m「大胆で強盗を高める」という意味なので、厳密に言えば両方の行為ともに正しい行動だ。歴史的に、グラフィックターミナルエミュレータは両方の機能をサポートしてきました。

これは伝統的な8/16パレットには少し意味があります。これは、広く使用されている256色の拡張パレット、または今日のほとんどのグラフィック端末エミュレータでサポートされているRGBの場合には当てはまりません。本当に悪いことは、上位8つのパレットの色(実際にはユーザーが好きな8つの色)を太字で安定して生成するエスケープシーケンスがないことです。

これを見て、最近、いくつかのターミナルエミュレータは、色を明るくするのではなく、フォントを太くすることに切り替えました(欲しいもの)。あなたが言及した端末のうち、デフォルト設定がこのように変更された端末はないと思います。しかし、これについて私が知っている情報は簡単です。


そこに言及しました。可能アプリケーションの動作を変更する方法です。

最初の8つのパレットの色の1つを要求する2つのエスケープシーケンスがあります。既存の色(CSI 30..37 m)と対応するインデックスを持つ256色の色(CSI 38;5;0..7 m)。太字/明るい属性と組み合わせて使用​​すると、一部の端末エミュレータの一部のバージョンが2つありますCSI 1 m。たとえば、私が正確に覚えている場合、いくつかのバージョンはxterm古い色のエスケープを使用している場合にのみ明るい色に変わりますが、256色のエスケープを使用している場合は変更されません。私が正しく覚えている場合、xtermは後でこの動​​作を変更しました。

とにかく、これらのターミナルエミュレータを使用している場合、回避策は古いsetafコードの代わりに最初の8色の256色シーケンスをエクスポートするようにterminfoを変更することです。

これはデフォルトの前景色の太字/明るさの動作を変更せず、CSI 1 mこのterminfoハッキングを使用する代わりにターミナルエミュレータを設定することをお勧めします。


もっと面白くて毛皮の細部に興味がある場合は、次のリンクとそこにリンクされている他のページに興味があるかもしれません。
https://bugzilla.gnome.org/show_bug.cgi?id=762247
https://bugzilla.gnome.org/show_bug.cgi?id=791596

答え2

〜のようにエグモン 指摘、大胆で明るい動作は、またはxtermを実行して抑制できます。知りたい方のためにurxvtxterm +pcurxvt +isst、その大胆で明るいxdrawglyphfontspecs()行動xc

/* Change basic system colors [0-7] to bright system colors [8-15] */
if ((base.mode & ATTR_BOLD_FAINT) == ATTR_BOLD && BETWEEN(base.fg, 0, 7))
    fg = &dc.col[base.fg + 8];

BETWEEN()名前からわかるようにどこですか?

#define BETWEEN(x, a, b)    ((a) <= (x) && (x) <= (b))

交換は、既存の8/16パレットの最初の8色にのみ適用され、これはEgmontの発言と一致します。タイトルセントヘクターATTR_BOLD_FAINTsumのビットごとのATTR_BOLD = 1<<0ORとして定義されますATTR_FAINT = 1<<1。したがって、色の再マッピングは、太い属性が設定されている場合にのみ発生し、暗い属性は設定されていない場合にのみ発生します。意図的であるかどうかにかかわらず、CSI 1 mbold()と淡い()プロパティを渡すエスケープシーケンスは、CSI 2 m質問に示されているようにこの条件を満たさず、太字のフォントを生成します。

原則として、太字属性のエスケープシーケンスを変更して太字で表示されますが、弱くない条件を利用して太字のテキストを取得することができます。聖なるメッセージ標準値(\E[1m)から に、\E[1;2mまたは太い属性を設定するときに弱い属性を設定して( でcase 1修正して)tsetattr()ステンレス鋼到着するterm.c.attr.mode |= (ATTR_BOLD | ATTR_FAINT))。これらの変更を使用すると、望ましい結果が得られますが、質問)、どちらもお勧めできません(いくつかの理由で)。

より直接的で好ましいアプローチは、単に太い照明条件を排除することであり、すでに1つxdrawglyphfontspecs()の条件があることがわかった。修理するそれがまさにそれがすることです。

関連情報