如何在使用闭包时修复php模式缩进

时间:2012-07-14 09:39:52

标签: php emacs indentation php-mode

我在Emacs中使用php-mode,当我使用闭包作为这样的参数时,它工作得很好:

$app->get('/', function() use ($app) {
        echo "foo";
    });

当函数在函数调用内部时,缩进会使缩进加倍。如何解决这个问题?

修改

如何使它看起来像这样(与javascript模式处理匿名函数相同)。

$app->get('/', function() use ($app) {
    echo "foo";
});

3 个答案:

答案 0 :(得分:3)

如果你把点放在第一行的末尾并按下C-c C-o,你可以看到cc-mode认为你在中间的句法结构,并自定义它如何缩进该结构。我当前的计算机上没有php模式,但是当我做PHP时,我认为设置为零可以很好地工作。

答案 1 :(得分:3)

@amalloy的帮助下,我设法创建了解决问题的解决方案:

(defun unident-closure ()
  (let ((syntax (mapcar 'car c-syntactic-context)))
    (if (and (member 'arglist-cont-nonempty syntax)
             (or
              (member 'statement-block-intro syntax)
              (member 'block-close syntax)))
        (save-excursion
          (beginning-of-line)
          (delete-char c-basic-offset)))))

(add-hook 'php-mode-hook (lambda ()
                           (add-hook 'c-special-indent-hook 'unident-closure))

不确定是否需要使用php-mode-hook

很好的帮助C-c C-s显示c-syntactic-contextc-special-indent-hook被解雇时的内容(以及缩进完成后的内容)。

CC-Mode Manual也有帮助

<强>更新

我发现此代码无效

array('tags' => array_map($rows,function($row) {
....    return array(
....        'name' => $row['name'],
....        'size' => $normalize($row['tag_count']);
....    );
....});

(点是需要删除的空格)

和另一个

return array('tags' =>
             array_map($rows, function($row) use ($normalize) {
             ....    return array(
             ....        'name' => $row['name'],
             ....        'size' => $normalize($row['tag_count']);
             ....    );
             ....});

因此我需要修改该功能,C-c C-s显示arglist-cont-nonempty出现两次(每增加一次arglist-cont-nonempty添加更多需要删除的缩进)

(defun unident-closure ()
  (let ((syntax (mapcar 'car c-syntactic-context)))
    (if (and (member 'arglist-cont-nonempty syntax)
             (or
              (member 'statement-block-intro syntax)
              (member 'brace-list-intro syntax)
              (member 'brace-list-close syntax)
              (member 'block-close syntax)))
        (save-excursion
          (beginning-of-line)
          (delete-char (* (count 'arglist-cont-nonempty syntax)
                          c-basic-offset))))))

答案 2 :(得分:0)

我在jcubic的答案中尝试了代码,而不再是工作者。根据amalloy的有用答案,我已将jcubic的解决方法修改为以下内容,该方法有效。

function splitPathPosix(filename) {
  return /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(filename).slice(1);
}