私は次の~/.gitconfig
エイリアスを持っています:
b = "!r() { count=10; git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:bold green)%(committerdate:relative)|%(color:yellow)%(refname:short)|%(color:red)%(objectname:short)%(color:reset)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:=10} | column -c 10 -ts '|'; }; r"
この関数の問題は、最も長い行に基づいて文字列をフォーマットすることです。つまり、次の値を含むテーブルがある場合これは出力ではなく、動作を示すgit branch --format
例に過ぎません。column
):
a, b, c
x, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, z
それでは、
a, b , c
x, yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, z
これは良い動作column
ですが、文字列の長さを切りたいと思います。たとえば、4より長い列はありません。
a, b , c
x, yyyy, z
awk
私は次のタスクを実行するためにパイプを追加しました(25文字を使用)。
b = "!r() { count=10; git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:bold green)%(committerdate:relative)|%(color:yellow)%(refname:short)|%(color:red)%(objectname:short)%(color:reset)|%(color: blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always --count=${count:=10} | column -c 10 -ts '|' | awk '{for(i=1;i<NF;i++){$i=substr($i,1,25)}; print $0}'; }; r"
しかし、テーブルがめちゃくちゃになりました:(
*
また、現在のブランチの先頭でもエラーが発生します。
この問題をどのように解決できますか?
column
幅を制御するオプションがある最新バージョンをインストールしようとしましたが、-c
できません。 :((からダウンロード)ここそれから試してみてください./configure && make install
。期待どおりに動作しません)。- 改行書式設定機能を試してみましたが、
\
成功しませんでした。関数がgitconfig
そんなに見苦しく見えるはずですか?
$ git --version
git version 2.34.1
答え1
column
出力幅の制限を理解する実装にアクセスできない場合、1つのアプローチはこれを行うことですawk
。ただし、実装ロジックは単純ですが、関数の長さを長くしますgitconfig
。
awk -F'|' -v maxw=4 '{for (i=1;i<=NF;i++) {l=length($i); if (l>maxw) l=maxw; if (l>mw[i]) mw[i]=l; lines[NR]=$0}}
END{for (j=1;j<=NR;j++) {n=split(lines[j],f,/\|/); for(i=1;i<=n;i++) {printf("%*s%s",mw[i],substr(f[i],1,maxw),i==n?ORS:OFS)}}}'
ご覧のとおり、awk
プログラムは入力を次に分割します|
(これはコマンドの実際の出力と呼ばれるものですgit branch
)。
- 各行に対してすべてのフィールドを繰り返し、配列
mw
の各列の最大フィールド幅を保存しますが、変数で指定された最大幅までのみ保存しますmaxw
。 - 次に、各行の「生」コンテンツ(元のフィールド区切り文字を含む)をバッファリングされた配列に保存します
lines
。 - 入力が終わったら、バッファを繰り返して
lines
行を配列に|
分割しますf
。各項目の最大フィールド文字を印刷しますf
。ここで必要なフィールド幅は、対応する列の配列から取得されます。maxw
printf
mw
あなたの例では(しかし、示されている|
ものではなく実際の-separationを仮定すると)、出力は次のようになります。,
a b c
x yyyy z