2017-09-19 77 views
4

我有几百个具有混合制表符和空格的可怕缩进PHP文件(甚至混合行结尾,我想)我想用php-cs-fixer v2 +修复它们。使用php-cs-fixer修复PHP代码文件的缩进

我已经配置了php-cs-fixer以满足我的需要,并且相应地清除了代码 - 除了缩进之外。我尝试了一个最小化的配置,如下图所示,来解决这个问题。但我不能让直压痕定影液:

return PhpCsFixer\Config::create() 
    ->setRules([ 
     '@PSR2' => true, 
     'indentation_type' => true, 
     'braces' => ['position_after_functions_and_oop_constructs' => 'same'], 
    ]) 
    ->setIndent("\t") 
    ->setLineEnding("\r\n") 

目前,我在我的Windows中使用下面的命令(此处为一个单独的文件)运行以下命令:

php-cs-fixer.bat fix new_user.php --config /full/windowspath/to/php_cs.dist 

以防万一,生成php_cs.cache(其中包含实际应用的规则JSON)文件是这样的:

{ 
    "php": "5.6.31", 
    "version": "2.6.0:v2.6.0#5642a36a60c11cdd01488d192541a89bb44a4abf", 
    "rules": { 
     "blank_line_after_namespace": true, 
     "braces": { 
      "position_after_functions_and_oop_constructs": "same" 
     }, 
     "class_definition": true, 
     "elseif": true, 
     "function_declaration": true, 
     "indentation_type": true, 
     "line_ending": true, 
     "lowercase_constants": true, 
     "lowercase_keywords": true, 
     "method_argument_space": { 
      "ensure_fully_multiline": true 
     }, 
     "no_break_comment": true, 
     "no_closing_tag": true, 
     "no_spaces_after_function_name": true, 
     "no_spaces_inside_parenthesis": true, 
     "no_trailing_whitespace": true, 
     "no_trailing_whitespace_in_comment": true, 
     "single_blank_line_at_eof": true, 
     "single_class_element_per_statement": { 
      "elements": ["property"] 
     }, 
     "single_import_per_statement": true, 
     "single_line_after_imports": true, 
     "switch_case_semicolon_to_colon": true, 
     "switch_case_space": true, 
     "visibility_required": true, 
     "encoding": true, 
     "full_opening_tag": true 
    }, 
    "hashes": { 
     "new_students.org_.php": -151826318 
    } 
} 

这里是一些严重缩进样本文件的内容。

<?php 
session_start(); 

    include 'connect.php'; 
include 'functions.php';  

$test= "abc"; 
    $additional_studs = ""; 
    if (date('m') == 12 and $term='SP') { 
     $yr_suffix = date('y') + 1; 
    } else { 
     $yr_suffix = date('y'); 
    } 


    function dup_stud($id, $conn) 
    {//... 
} 

$i = 0; 

我最恼火是线条状$test="abc"; & include 'connect.php';与一个或多个龙头选项卡/空间,没有得到适当的缩进。

我接受其他方法。其他人之前必须面对这样的格式问题。

我也尝试过NetBeans,它恰好格式化源代码,但手动打开每个文件并通过快捷方式应用源格式是很繁琐的。

+0

_Small Note_从PSR-2规范'代码必须使用4个空格进行缩进,而不是制表符。' – RiggsFolly

+2

感谢上帝,他们不会将我们发送到使用标签的gulag。 –

+0

感谢您的建议@RiggsFolly。将缩进更改为4个空格不会改善情况。 – wp78de

回答

1

基础上,导致我的决议的结果,我会回答我的问题。

虽然格式基本工作,捕捉对我来说是缩进。如果有一些前导空格或制表符,修复后某些行会保持伸出。

因为无论是PHP-CS-定影液也不phpcbf能够解决压痕正确我带着绝望的措施,并从每一行与在脚本中的sed这样的准备步骤修剪所有领先的空白:

