8

在 emacs 的 cperl-mode 中,从前一行延续语句的行缩进一级:

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.";
}
4

3 回答 3

6

我确认您描述的行为是存在的,但是,通过阅读源代码并在调试器下运行,并没有明显的定制可以让您获得您(和我)想要的行为。

因此我认为这是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

请测试此补丁;如果您对它感到满意,我将添加一个自定义来启用它。

于 2012-12-26T16:32:41.880 回答
1

cperl-mode默认没有这个问题。默认情况下,它缩进如下:

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

您有一个阻止cperl-mode正确缩进的自定义。有关缩进的配置,请参见cperl-indent-rules-alist变量。

于 2010-08-27T09:28:09.083 回答
0

cperl-mode正如@jerome-radix 建议的那样,默认情况下不会发生您遇到的问题。问题当然可以在 中cperl-indent-rules-alist,但还有许多其他地方可以查看。

您使用的是什么版本的模式?C-h v cperl-version RET

在调试此类问题时,您需要从一些基本的事情开始,看看您是否可以重现错误。首先让大家知道M-x emacs-version你在跑什么。emacs -q然后通过运行避免在启动时加载您的 init 文件,从等式中消除您自己的自定义:

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

如果您仍然可以在关闭您自己的 init 文件的情况下重现该问题,请更进一步并在系统级别使用以下命令将其关闭emacs -Q

--quick, -Q                 equivalent to:
                              -q --no-site-file --no-site-lisp --no-splash
于 2012-12-26T01:05:00.587 回答