Personnaliser l'indentation en mode makefile?

11

Dans mes makefiles, je préfère le retrait suivant pour les lignes de continuation:

FILES:=                \
    file1.cpp          \
    file2.cpp          \
    fileYetAnother.cpp

LIBS:=                 \
    libsth1.so         \
    libelsewhere.so

toujours, le mode makefile le met en retrait de la manière suivante (lorsqu'on lui demande de réindenter le fichier ou la région):

FILES:=            \
file1.cpp          \
file2.cpp          \
fileYetAnother.cpp

LIBS:=             \
libsth1.so         \
libelsewhere.so

Est-il possible de le configurer d'une manière ou d'une autre pour utiliser l'ancienne variante (= indentation des lignes de continuation par 4 espaces ou tabulation)?

Mekk
la source
Et la indent-according-to-modecommande?
Andriy Tykhonov

Réponses:

1

S'appuyant sur la solution de purple_arrows:

(defun my-makefile-indent-line ()
  (save-excursion
(forward-line 0)
(cond
 ;; keep TABs
 ((looking-at "\t")
  t)
 ;; indent continuation lines to 4
 ((and (not (bobp))
       (= (char-before (1- (point))) ?\\))
  (delete-horizontal-space)
  (indent-to 4))
 ;; delete all other leading whitespace
 ((looking-at "\\s-+")
  (replace-match "")))))

(add-hook 'makefile-mode-hook
      (lambda ()
    (setq-local indent-line-function 'my-makefile-indent-line)))
Alex Schröder
la source
Le seul problème est que cela ne fonctionnera pas si votre liste de fichiers est indentée par des tabulations, car mon code les laisse intactes.
Alex Schröder
fixer l'indentation à 4 n'est pas une bonne solution, que se passe-t-il si le FILESet LIBSsont longs, et il y a un élément après :=, et vous feriez mieux d'aligner les éléments suivants avec le premier après :=?
CodyChan
Quatre espaces est ce que la question posée.
Alex Schröder
0

Oui. Il est possible de le configurer, en quelque sorte.

(Avec des excuses pour le snark.)

Écrivez une fonction qui indente une ligne comme vous le souhaitez, puis définissez cette fonction comme valeur de la variable indent-line-functionpour makefile-mode. Quelque chose comme:

(defun my-makefile-indent-line ()
  ...)

(add-hook 'makefile-mode-hook (lambda () (setq-local indent-line-function 'my-makefile-indent-line)))
purple_arrows
la source
Bon, ces 3 points sont qch je ne sais pas trop comment les remplir ... Mais merci pour le pointeur partiel.
Mekk
0

Dans le cas où vous utilisez aggressive-indent-mode, cela m'a aidé à mettre makefile-modesur la liste aggressive-indent-excluded-modes:

(global-aggressive-indent-mode)
(add-to-list 'aggressive-indent-excluded-modes 'makefile-mode)

Notez que cela ne fonctionne qu'avec global-aggressive-indent-modeactivé.

Timm
la source