首页 文章

如何让emacs的cperl-mode缩进所有语句延续只有一个级别?

提问于
浏览
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.";
}

3 回答

  • 0

    cperl-mode 默认情况下没有此问题 . 默认情况下,它会像这样缩进:

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

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

  • 1

    我确认您描述的行为存在,但是,从阅读源代码并在调试器下运行,并不是很明显有一个自定义可以让您(和我)想要的行为 .

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

    请测试这个补丁;如果你对它感到满意,我会添加一个自定义来启用它 .

  • 6

    正如@jerome-radix建议的那样,问题是're experiencing doesn'默认发生在 cperl-mode . 问题当然可以在 cperl-indent-rules-alist 中找到,但还有很多其他地方可以看 .

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

    在调试这类问题时,您需要从几个基本的东西开始,看看是否可以重现错误 . 首先让大家知道您正在运行的M-x emacs版本 . 然后通过运行 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
    

相关问题