Indentation personnalisée pour des lignes spécifiques?

8

J'essaie actuellement de comprendre comment je peux gérer certaines lignes spécifiquement sans gâcher l'indentation du reste du tampon. Prenons l' MyFuncexemple de la fonction suivante :

void MyFunc()
{
  unsigned y = 0;

DONOTINDENT;

  unsigned int x = 5 + 2;
  return x + 12;
}

Ici, je veux que la ligne DONOTINDENT;soit mise en retrait vers la colonne 0, alors que le reste de la fonction devrait être mis en retrait normalement. J'ai essayé de résoudre ce problème en utilisant la coutume suivante c-special-indent-hook:

(defun my-c-mode-indent-hook ()
  (let (p1 p2 myline)
    (setq p1 (line-beginning-position))
    (setq p2 (line-end-position))
    (setq myLine (buffer-substring-no-properties p1 p2))

    (if (string-match-p "DONOTINDENT" myLine)
        (save-excursion
          (indent-line-to 0))
      )
    )
  )

(defun my-c-mode-common-hook ()
  ;; my customizations for all of c-mode and related modes
  (setq c-special-indent-hook 'my-c-mode-indent-hook)
  )

(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

OK, cela fonctionne très bien pour la ligne DONOTINDENT;, mais cela ne fonctionne pas pour toutes les lignes suivantes, car celles-ci sont en retrait par rapport à DONOTINDENT;. Ainsi, si DONOTINDENT;est mis en retrait à la colonne 0, unsigned int x = 5 + 2;sera également mis en retrait à la colonne 0, mais il devrait être mis en retrait à la colonne c-basic-offset.

Comment puis-je corriger l'indentation pour les lignes suivantes? Y a-t-il une variable interne que je peux utiliser pour influencer le calcul du niveau de retrait des lignes suivantes, ou ce calcul est-il purement basé sur le retrait précédent. Je pense qu'il devrait être possible de le faire d'une manière ou d'une autre, car les étiquettes des instructions switch-case sont mises en retrait de la même manière, mais j'ai eu du mal à le comprendre lors de la fouille dans le code en mode cc.

Merci d'avance!

Cordialement, Fabian

Rosepeter
la source

Réponses:

0

Je pense que c'est possible, selon la nature de la ligne DONOTINDENT.

Une règle cc-offsets-alist personnalisée autorise différentes règles d'indentation en fonction de l'élément syntaxique à indenter. Vous pouvez essayer de combiner cela avec les symboles syntaxiques corrects pour indenter des lignes spécifiques comme vous le souhaitez.

vxid
la source