我對 Bee Jay 的 JEDI Code Formatter CLI 進行了硬分叉,它本身是 Lazarus JCF 的分叉,我對其進行了一些改進,提供了更好的縮排以及對現代 Delphi 變量聲明急需的支持。其古老、複雜且幾乎完全沒有文件記錄的程式碼確實很難繞過。儘管如此,我還是設法實現了我想要的。考慮到輸入原始碼是多麼棘手,以及在不破壞其他地方的情況下定位 AST 中的個別邊緣情況是多麼困難,它幾乎無法進一步擴展或改進。將來最好切換到不需要深度解析原始碼的格式化程式。
(適用於此版本的更新後的 VSCode 擴充功能也可用,拉取請求。)
變化包括:
支援 Delphi 內嵌變數聲明:
var I: Integer := 10 ;
透過類型推論:
var I := 42 ;
裡面的for
語句:
for var I := Low (myArray) to High (myArray) do
具有內聯變數的來源檔案不再導致格式化程式失敗。
新選項IndentCaseLabels
可獨立於整個case
區塊控制case
標籤語句的縮排。例如,將IndentCaseLabels
設定為True
(預設):
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
將IndentCaseLabels
設定為False
:
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
新選項IndentMethodParams
,因此可以像這樣編寫方法參數( IndentMethodParams
設定為False
):
function myFunction (aParam: string
; aParam2: real): boolean;
並避免第二行縮排。否則(設定為True
):
function myFunction (aParam: string
; aParam2: real): boolean;
新選項IndentInterfaceGuid
可防止介面 GUID 縮排。設定為True
:
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
設定為False
:
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
格式化程式現在可以正確處理註解內的行結尾,並且還可以避免格式化控制語句之間的註解。
格式化程式原始碼已透過格式化程式本身進行處理,以驗證「野外」的正確功能。
除非我忘記了什麼,否則我的所有更改都用// fix:
註釋“標記”。
二進位檔案可用。 64 位元 Windows 版本來自 FPC。 32位元Windows版本是用Delphi建構的。其他作業系統應該幾乎不需要任何改變就可以建置。
如何測試:
pascal-format -config=pascal-format.new.cfg -out test.fmt.pas test.pas
TODO:現在刪除了 GUI,調試解析的 AST 是不可能的,除非透過反覆試驗來實現。 AST 視圖需要重寫為文字形式的輸出,或者更好的是,簡單地在 LCL 中重新製作(但沒有 Delphi 支援)。鑑於它基本上只是空表單上的樹視圖,應該相當簡單。
因此,萬一其他人想浪費時間並繼續嘗試讓這個東西變得更聰明。
原描述如下。
我(Bee Jay)從 Lazarus IDE 儲存庫中取得 Jedi Code Formatter (JCF),並透過從原始 GUI 版本中刪除所有 GUI(圖形使用者介面)部分,將其製成 CLI(命令列介面)版本。 CLI 版本可用作 Visual Studio Code 中的 Pascal 程式碼格式化程序,或用作線上 Pascal 程式碼美化器的後端引擎。
原始:r823 jcf2 svn 樹的副本(有時經過修改):https://jedicodeformat.svn.sourceforge.net/svnroot/jedicodeformat/trunk/CodeFormat/Jcf2
原作者:安東尼·斯蒂爾。
原始許可證:MPL 1.1。
jcf-pascal-format
GitHub 儲存庫複製或下載到您自己的資料夾中。jcf-pascal-format/App
資料夾中的pascal_format.lpi
專案。jcf-pascal-format
資料夾中取得可執行pascal-format
檔案以及pascal-format.cfg
設定檔。./pascal-format -?
從終端測試它命令。它應該顯示使用手冊。 jcf-pascal-format
GitHub 儲存庫複製或下載到您自己的資料夾中。jcf-pascal-format/App
資料夾中的pascal_format.lpi
專案。jcf-pascal-format
資料夾開啟test.pas
檔案。JCF
程序,您應該在test.pas
檔案中看到結果。 pascal-format
和pascal-format.cfg
設定檔複製到 Pascal 工作區資料夾中。tasks.json
(如果已有任務)。tasks.json
檔案中。 {
"label" : " JCF: Beautify Code " ,
"type" : " shell " ,
"command" : " ./pascal-format " ,
"args" : [
" ${file} " ,
" -clarify " ,
" -inplace " ,
" -config=pascal-format.xml "
],
"presentation" : {
"reveal" : " never "
},
"problemMatcher" : []
},
-clarify
arg 變更為-obfuscate
。tasks.json
。現在您的任務清單中應該有新的 pascal-format 任務。 雖然 JCF 是一個很好的 Pascal 程式碼格式化程序,但它有一個非常煩人的問題。 JCF 要求程式碼必須是可編譯的,這意味著它必須是完整的程式並且語法正確。 JCF 將因程式碼片段或錯誤代碼而失敗。為了使其在程式碼片段上工作,它必須放在begin..end
對之間,並且具有正確的program
頭,如下所示:
program test;
begin
// put code snippet here
end .
以下是 VS Code(使用 OmniPascal)中執行的 JCF CLI:
注意:如果您也對演示中顯示的其他任務感興趣,請在此處查看我的要點。
希望它對其他 Pascal 夥伴有用。玩得開心! ?