3

我在 Emacs 中使用 php-mode,它可以正常工作,除非我使用闭包作为这样的参数:

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

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

编辑

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

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

3 回答 3

3

如果您将 point 放在第一行的末尾并按 Cc Co,您可以看到 cc-mode 认为您处于哪个句法结构的中间,并自定义它如何缩进该结构。我当前的计算机上没有 php-mode,但我认为在我使用 PHP 时将其设置为零效果相当好。

于 2012-07-26T02:07:21.317 回答
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 手册也有帮助

更新

我发现这段代码无效

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))))))
于 2012-07-26T12:34:04.027 回答
0

我尝试了 jcubic 答案中的代码,它不再是工作人员。基于 amalloy 的有用答案,我已将 jcubic 的解决方法修改为以下,它有效。

(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)
              (member 'defun-block-intro syntax)
              (member 'defun-close syntax)))
        (save-excursion
          (beginning-of-line)
          (delete-char (* (count 'arglist-cont-nonempty syntax)
                          c-basic-offset))))))
于 2015-09-17T10:04:51.643 回答