(Linux)expand/unexpand ソースコードのタブ変換

月9ドラマ『好きな人がいること』(2016)
桐谷美玲、山﨑賢人、野村周平、三浦翔平のラブコメです。シェフがパテシェ女子をがさつに扱います。おそらくこのシェフとパテシェ女子が恋愛するのでしょう。ケーキも美味しそうだし、夜に食べるおむすびにも誘惑されます。パテシェ女子がハンバーグのソースをスプーンで一口舐めるシーンがあって、そのシェフの腕が確かなことが判るのですが、やはりソースが命なんですかね。私はソースだけじゃなくハンバーグも食べてないとわかりません。昔からソースはケチャップとソースとマヨネーズをかき混ぜて作るもの、と思っていた私は、ソースを一口食べて、はっ! これは美味しい! と気づく人が、みんなシェフに見えます。

さて、違うソースの話ですが、よく見かける日本人のソースで、コメントの位置を合わせて見栄えを良くするってのがあります。
(意味のないコメントの内容は置いておきます)

/************************************************/
/*      FUNCTION:       test                    */
/************************************************/
int test(void)
{
        int     a;      /* variable a           */
        int     b;      /* variable b           */

        return a * b;   /* muitiply a by b      */
}

上記ソースは、8タブです。 タブの位置がわかるようにタブを[桁数]で表してみます。

/************************************************/
/*[456]FUNCTION:[234567]test[67][234567][234567]*/
/************************************************/
int test(void)
{
[234567]int[567]a;[4567]/* variable a[7][234567]*/
[234567]int[567]b;[4567]/* variable b[7][234567]*/

[234567]return a * b;[7]/* muitiply a by b[4567]*/
}

好みの問題ではありますが、8タブだとネストが多い場合に、横に広がるため、せっかく綺麗に書いたコメントの位置修正でとっても大変になりますね(そもそもこんなコメント書かなきゃよいです)。

8タブを4タブに変換したい時は、expandとunexpandを連携させます。

~$ expand -t8 test.c | unexpand -t4 > test2.c

これでタブ変換できました。

8タブのtest.cと4タブのtest2.cを比較してみましょう。test2の方がタブ数が増えていることがわかると思います。

~$ diff test.c test2.c | sed 's/\t/[T]/g'
2c2
< /*[T]FUNCTION:[T]test[T][T][T]*/
---
> /*[T][T]FUNCTION:[T][T]test[T][T][T][T][T]*/
6,7c6,7
< [T]int[T]a;[T]/* variable a[T][T]*/
< [T]int[T]b;[T]/* variable b[T][T]*/
---
> [T][T]int[T][T]a;[T][T]/* variable a[T][T][T]*/
> [T][T]int[T][T]b;[T][T]/* variable b[T][T][T]*/
9c9
< [T]return a * b;[T]/* muitiply a by b[T]*/
---
> [T][T]return a * b;[T]/* muitiply a by b[T][T]*/
~$ 

test2.cをcatしてみます。

~$ cat test2.c
/************************************************/
/*              FUNCTION:               test                                    */
/************************************************/
int test(void)
{
                int             a;              /* variable a                   */
                int             b;              /* variable b                   */

                return a * b;   /* muitiply a by b              */
}

おっと表示が乱れました。コンソール側が8タブのままだったからです。

コンソールを4タブにて再度表示してみます。

~$ tabs -4
                                                                               
~$ cat test2.c
/************************************************/
/*      FUNCTION:       test                    */
/************************************************/
int test(void)
{
        int     a;      /* variable a           */
        int     b;      /* variable b           */

        return a * b;   /* muitiply a by b      */
}

綺麗に4タブになっています。まあ、タブ数を途中で変更したいというのは、社内の規約が変わったり、他人のソースが気に要らない時ぐらいでしょう。ハンバーグのソースは一口食べても美味しい! とは気づきませんが、ソースコメントなら、一目で不味い! と気づく自信はあります(今回使用したソースのようなコメントの書き方は真似してはいけませんね)。

コメント

タイトルとURLをコピーしました