vim
にいるときは、次のコマンドでタブサイズを変更できます。
:set ts=4
cat
コマンド出力のタブサイズも設定できますか?
ここの最初のコマンドは、vim
に表示されるフォーマットをエミュレートします。 4列ごとのタブストップ(ts)設定に基づいて、タブを同じ数のスペースにインテリジェントに拡張します。
printf "ab\tcd\tde\n" |expand -t4
出力
ab cd de
tabsをtabsとして保持し、タブ[〜#〜] stop [〜#〜]位置を4列ごとに設定し、タブ文字で環境が機能する方法を変更する必要があります(vimが:set ts=4
コマンドで行うように)
たとえば、ターミナルでは、このコマンドでタブ[〜#〜] stop [〜#〜]を4に設定できます。
tabs 4; printf "ab\tcd\tde\n"
出力
ab cd de
次のコードを使用してください:
tabs -n
ここで、nはタブにも対応させるスペースの数です。シェルを起動するたびにこれを行う必要がないようにするには、.bash_profile
in ~/
と上記の行をファイルの最後に追加します。
Tabsコマンドの詳細については、以下を参照してください。
man tabs
cat
には、タブやタブストップの概念はありません。プログラムは入力を出力に流し込み、タブを他の文字と同様に扱います。出力デバイスがたまたま端末である場合、タブは、端末が提供するように構成されているすべての動作に従って処理されます。
POSIX.1を実装するシステムには、tabs(1)
と呼ばれるコマンドがあり、タブの表示方法に関する端末の概念を調整します。特定のタブレイアウトによっては、意図したことを行わないプリンターなどの他のデバイスに誰かがファイルを送信する可能性があるため、良い考えとは言えません。
ts
のvim
を調整する場合(または単純なvi
)、表示されるときにエディターがタブ文字を解釈する方法を調整するだけです。ファイルの最終的な内容には関係ありません。
上記の回答と例に基づいて、OPが望んだ実際のコマンドは...
cat somefile | expand -t4
これはRed Hat 6.4で動作します。
すでに与えられた答えを拡張するために、expand
はタブストップ位置のリストを取ることもできます。これは、さまざまな列のコンテンツの長さが大きく異なる場合に役立ちます。
openssl ciphers
の出力を読みやすくするために、今日この要件を満たしました。
$ openssl ciphers -v 'HIGH'|tr -s ' ' '\t'|expand -t31,41,57,70,90
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA384
...
ECDH-ECDSA-AES128-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128) Mac=SHA1
AES128-GCM-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(128) Mac=AEAD
AES128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA256
AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1
CAMELLIA128-SHA SSLv3 Kx=RSA Au=RSA Enc=Camellia(128) Mac=SHA1
PSK-AES128-CBC-SHA SSLv3 Kx=PSK Au=PSK Enc=AES(128) Mac=SHA1
expand -t31
のみを使用すると、出力の幅が約100文字から160文字以上に拡大されます。
多くの端末は可変タブストップの設定をサポートしています。 vt100、linux、またはEMCA-48標準をサポートするものは、Linuxサポート設定タブサイズに関するほとんどの用語を実行します:xtermおよびファミリ(uxterm、urxvt)xfce4-terminal、luit、Terminal、SecureTTYなど。
そこで、数年前に、ログイン時に2つのスペースごとにタブを設定するスクリプトを作成しました。以前は4を使用し、次に3を使用しましたが、現在は2になっています。
したがって、ファイルを「cat」すると、ファイル内のタブがターミナルの設定に展開されます。
Vim以上を通過した場合、独自のタブ拡張を行いますが、多くのユーティリティはタブを使用します。
参照用または個人用のスクリプトをここに含めます。
#!/bin/bash -u
#console_codes(4) man page... vt100/2 et && EMCA-48 standard
# (c) la walsh (2013) -- free to use and modify for personal use.
# -- optionally licenced under Gnu v3 license.
# v0.0.3 - try to reduce tabcols to minimal set to reproduce.
# v0.0.2 - set tabs for full terminal width (try to get term width)
shopt -s expand_aliases extglob
alias my=declare
alias int='my -i' array='my -a' intArray='my -ia' string=my
my _Pt=$(type -t P)
[[ $_Pt && $_Pt == function ]] && unset -f P
alias P=printf
unset _Pt
P -v clrallts "\x1b[3g" #Clear All TabStops
P -v hts "\033H" #Horizontal TabStop
P -v cpr "\x1b[6n" #Current Position Report
getcols() { # try to read terminal width
local sttyout="$(stty size </dev/tty)"
int default_cols=80
if [[ -n ${COLUMNS:-""} && $COLUMNS =~ ^[0-9]+$ ]]; then
default_cols=$COLUMNS; fi
[[ -z ${sttyout:-""} ]] && { echo $default_cols; return 0; }
int cols="${sttyout#*\ }"
echo -n $[cols<2?default_cols:cols]
return 0
}
getpos () {
string ans wanted=${1:-xy}
int attempt=0 max_attempt=1 # in case of rare failure case
# use 'attempt' value as additional
# time to wait for response
while : ; do
( ( P "\x1b[6n" >/dev/tty) & 2>/dev/null )
read -sd R -r -t $[2 + attempt] ans </dev/tty;
ans=${ans:2};
int x=0-1 y=0-1
if ! x="${ans#*;}" y="${ans%;*}" 2>/dev/null ||
((x==-1||y==-1)); then
((attempt+=1 < max_attempt)) && continue
fi
break; done
string out=""
[[ $wanted =~ x ]] && out="$x"
[[ $wanted =~ y ]] && out="${out:+$x }$y"
[[ $out ]] && echo -n "$out"
}
declare -ia tabs
get_tabs () {
P "\r"
tabs=()
int pos=0 oldpos=0-1
while ((oldpos!=pos));do
((pos)) && tabs+=($pos)
oldpos=pos
P "\t"
pos=$(getpos x)
done
P "\r"
return 0
}
# Note: this func uses ability to _read_ tabstops as _proxy_ for setting them
# (i.e. it makes no sense to be able to read them if you can't set them)
test_tabset_ability () {
string Prompt="tty_tab:"
int newcol=${#Prompt}+1
P "\r$Prompt"
int mycol=$(getpos x)
((mycol && mycol==newcol)) && return 0 ## return OK
{ P " Term tabset ability not detected mycol=${mycol:-''},"
P " promptlen=$newcol)\n"; } >&2
exit -1
}
do_help_n_display_curtabs () {
P " <n> - set tab stop to N\r"
intArray diffs;
int last=1 cur i
string eol=""
get_tabs && {
for ((i=0; i<${#tabs[@]}; ++i)); do
cur=${tabs[i]}
diffs[i]=cur-last
last=cur
done
intArray reverse_tabs_set=()
int prevtab=0-1
for ((i=${#diffs[@]}-2; i>0; --i)); do
int thistab=${diffs[i]}
if ((thistab!= prevtab)) ;then
reverse_tabs_set+=($thistab)
prevtab=thistab
fi
done
P "current value: tty_tab "
for ((i=${#reverse_tabs_set[@]}-1; i>=0; --i)); do
P "%d " "${reverse_tabs_set[i]}"; done
P "\r";
}
get_tabs && {
P "(from 1, tabs skip to column: "
P "%s " "${tabs[@]}"
P "\r\n"
}
}
set_tabs () {
int max_col=${1:=0-80}
int tabstop=${2:-?"need a param for tabstop"}
int tab=$tabstop pos=0
string str=""
P $clrallts ## reset old tabs
while ((++pos<cols)) ;do ## move across screen setting tabs
str+=" "
((pos%tab)) || str+="$hts"
done
P "\r$str\r"
}
int cols=$(getcols)
test_tabset_ability ## exits if no ability
if (($#==0)) ; then
do_help_n_display_curtabs
exit 1
else
set_tabs "$cols" "$@"
fi
# vim: ts=2 sw=2
それが役に立てば幸い...