Как я могу сделать в emacs режим cperl для отступа всех продолжений операторов только на один уровень? - PullRequest
8 голосов
/ 27 августа 2010

В режиме cperl в emacs строки, продолжающие оператор из предыдущей строки, имеют отступ на один уровень:

my $var
  = (1+1)
  * (2+2)
  / (3+3);

Однако, если оператор не начинается с нулевого отступа, потому что он находится внутриблокировать, затем, если вы разбиваете свое утверждение на третью строку, вы получаете еще один уровень отступа и так далее:

sub break_my_indentation {
  my $var
    = (1+1)
      * (2+2)
        / (3+3);
  return "Indentation is broken.";
}

Есть ли способ исправить это так, чтобы операторыОтступы так же внутри блоков, как и снаружи?Я хотел бы, чтобы второй пример выглядел так:

sub fix_my_indentation {
  my $var
    = (1+1)
    * (2+2)
    / (3+3);
  return "Indentation is fixed.";
}

Ответы [ 3 ]

6 голосов
/ 26 декабря 2012

Я подтверждаю, что описанное вами поведение присутствует, но из чтения исходных текстов и запуска под отладчиком не очевидно, что есть настройка , которая дает вам поведение, которое вы (и я) хочу.

Поэтому я думаю, что это ошибка в cperl-mode.

Исправление:

=== modified file 'lisp/progmodes/cperl-mode.el'
--- lisp/progmodes/cperl-mode.el    2012-12-01 05:09:12 +0000
+++ lisp/progmodes/cperl-mode.el    2012-12-26 16:29:19 +0000
@@ -3120,7 +3121,9 @@ and closing parentheses and brackets."
     ((eq 'continuation (elt i 0))
      ;; [continuation statement-start char-after is-block is-brace]
      (goto-char (elt i 1))     ; statement-start
-     (+ (if (memq (elt i 2) (append "}])" nil)) ; char-after
+     (+ (if (or (memq (elt i 2) (append "}])" nil)) ; char-after
+                     (eq 'continuation ; do not repeat cperl-close-paren-offset
+                         (elt (cperl-sniff-for-indent parse-data) 0)))
         0          ; Closing parenth
           cperl-continued-statement-offset)
         (if (or (elt i 3)      ; is-block

Пожалуйста, проверьте этот патч; если вы довольны этим, я добавлю настройку, чтобы включить его.

1 голос
/ 27 августа 2010

cperl-mode по умолчанию не имеют этой проблемы.По умолчанию он имеет такой отступ:

my $var
  = (1+1)
  * (2+2)
  / (3+3);

У вас есть настройка, которая не позволяет cperl-mode правильно делать отступ.См. Переменную cperl-indent-rules-alist для настройки отступа.

0 голосов
/ 26 декабря 2012

Как подсказывает @ jerome-radix, проблема, с которой вы столкнулись, по умолчанию не возникает с cperl-mode.Проблема, конечно, может быть в cperl-indent-rules-alist, но есть ряд других мест для поиска.

Какую версию режима вы используете? Ch v cperl-version RET

При отладке такого рода вопроса вам нужно начать с пары основных вещей, чтобы посмотреть, сможете ли вы воспроизвести ошибку.Сначала дайте всем знать, какую Mx emacs-версию вы используете.Затем удалите ваши собственные настройки из уравнения, выполнив emacs -q, чтобы избежать загрузки вашего файла инициализации при запуске:

--no-init-file, -q          load neither ~/.emacs nor default.el

Если вы все еще можете воспроизвести проблему с отключенным собственным файлом инициализации, тогда выполните шагдалее и выключите его на системном уровне с помощью emacs -Q:

--quick, -Q                 equivalent to:
                              -q --no-site-file --no-site-lisp --no-splash
...