web-dev-qa-db-fra.com

EMACS C ++ - Mode d'indentation incorrecte?

Je suis en cours d'exécution EMACS 23 avec C++ - en mode et ayant des problèmes d'indentation. Supposons que j'ai ce code:

void foo()
{
   if (cond)
     { <---
        int i;
        ...
     } <---
}

Cela semble être le comportement par défaut de l'indentation automatique. Cependant, je voudrais le changer afin que ce soit comme ça:

void foo()
{
   if (cond)
   {
      int i;
      ...
   }
}

Existe-t-il un moyen de le faire facilement en configurant le mode C++ ou mon fichier .emacs?

35
Idan K

J'ai ce qui suit dans mon fichier .emacs:

(defun my-c++-mode-hook ()
  (setq c-basic-offset 4)
  (c-set-offset 'substatement-open 0))
(add-hook 'c++-mode-hook 'my-c++-mode-hook)

Vous pouvez déterminer quel offset à modifier en frappant [Ctrl-C Ctrl-S] sur n'importe quelle ligne. Sur la première ligne avec une attelle après le if, il dira substatement-open.

41
Alex B

Ceci est le mien ... Ceci correspond à la configuration par défaut pour Visual Studio.

(defun my-c-mode-common-hook ()
 ;; my customizations for all of c-mode, c++-mode, objc-mode, Java-mode
 (c-set-offset 'substatement-open 0)
 ;; other customizations can go here

 (setq c++-tab-always-indent t)
 (setq c-basic-offset 4)                  ;; Default is 2
 (setq c-indent-level 4)                  ;; Default is 2

 (setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60))
 (setq tab-width 4)
 (setq indent-tabs-mode t)  ; use spaces only if nil
 )

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

Réponse courte: mettez cette ligne dans votre fichier .emacs:

(c-set-offset 'substatement-open 0)

Longue réponse: ...

Pour ceux d'entre nous qui sont nouveaux pour EMACS-LISP, il existe une méthode assez simple à http://www.cs.cmu.edu/ :

  • Aller à la ligne que vous voulez indenter

  • Tapez C-C C-O (c'est la lettre "O", pas zéro)

  • Appuyez sur Entrée Pour accepter la suggestion par défaut

  • Tapez "0" (c'est un zéro) pour aucune indentation supplémentaire, appuyez sur Entrée

  • Type onglet pour reporter la ligne.

  • "{" Dans cette situation aura le réglage correct de l'onglet jusqu'à ce que vous redémarrez EMACS.

La bonne chose à propos de cette méthode est que vous pouvez réellement voir Le code LISP que vous souhaitez modifier. Vous pouvez mettre dans votre fichier .emacs:

(c-set-offset 'SYNTACTIC-SYMBOL OFFSET)

De plus, vous voudrez peut-être consulter le programme Astyle pour formater automatiquement la source C++ en dehors des EMACS.

9
Colin

La réponse acceptée est en fait faux. Emacswiki ne va pas aider.

Insérer le code suivant en ~/.emacs:

(defun fix-c-indent-offset-according-to-syntax-context (key val)
  ;; remove the old element
  (setq c-offsets-alist (delq (assoc key c-offsets-alist) c-offsets-alist))
  ;; new value
  (add-to-list 'c-offsets-alist '(key . val)))

(add-hook 'c-mode-common-hook
          (lambda ()
            (when (derived-mode-p 'c-mode 'c++-mode 'Java-mode)
              ;; indent
              (fix-c-indent-offset-according-to-syntax-context 'substatement-open 0))
            ))

Voir http://blog.binchen.org/posts/ccjava-code-indentation-in-emacs.html pour des détails techniques.

Le problème clé est C-Set-décalage est non fiable pour détecter le contexte de la syntaxe (EMACS24.3.1). Donc, le seul moyen fiable est d'analyser le code EMACS d'origine. Les étapes détaillées pour pirater le code sont répertoriées dans mon article, vous avez essentiellement besoin de lire la fonction C-indent-ligne qui est définie dans/usr/part /emacs/24.3/lisp/progmodes/cc-cmds.el

Certaines personnes se sont plaintes que ma configuration ne fonctionne pas. En fait, cela fonctionne dans tous des versions stables de EMACS (23.4, 24.3, 24.4) si vous ne modifiez pas la configuration par défaut (l'indention a des profils différents, mon La configuration est basée sur le profil par défaut).

Mon point clé est sur ce problème spécifique, vous avez besoin de lire le code.

3
chen bin

Avant de régler des compensations individuelles, configurez un style préférable. J'utilise Stroustrup, vous essayez d'autres d'autres, voir http://www.emacswiki.org/emacs/indentingc#toc1 pour les noms et http://en.wikipedia.org/ wiki/indent_style # variante: _stroustrup pour des exemples

M-X Personnalisez-la variable C-par défaut de type (et définissez votre préféré pour C++ _

1
Mekk