我在 Emacs 中使用 php-mode,它可以正常工作,除非我使用闭包作为这样的参数:
$app->get('/', function() use ($app) {
echo "foo";
});
当函数在函数调用内部时,缩进会加倍。如何解决这个问题?
编辑
如何使它看起来像这样(与javascript-mode处理匿名函数相同)。
$app->get('/', function() use ($app) {
echo "foo";
});
我在 Emacs 中使用 php-mode,它可以正常工作,除非我使用闭包作为这样的参数:
$app->get('/', function() use ($app) {
echo "foo";
});
当函数在函数调用内部时,缩进会加倍。如何解决这个问题?
编辑
如何使它看起来像这样(与javascript-mode处理匿名函数相同)。
$app->get('/', function() use ($app) {
echo "foo";
});
如果您将 point 放在第一行的末尾并按 Cc Co,您可以看到 cc-mode 认为您处于哪个句法结构的中间,并自定义它如何缩进该结构。我当前的计算机上没有 php-mode,但我认为在我使用 PHP 时将其设置为零效果相当好。
在@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-context
当c-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))))))
我尝试了 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))))))