GUI端末でタブ幅を設定する

GUI端末でタブ幅を設定する

私は見つけた

setterm -regtabs 4

xtermまたはurxvtでは機能しません。

しかし、これは

xterm_set_tabs () { 
  TERM=linux;
  export $TERM;
  setterm -regtabs 4
}

問題を回避します。

しかし、私はこれが次善策だと思います。なぜなら(1)他に説明できないgfxのバグにぶつかったからです(少なくとも正しいタブの内容を得れば可能性は排除されます)。学校SolarisにSSHでアクセスして実行しましたが、emacs -nw「linux」がわからないというメッセージが出ました!だからもう一度「xterm」に置き換える必要があります。もちろん、常に同じ端末を使用しているので、これは愚かなことです。

また、タブにまったく依存しないのは良い経験則です!

答え1

このsettermユーティリティは、Linuxコンソールで使用するように設計されています。 ~によるとconsole_codes のマニュアルページ:

Linuxコンソールは、VT102およびECMA-48 / ISO 6429 / ANSI X3.64ターミナルコントロールのほとんどのサブセットだけでなく、カラーパレット、文字セットマッピングなどを変更するための特定のプライベートモードシーケンスも実装しています。

~からプログラムがハードコードされています。

/* -regtabs. */
if (ctl->opt_regtabs && vc_only(ctl, "--regtabs")) {
    int i;

    fputs("\033[3g\r", stdout);
    for (i = ctl->opt_rt_len + 1; i <= TABS_MAX; i += ctl->opt_rt_len)
        printf("\033[%dC\033H", ctl->opt_rt_len);
    putchar('\r');
}

xtermが実装しているので、xtermで動作します。VT100コントロール(およびその他)

については大規模サブセット、これは議論の余地があります。プロジェクトをすばやく計算すると、console_codes79の制御シーケンスが表示されます。これは、xterm FAQで文書化されたxtermのようなものよりはるかに低いです。数制御を使用したバージョンの比較。 79はそれ自体ではそれほど大きくありません。 VT102自体(xtermに似ています)には104があります。 ISO-6429(別名ECMA-48)は20のパターンと162のシーケンスを記録しました。合計が182であれ162であれ、50%はそうではありません。大規模サブセット

Linuxコンソールユーティリティを使用することに加えて、より移植可能なオプションがあります:tabsユーティリティ(POSIXそしてソラリス)。それncursesユーティリティ(おそらくLinuxシステムにインストールされているでしょう)。

質問に提供されている例では、次のようにできます。

tabs -4

ハードコーディングの代わりにターミナルデータベースを使用します。タブとそれを設定する制御シーケンスは、ECMA-48および他の場所に文書化されています。用語情報(5)マンページ。

そしてtabsxtermで使用されます。

答え2

多くの端末は、タップ停止を設定するエスケープシーケンスをサポートしています。この機能には、terminfo(5)にtbc(すべてのタブを消去)とhts(水平タブのセット)項目もあります。

$ tput tbc; echo aaaaaaaaaaaaaaaaaaaaa$(tput hts); echo 'a\tb'
aaaaaaaaaaaaaaaaaaaaa
a                    b

上記では、aaaaaaaaの最後にタブストップを設定し、次の行で結果を確認します。

したがって、4列ごとにタブストップを設定するには、次のものが必要です。

tbc=$(tput tbc) hts=$(tput hts) cuf4=$(tput cuf 4)
printf '%s\r' "$tbc"
i=4
while [ "$i" -lt "$COLUMNS" ]; do
  printf %s "$cuf4$hts"
  i=$(($i + 4))
done
printf '\r'

あるいは、不規則な間隔でタップストップを設定することもできます。上記ではカーソルを前に移動するために「tput cuf」を使用しましたが、最初の例では「aaaa」を使用しました。あなたはできます:

printf '\r%s' "${tbc}aaaa${hts}aaaaa${hts}aaaaaaaa${hts}"

4列目にタブストップを設定し、次に5列目の前にタブを設定します。

答え3

以下を使用して、環境変数をセッション全体にエクスポートせずに一時的に設定できますenv

env TERM=linux setterm -regtabs 4

答え4

さて、読んでみましたが、man xtermタブの幅についての言及はありません。リセットが最も簡単になると考え始めましたTERM。存在する.bashrc

function xterm_set_tabs () {
  TERM=linux
  export $TERM
  setterm -regtabs 4
  TERM=xterm
  export $TERM
}

if [ `echo $TERM` == "xterm" ]; then
  xterm_set_tabs
fi

編集するemacs -nw:これは説明されている問題に対して機能しますが、実行時にカーソルの移動が混乱するという副作用があります。状況の深刻さのため、これは問題に対する適切な解決策ではありません。 (サイトのポリシーについてよくわかりません。答えを削除する必要がありますか、それとも他の人が間違いから学ぶために保管する必要がありますか?当然のままにする必要があると思います。

関連情報