2010-08-27 31 views
8

在emacs的cperl模式,即continute從以前的行的聲明線通過一個電平縮進:如何使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

感謝您提出這個問題,@Schwern。我仍然對找到答案感興趣。 – 2012-12-22 16:43:31

+0

對於它的價值,我也在其他模式中看到過這個問題,只有當行在第零列開始時,行延續縮進才能正常工作。 – 2012-12-23 05:12:07

回答

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 

請測試這個補丁;如果您對此感到滿意,我會添加一個自定義來啓用它。

+0

這似乎解決了這個錯誤。謝謝! – 2012-12-26 18:47:14

+0

我可以證實,修復它,謝謝!我將把它推向上游[cperl-mode](https://github.com/jrockway/cperl-mode)。 – Schwern 2012-12-27 00:46:55

+0

我[已將它發送到上游](https://github.com/jrockway/cperl-mode/pull/12)。 – Schwern 2012-12-27 00:55:27

1

cperl-mode默認情況下不存在此問題。默認情況下,它縮進就像這樣:

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

你有一個定製防止cperl-mode正確縮進。請參閱cperl-indent-rules-alist變量以配置縮進。

+0

嗯。如果語句從縮進級別零開始,它就像你說的那樣工作。但是,如果聲明是在某個區塊內開始的,那麼它就會按照我所說的去做。我會更新這個問題。 – 2010-08-29 01:15:06

0

正如@ jerome-radix所示,您遇到的問題默認情況下不會發生在cperl-mode之間。這個問題當然可以在cperl-indent-rules-alist中找到,但還有很多其他地方需要注意。

您使用的是什麼版本的模式? C-h v cperl-版本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 
+0

你必須把它放在塊中才能看到問題。 – Schwern 2012-12-26 01:08:55

+0

是的,我把你的拼塊複製完畢,我沒有遇到這個問題。事實上,當我用不正確的縮進手工輸入它,然後運行'indent-region'時,它會正確地重新設置所有內容,這就是爲什麼我建議您提供有關您的配置的更多詳細信息,因爲包括我自己在內的其他人不能再現問題。 – aculich 2012-12-26 01:14:51

+0

我以爲我用emacs -Q試過這個,但仍然有問題,但那是幾年前的事情,所以我有機會再重複一遍這個實驗。 – 2012-12-26 03:08:45