gitbranch --format文字列の長さを制限する方法

gitbranch --format文字列の長さを制限する方法

私は次の~/.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。ここで必要なフィールド幅は、対応する列の配列から取得されます。maxwprintfmw

あなたの例では(しかし、示されている|ものではなく実際の-separationを仮定すると)、出力は次のようになります。,

a    b c
x yyyy z

おすすめ記事