我对 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 伙伴有用。玩得开心! ?