Comment puis-je faire cperl mode emacs indenter tous les continuations de déclaration par un seul niveau?

StackOverflow https://stackoverflow.com/questions/3582436

Question

emacs' cperl-mode, les lignes qui continute une instruction à partir d'une ligne précédente sont en retrait d'un niveau:

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

Cependant, si l'instruction ne commence pas à zéro en retrait, car il est à l'intérieur d'un bloc, alors si vous cassez votre déclaration sur une troisième ligne, vous obtenez autre niveau d'indentation, et ainsi de suite:

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

Est-il possible de résoudre ce problème afin que les déclarations sont en retrait de la même manière à l'intérieur des blocs comme ils sont à l'extérieur? Je voudrais que le deuxième exemple ressembler à ceci:

sub fix_my_indentation {
  my $var
    = (1+1)
    * (2+2)
    / (3+3);
  return "Indentation is fixed.";
}
Était-ce utile?

La solution

Je confirme que le comportement que vous décrivez est présent, mais, à la lecture des sources et en cours d'exécution sous le débogueur, il est évident qu'il ya un personnalisation qui vous obtient le vous le comportement (et je ) veulent.

Par conséquent, je pense que ce bogue dans cperl-mode.

Le correctif est:

=== 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

S'il vous plaît tester ce patch; si vous êtes satisfait, je vais ajouter une personnalisation pour l'activer.

Autres conseils

cperl-mode n'ont pas ce problème par défaut. Par défaut, il indente comme ceci:

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

Vous avez une personnalisation qui EMPÊCHE cperl-mode à tiret correctement. Voir variable cperl-indent-rules-alist pour la configuration du tiret.

@ jerome-radix suggère, le problème que vous rencontrez ne se produit pas avec cperl-mode par défaut. Le problème pourrait certainement par en cperl-indent-rules-alist, mais il y a un certain nombre d'autres endroits à regarder.

Quelle version du mode utilisez-vous? cperl version C-h v RET

Lors du débogage ce genre de question que vous devez commencer par deux ou trois choses de base pour voir si vous pouvez reproduire l'erreur. Tout d'abord laissez-moi savoir ce que tout le monde M-x emacs version vous exécutez. Ensuite, éliminer vos propres personnalisations de l'équation en exécutant emacs -q pour éviter de charger votre fichier init au démarrage:

--no-init-file, -q          load neither ~/.emacs nor default.el

Si vous pouvez toujours reproduire le problème avec votre propre fichier init désactivé, puis aller plus loin et mettre hors tension au niveau du système avec emacs -Q:

--quick, -Q                 equivalent to:
                              -q --no-site-file --no-site-lisp --no-splash
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top