在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.";
}
答案 0 :(得分: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
请测试这个补丁;如果你对此感到满意,我会添加一个自定义来启用它。
答案 1 :(得分:1)
cperl-mode
默认情况下没有此问题。默认情况下,它会这样缩进:
my $var
= (1+1)
* (2+2)
/ (3+3);
您有自定义功能可以阻止cperl-mode
正确缩进。有关缩进的配置,请参阅cperl-indent-rules-alist
变量。
答案 2 :(得分:0)
正如@jerome-radix建议的那样,默认情况下cperl-mode
不会发生您遇到的问题。问题肯定可以在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
如果仍然可以在关闭自己的初始化文件的情况下重现问题,请继续前进,并使用emacs -Q
在系统级别将其关闭:
--quick, -Q equivalent to:
-q --no-site-file --no-site-lisp --no-splash