Emacs cperl — отступ в постоянном блоке

#perl #emacs #cperl-mode

#perl #emacs #cperl-режим

Вопрос:

Я использую Aquamacs 3.0a на основе GNU Emacs 24.3.50.2. версия cperl — 6.2. Когда я редактирую постоянный блок Perl, я получаю дополнительный отступ, который мне не нужен:-

 use constant {
    ONE => 1,
        TWO => 2,
        THREE => 3,
    };
  

Чего я хочу, так это:-

 use constant {
    ONE => 1,
    TWO => 2,
    THREE => 3,
};
  

Проблема, похоже, в том, что добавляется cperl-continued-statement-offset, потому что мы находимся внутри блока, и в конце предыдущей строки нет точки с запятой.

Есть ли способ указать cperl на отступы в постоянных блоках, используя правила «parens»? Я попытался настроить cperl-indent-parens-as-block, но это не помогло. Я не удивлен, я думаю, мне следует искать переменную с именем cperl-indent-constant-block-as-parens 🙂

Ответ №1:

Немного покопавшись в коде, можно предположить, что это ошибка в режиме cperl — он должен обрабатывать постоянный блок как анонимный hashref — в конце концов, это в основном то, что есть! Вот исправление для cperl-block-p, которое делает это так. Кто-нибудь хотел бы одобрить или отклонить это? Мой elisp немного заржавел 🙂

 $ diff -u cperl-mode.el.orig cperl-mode.el
--- cperl-mode.el.orig  2013-09-27 13:43:56.000000000  0100
    cperl-mode.el   2014-06-30 18:02:30.000000000  0100
@@ -4828,9  4828,9 @@
       (and (memq (char-syntax (preceding-char)) '(?w ?_))
       (progn
         (backward-sexp)
-        ;; sub {BLK}, print {BLK} $data, but NOT `bless', `return', `tr'
         ;; sub {BLK}, print {BLK} $data, but NOT `bless', `constant', `return', `tr'
         (or (and (looking-at "[a-zA-Z0-9_:] [ tnf]*[{#]") ; Method call syntax
-             (not (looking-at "\(bless\|return\|q[wqrx]?\|tr\|[smy]\)\>")))
              (not (looking-at "\(bless\|constant\|return\|q[wqrx]?\|tr\|[smy]\)\>")))
         ;; sub bless::foo {}
         (progn
           (cperl-backward-to-noncomment (point-min))
  

Комментарии:

1. Мне кажется разумным (хотя я не очень разбираюсь в синтаксисе Perl). Вы можете отправить отчет об ошибке вместе с этим исправлением сопровождающим с M-x report-emacs-bug .

2. Спасибо за предложение — вместо этого я отправил электронное письмо сопровождающему в режиме cperl напрямую.

3. Вероятно, я должен упомянуть, что с этим патчем мне все еще нужно установить cperl-indent-parens-as-block в значение t, чтобы получить желаемый отступ, но именно так и должно быть.