2013-03-21 73 views
0

背景:我使用PHPStylist來縮進PHP代碼,這通常很好。但是,當它找到具有許多參數的函數調用時,它將所有這些參數放在一行上。因此,例如一個bind_param()電話可以很容易地是300個字符寬。打破長的源代碼行,但只能在逗號​​上打印

這並不適合我們的編碼風格指南,它指示最大行長度爲180個字符。

我們的縮進腳本已經有了一個sed命令來清除掉PHPStylist留下的尾隨空白,所以我想,sed也可以打破太長的行,但只能用逗號?

例輸入:

function xyz() 
{ 
    somecall($somevariable1, $somevariable1, $somevariable1, $somevariable1, $somevariable1, $somevariable1, $somevariable1, $somevariable1, $somevariable1); 
} 

輸出示例:

function xyz() 
{ 
    somecall($somevariable1, $somevariable1, $somevariable1, $somevariable1, 
$somevariable1, $somevariable1, $somevariable1, $somevariable1, $somevariable1); 
} 

(獎勵積分,如果腳本也可以縮進下一行嬌滴滴的,但我認爲這將是很難做到的在sed中awk,perl,python或其他常用工具的解決方案也將非常讚賞。)

回答

1

這awk腳本將在最後一個逗號最大線長,之前分割你的線,如果你喜歡,你可以設置爲運行時參數。它使分割線縮進比原始線多4個空格:

$ cat file 
function xyz() 
{ 
    somecall($somevariable1, $somevariable2, $somevariable3, $somevariable4, $somevariable5, $somevariable6, $somevariable7, $somevariable8, $somevariable9); 

     somecall($somevariable1, $somevariable2, $somevariable3, $somevariable4, $somevariable5, $somevariable6, $somevariable7, $somevariable8, $somevariable9); 
} 

$ awk -f tst.awk file 
function xyz() 
{ 
    somecall($somevariable1, $somevariable2, $somevariable3, 
     $somevariable4, $somevariable5, $somevariable6, 
     $somevariable7, $somevariable8, 
     $somevariable9); 

     somecall($somevariable1, $somevariable2, $somevariable3, 
       $somevariable4, $somevariable5, $somevariable6, 
       $somevariable7, $somevariable8, 
       $somevariable9); 
} 
$ 
$ cat tst.awk 
BEGIN{ maxLength = (maxLength ? maxLength : 66) } 

(length($0) > maxLength) && /,/ { 
    indent = $0 
    sub(/[^[:space:]].*/,"",indent) 

    tail = $0 
    while (tail ~ /[^[:space:]]/) { 
     head = substr(tail,1,maxLength) 
     sub(/,[^,]+$/,",",head) 
     tail = substr(tail,length(head)+1) 
     sub(/^[[:space:]]*/,indent" ",tail) 
     print head 
    } 
    next 
} 
1 

$ awk -v maxLength=100 -f tst.awk file 
function xyz() 
{ 
    somecall($somevariable1, $somevariable2, $somevariable3, $somevariable4, $somevariable5, 
     $somevariable6, $somevariable7, $somevariable8, 
     $somevariable9); 

     somecall($somevariable1, $somevariable2, $somevariable3, $somevariable4, $somevariable5, 
       $somevariable6, $somevariable7, $somevariable8, 
       $somevariable9); 
} 

$ awk -v maxLength=30 -f tst.awk file 
function xyz() 
{ 
    somecall($somevariable1, 
     $somevariable2, 
     $somevariable3, 
     $somevariable4, 
     $somevariable5, 
     $somevariable6, 
     $somevariable7, 
     $somevariable8, 
     $somevariable9); 

     somecall($somevariable1, 
       $somevariable2, 
       $somevariable3, 
       $somevariable4, 
       $somevariable5, 
       $somevariable6, 
       $somevariable7, 
       $somevariable8, 
       $somevariable9); 
} 
+0

謝謝,這完全是我需要的。 – 2013-03-22 09:18:24

2

A第一個建議,像這樣?

sed 's/.\{70\}[^,]*,/&\ 
/g' file 

---編輯---

對於縮進,你可以嘗試:

sed -e 's/\(.\{70\}[^,]*,\)[[:blank:]]*/\1\ 
/g; tend' -e n -e :end -e 's/\(^[[:blank:]]*\)\(.*\n\)/\1\2\1/ ' file 
+0

用換行符就像那樣......很酷。從來沒有見過。 – 2013-03-21 12:15:46

+0

如果該行需要分成多個,但較低的一個不會正確縮進,但是,真棒答案!我想我會用最好的一個。再次感謝! – 2013-03-21 12:18:20