J'essaie de diagnostiquer ce problème. TAB crée 4 espaces au lieu d'un 4 TAB comme je le veux. Mais je ne pense pas que cela devrait, car C-h v indent-tabs-mode
sur le tampon en question dit qu'il est réglé à t
. Lorsque je vérifie mes raccourcis clavier, TAB est défini sur c-indent-line-or-region
. Cette fonction ignore-t-elle mon mode tabulations?Pourquoi mes Emacs utilisent-ils des espaces au lieu des onglets?
Répondre
Les onglets et l'indentation dans Emacs sont un sujet beaucoup plus complexe que la plupart des gens ne le pensent. Je recommande fortement de passer du temps à lire à ce sujet - cela vous évitera certainement une certaine confusion à long terme.
La page suivante dans les groupes Wiki Emacs ensemble la plupart des discussions pertinentes: http://www.emacswiki.org/emacs/CategoryIndentation
Il y a beaucoup là-bas, mais il vaut la peine de regarder à travers. L'une ou l'autre des configurations TabsAreEvil et SmartTabs est susceptible de vous intéresser, d'après vos opinions personnelles sur le sujet!
Assurez-vous de lire la page sur la variable tab-stop-list. Il est caché près du bas de cette liste de liens, mais il est essentiel de comprendre le comportement des onglets en l'absence de règles d'indentation automatique, ainsi que des choses comme «tabify».
Le mode règle est utile ici aussi. Je l'active automatiquement en mode texte:
;; Use ruler in text-mode
(add-hook 'text-mode-hook
(function (lambda()
(setq ruler-mode-show-tab-stops t)
(ruler-mode 1))))
Vérifiez la variable tab-width
. Si c'est 8 (la valeur par défaut), alors Emacs doit bien sûr insérer quatre espaces car un onglet serait "trop".
Il était 8. Je l'ai changé à 4 tout à l'heure, mais le problème persiste. –
Vérification du fichier pour Emacs "File Local Variables". Ces lignes spécialement formatées peuvent remplacer vos paramètres lorsque ce fichier est chargé.
Voici un exemple du fond d'un morceau de code Ruby, forçant indentation à 2 places et onglets convertis en espaces:
# Local Variables:
# tab-width: 2
# ruby-indent-level: 2
# indent-tabs-mode: nil
# End:
Je compris le problème. Il insérait un caractère de tabulation après tout. Il se trouve que je pensais que ce n'était pas parce que lorsque je frappe en arrière cette clé est liée à c-electric-backspace
, qui se penche sur la variable c-backspace-function
qui a été mis à backward-delete-char-untabify
, qui IMO défait le but d'avoir des onglets.
Vous pouvez trouver la variable x-stretch-cursor et le mode whitespace utiles pour l'identification visuelle des onglets. Ce dernier peut être assez criard par défaut, mais il est raisonnablement personnalisable, vous pouvez donc trouver une configuration agréable. – phils
+1. Si j'avais vu cette réponse plus tôt, j'aurais sauvé une heure de ma vie. –
Assurez-vous de jeter également un coup d'œil à la première ligne du fichier. Si vous voyez quelque chose comme // - - tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: none - - Cette ligne remplacera tous les paramètres globaux ou de mode.
Notez que beaucoup de gens (y compris moi-même) pense que les onglets sont mal: http://www.emacswiki.org/emacs/TabsAreEvil - vous avez changé votre largeur de tabulation de la valeur par défaut 8 à 4. Si je devais regarder à votre code, l'indentation serait fausse. En outre, vous aimez généralement aligner des parties de votre code, c'est-à-dire des arguments de fonction - cela ne serait pas possible avec les onglets seuls, et vous obtiendriez au final une combinaison d'onglets et d'espaces. – slu