sed "s/^[ \t]*//" -i test.php 

然后我用php-cs-fixer和phpcbf再次处理了一些准备好的文件,以找出哪一个能更好地根据PSR-2格式化文件。这是可耻的,但两个修复者再次失败 - 现在显示出一些不同的缺点(即错误)。长话短说,我终于明白,将这两种工具耦合在一起会导致正确格式化的代码文件。真是一团糟。

所以,sed的后,我跑phpcbf

phpcbf --standard="PSR2" test.php 

其次

php-cs-fixer fix test.php [email protected] 

和所有的突然我有精美的PSR-2格式的PHP文件。不是最有效的方式,但它能完成这项工作。

一些补充意见:

  • 如果你想申请额外的固定器的规则,我会建议使用从PSR-2基准格式不同,更完整的php_cs配置做到这一点在第4步(因为,你知道,还有更多的修复问题..)。
  • 我建议使用4个空格作为缩进,所要求的PSR-2。根据我的经验,如果你坚持要有标签,情况会变得更加复杂。如果PHP-CS-定影液和phpcbf不会有这么多的问题
  • 所描述的程序就没有必要。我会一个接一个地报告他们,希望将来也能一气呵成。
3

您应该使用braces固定器来强制缩进。

每个结构的主体必须用大括号括起来。大括号应妥善放置。 大括号的正文应该适当缩进。

indentation_type只是强制执行一致性。

但是由于这两个修复程序已包含在@PSR2中,所以应该正确修复代码。

请参阅README中的相关章节。


使用你的代码的PHP-CS-定影液2.6生成以下代码

<?php 
$test= "abc"; 
    $additional_studs = ""; 
    if (date('m') == 12 and $term='SP') { 
     $yr_suffix = date('y') + 1; 
    } else { 
     $yr_suffix = date('y'); 
    } 


    function dup_stud($id, $conn) 
    {//... 
    } 

$i = 0; 

当压痕仅部分固定。

我把它降低到下面的代码

<?php 
echo "a"; 
    echo "b"; 
echo "c"; 

它看起来像在PHP-CS-定影液中的错误。

+1

谢谢@Jan Tojnar。当我开始探测时,我在完整的配置文件中有一个大括号规则,但带有条纹。再次添加规则。不幸的是,事情并没有改善。 – wp78de

+1

同意。如果没有问题出现,我将转向php-cs-fixer的git跟踪器。 – wp78de

0

OP说

我打开替代方法。其他人之前必须面对这样的格式问题。

很好

我们PHP Formatter会缩进文件。见OP的“严重缩进”样品由PHP格式化处理:

C:\>DMSFormat PHP~v7 \temp\test.php 
PHP~v7 PrettyPrinter Version 1.3.17 
Copyright (C) 2004-2016 Semantic Designs, Inc; All Rights Reserved; SD Confidential 
Powered by DMS (R) Software Reengineering Toolkit 
DMS_PHP~v7_INPUT_ENCODING=ISO-8859-1 
DMS_PHP~v7_OUTPUT_ENCODING=ISO-8859-1 
Parsing \temp\test.php [encoding ISO-8859-1 +CRLF +LF +CR +NEL +1 /^I] 


<?php 
include 'connect.php'; 
include 'functions.php'; 
$test="abc"; 
$additional_studs=""; 
if (date('m') == 12 and $term='SP') { 
    $yr_suffix=date('y')+1; 
} 
else { 
    $yr_suffix=date('y'); 
} 

function dup_stud($id,$conn) { //... 
} 
$i=0; 

(我不得不

<?php 

添加到该文件,使之合法的开始。)

这个例子从文件运行到控制台。你也可以把一个文件做成一个文件,或者使用一个项目文件运行整个文件列表[这可能是OP想要的]。

PHP的格式化使用真PHP解析器来处理源文本,并建立一个抽象语法树,和一个特殊的prettyprinter打印AST回很好地格式化文本。它不能搞砸这个文件。