Как исправить отступ в php-режиме при использовании замыканий
Я использую php-режим в Emacs, он прекрасно работает, за исключением случаев, когда я использую замыкания в качестве аргумента, например:
$app->get('/', function() use ($app) {
echo "foo";
});
Это показывает, что когда функция находится внутри вызова функции, отступ удваивается. Как это исправить?
РЕДАКТИРОВАТЬ
Как сделать так, чтобы это выглядело так же, как javascript-mode для обработки анонимных функций.
$app->get('/', function() use ($app) {
echo "foo";
});
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-context
переменная, когда c-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))))))
Если вы поставите точку в конце первой строки и нажмете Cc Co, вы сможете увидеть, в какой синтаксической конструкции cc-mode думает, что находитесь в середине, и настроить способ отступа этой конструкции. У меня нет php-режима на моем текущем компьютере, но я думаю, что установка его на ноль работала достаточно хорошо, когда я работал на PHP.
Я попробовал код в ответе jcubic, и он больше не работает. Основываясь на полезном ответе Амаллоя, я изменил обходной путь 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))))))