在emacs的cperl模式下,从上一行继续执行语句的行缩进一级:

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

最佳答案

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

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

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

关于emacs - 我如何才能使emacs的cperl模式仅将一个语句的所有缩进缩进一个级别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3582436/

10-12 07:33
查看更多