#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, чтобы получить желаемый отступ, но именно так и должно быть.