8

emacsのcperl-modeでは、前の行からステートメントを継続する行は、次の1つのレベルでインデントされます。

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

ただし、ステートメントがブロック内にあるためにゼロインデントで始まらない場合、ステートメントを3行目に分割すると、別のレベルのインデントが得られます。

sub break_my_indentation {
  my $var
    = (1+1)
      * (2+2)
        / (3+3);
  return "Indentation is broken.";
}

これを修正して、ステートメントがブロックの外側と同じようにブロックの内側にインデントされるようにする方法はありますか?2番目の例を次のようにしたいと思います。

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 に答える