8


2

emacsのcperlモードですべてのステートメントの継続を1レベルだけインデントするにはどうすればよいですか?

emacsのcperlモードでは、前の行のステートメントを継続する行は1レベル分インデントされます。

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

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

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

3 Answer


6


記述した動作が存在することを確認しますが、ソースを読み取ってデバッガーで実行することから、必要な動作(および私)を取得する_customization_があることは明らかではありません。

したがって、これは「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


`cperl-mode`にはデフォルトでこの問題はありません。 デフォルトでは、このようにインデントします:

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

`cperl-mode`が正しくインデントされないようにするカスタマイズがあります。 インデントの設定については、 `cperl-indent-rules-alist`変数を参照してください。


0


@ jerome-radixが示唆するように、あなたが経験している問題はデフォルトでは `cperl-mode`では起こりません。 問題は確かに「cperl-indent-rules-alist」にありますが、他にも見るべき場所がたくさんあります。

使用しているモードのバージョンは何ですか? [.kbd]#C-h v cperl-version RET#

この種の質問をデバッグするときは、いくつかの基本的なことから始めて、エラーを再現できるかどうかを確認する必要があります。 まず、実行している[.kbd]#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