Как исправить отступ в 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))))))
Другие вопросы по тегам