VS Code PHP自动格式化/美化,使用Stroustrup风格大括号(K&R变体)和圆括号中的空格?

4

求助Stack Overflow,你是我的唯一希望。

我想在VS Code中对PHP文件应用以下规则的自动格式化:

  • Stroustrup风格的大括号(K&R变体)
  • 条件语句前空格
  • 函数后空格
  • 括号内留有空格

示例截图如下。Stroustrup braces and spaces

不想应用PSR-1、PSR-2、PSR-12、CakePHP或WordPress标准。

我已经尝试过以下方式:

  • VS Code内部PHP格式化工具
  • phpfmt(最后一次更新于2018年,并已存档在GitHub上)
  • PHP Intelephense(据我所知与格式无关)

phpfmt最接近要求,但是存在许多错误。

在VS Code设置方面,我采用以下选项:

  • "files.autoSave": "onFocusChange",
  • "editor.formatOnSave": true,

所以我希望能够立即美化我的PHP文件。

感谢任何想法!


5
我使用 intelephense 来格式化你的代码。默认情况下,它会在条件语句前面添加空格,并在函数后面添加空格。如果要使用 Stroustrup 样式花括号(K&R变体) ,请将默认设置更改为 "intelephense.format.braces": "k&r" ,并将其添加到 settings.json 文件中。就目前所知,在 vscode 中找不到任何 PHP 扩展程序可以对括号内的空格进行处理。希望这有所帮助。 - Raphaël Balet
1
@rbalet — 嘿,感谢你提供的 "intelephense.format.braces": "k&r", 小技巧!至少函数声明现在看起来好多了……但是,条件语句的格式 } else { 真的让我很难受,这个没法解决。 :/ - Anatoly IVANOV
我非常希望这是可能的。使用k&r设置已经非常接近了,但我非常同意'else'应该有自己的一行!如果有一个设置可以让格式化程序忽略为了可读性而留下的内联空格,那就太好了。这将允许多行赋值的垂直对齐,就像这样:https://www.reddit.com/r/vscode/comments/ct8yc2/how_can_i_stop_code_from_removing_inline_spaces/。还请参阅这些更新的(未解决的)SO问题:https://stackoverflow.com/q/63034135和https://stackoverflow.com/q/69091624。 - glaux
@glaux — 没错!到目前为止,我只是在我的无尽待办清单上列了一个“编写自定义PHP格式化程序扩展”的任务。说实话,这不是一个特别有趣的项目。在VS Code中,JavaScript的支持要好得多。考虑到JS正在从客户端转向服务器端渲染,我的猜测是,也许在某个时候,PHP将变得多余,上述的PHP格式化问题将自行消失。至少对于新的“从头开始”的项目来说是这样。 ‍♂️ - Anatoly IVANOV
我已经改进了答案,请看一下它是否仍然有兴趣。 - glaux
1个回答

1
编辑于2023年1月10日

我已经完善了以下答案,并在Github上发布了它。

该存储库提供了如何在本地安装的最小指南,不需要使用docker。

这与原始答案中概述的原则相同,但此新存储库以PSR12作为基本规则集,并强制执行规则1、3和4,同时允许OP中的规则2。我仍然认为这样可以获得最大的自由度,但是可以通过分叉存储库并通过在设置中启用"phpsab.debug": true"phpsab.snifferShowSources": true来检查各个规则在VS Code中进行调整。


我终于坐下来想出了如何实现这一点。这是从Ubuntu的角度来看的,但我认为它也可以在其他平台上工作。

我测试了一堆linter / fixer扩展,但没有真正取得进展,直到我找到了这个

安装phpcs / phpcbf的版本以及扩展可以使用的规则集有点复杂,因此我将所有内容捆绑在docker容器中(当然也可以使用composer在本地完成)。

我无法找到可以强制执行OP中的两个空格规则的规则,但是有很多自定义选项,包括编写自己的sniffs(而且老实说我没有特别努力地寻找)。但是上面链接的项目中的默认规则集/标准允许额外的空格,所以我感觉这已经成功了一半。

对于其他规则,以下是需要的明确部分,但请务必查看这些资源:12,并在创建自定义规则集时启用"phpsab.snifferShowSources": true"phpsab.debug": true

  • Stroustrup风格的大括号(K&R变体)
<rule ref="Generic.Functions.OpeningFunctionBraceKernighanRitchie">
</rule>
<rule ref="Drupal.ControlStructures.ControlSignature.SpaceAfterCloseParenthesis">
</rule>
  • 括号中的空格
<rule ref="PSR2.ControlStructures.ControlStructureSpacing">
  <properties>
    <property name="requiredSpacesAfterOpen" value="1" />
    <property name="requiredSpacesBeforeClose" value="1" />
  </properties>
</rule>

哇!这是相当大的一个弯路,非常感谢你分享这个。我已经快速阅读了文档,但会深入研究并回报 - 我明白你的整体想法,谢谢! - Anatoly IVANOV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接