Question

Je n'ai pas réussi à faire passer Emacs de 8 à 4 onglets d'espace en appuyant sur TAB dans les tampons avec le mode majeur en mode texte . J'ai ajouté les éléments suivants à mon .emacs :

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

;;; And I have tried
(setq indent-tabs-mode nil)
(setq tab-width 4)

Quelle que soit la façon dont je modifie mon fichier .emacs (ou les variables locales de mon tampon), le bouton TAB fait toujours la même chose.

  1. S'il n'y a pas de texte ci-dessus, indentez les 8 espaces
  2. .
  3. S'il y a du texte sur la ligne précédente, indentez au début du deuxième mot

Même si j'adore Emacs, cela devient agaçant. Existe-t-il un moyen de faire en sorte qu'Emacs mette au moins 4 espaces lorsqu'il n'y a pas de texte dans la ligne précédente?

Était-ce utile?

La solution

(customize-variable (quote tab-stop-list))

ou ajoutez une entrée tab-stop-list à variables de personnalisation dans le fichier .emacs :

(custom-set-variables
  ;; custom-set-variables was added by Custom.
  ;; If you edit it by hand, you could mess it up, so be careful.
  ;; Your init file should contain only one such instance.
  ;; If there is more than one, they won't work right.
 '(tab-stop-list (quote (4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))))

Autres conseils

Réponse courte:

Le point clé est de dire à emacs d'insérer ce que vous voulez en retrait, en changeant la fonction de retrait. Il est plus facile de le changer pour insérer un onglet, puis de le changer en 4 espaces plutôt que de le changer pour insérer 4 espaces. La configuration suivante résoudra votre problème:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)

Explication:

De Indentation contrôlée par le mode principal @ manuel emacs :

  

Une fonction importante de chaque majeure   le mode consiste à personnaliser la clé pour   indentez correctement pour la langue étant   modifié.

     

[...]

     

La variable indent-line-function est   la fonction à utiliser par (et   diverses commandes, comme lors de l'appel   indent-region) pour indenter le courant   ligne. La commande   indent-selon-à-mode ne plus   que d'appeler cette fonction.

     

[...]

     

La valeur par défaut est relative à l'indentation   pour de nombreux modes.

Du manuel d'indent-relative @ emacs:

  

Indent-relative Space out to under next   point d'indentation dans la ligne non vide précédente.

     

[...]

     

Si la ligne non vide précédente n'a pas   points de retrait au-delà du point de la colonne   commence à, `tab-to-tab-stop 'est fait   à la place.

Modifiez simplement la valeur de indent-line-function en fonction d'insertion-tabulation et configurez l'insertion de tabulation sous la forme de 4 espaces.

Mise à jour: Depuis Emacs 24.4:

  

tab-stop-list est maintenant implicitement étendu à l'infini. Sa valeur par défaut est remplacée par nil , ce qui signifie qu'un onglet arrête chaque colonne tab-width .

ce qui signifie qu'il n'est plus nécessaire de définir tab-stop-list de la manière indiquée ci-dessous, car vous pouvez le conserver sur nil .

La réponse originale suit ...

Cela me fait toujours mal de voir des choses comme (setq tab-stop-list 4 8 12 ................) lorsque la fonction numéro-séquence attend son utilisation.

(setq tab-stop-list (number-sequence 4 200 4))

ou

(defun my-generate-tab-stops (&optional width max)
  "Return a sequence suitable for `tab-stop-list'."
  (let* ((max-column (or max 200))
         (tab-width (or width tab-width))
         (count (/ max-column tab-width)))
    (number-sequence tab-width (* tab-width count) tab-width)))

(setq tab-width 4)
(setq tab-stop-list (my-generate-tab-stops))

Vous pouvez trouver plus facile de configurer vos onglets comme suit:

M-x customize-group

À l'invite Personnaliser le groupe: , entrez retrait .

Un écran apparaît dans lequel vous pouvez définir toutes vos options de retrait et les définir pour la session en cours ou les enregistrer pour toutes les sessions futures.

Si vous procédez ainsi, vous souhaiterez configurer un fichier de personnalisations .

(setq tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80))
(setq indent-tabs-mode nil)
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
(setq c-default-style "linux") 
(setq c-basic-offset 4) 
(c-set-offset 'comment-intro 0)

cela fonctionne pour le code C ++ et le commentaire à l'intérieur aussi

Ce problème n’est pas causé par des tabulations manquantes; c’est que emacs a une nouvelle méthode de tabulation appelée indent-relative qui semble conçue pour aligner les données tabulaires. La touche TAB est associée à la méthode indent-for-tab-command, qui appelle la méthode définie pour la fonction indent-line-function, qui est la méthode relative à indent pour le mode texte. Je n'ai pas trouvé un bon moyen de remplacer la variable indent-line-function (le crochet de mode texte ne fonctionne pas, alors peut-être est-il réinitialisé après l'exécution du crochet de mode?), Mais un moyen simple de s'en débarrasser Le comportement consiste simplement à rejeter la méthode d'intention de tabulation en définissant TAB sur la méthode simplifiée tab-to-tab-stop:

(mappe-mode-texte-définition-clé (kbd "onglet") 'tab-to-tab-stop)

Essayez ceci:

(add-hook 'text-mode-hook
  (function
   (lambda ()
     (setq tab-width 4)
     (define-key text-mode-map "\C-i" 'self-insert-command)
     )))

Cela fera que TAB insérera toujours un caractère de tabulation littéral avec des tabulations d'arrêt tous les 4 caractères (mais uniquement en mode texte). Si ce n'est pas ce que vous demandez, décrivez le comportement que vous aimeriez voir.

Vous pouvez ajouter ces lignes de code à votre fichier .emacs. Il ajoute un crochet pour le mode texte pour utiliser insert-tab au lieu de indent-relative.

(custom-set-variables
 '(indent-line-function 'insert-tab)
 '(indent-tabs-mode t)
 '(tab-width 4))
(add-hook 'text-mode-hook
      (lambda() (setq indent-line-function 'insert-tab)))

J'espère que cela vous aidera.

Changer le style avec c-set-style me suffisait.

Ajoutez ceci à votre fichier .emacs:

Ceci définira la largeur d'affichage d'une tabulation sur 2 caractères (changez le nombre 2 comme vous voulez)

(setq default-tab-width 2)

Pour vous assurer qu'emacs utilise réellement des tabulations au lieu d'espaces:

(global-set-key (kbd "TAB") 'self-insert-command)

En passant, la valeur par défaut pour emacs lors de l'espacement arrière sur un onglet est de le convertir en espaces, puis de supprimer un espace. Cela peut être agaçant. Si vous souhaitez simplement supprimer l'onglet, vous pouvez le faire:

(setq c-backspace-function 'backward-delete-char)

Profitez!

Les personnalisations peuvent masquer (setq tab width 4) ; utilisez donc setq-default ou laissez Customize savoir ce que vous faites. J'avais également des problèmes similaires à ceux de l'OP et je les ai corrigés avec cela seul, je n'avais pas besoin d'ajuster tab-stop-list ni aucune fonction insérer :

(custom-set-variables
 '(tab-width 4 't)
 )

Vous avez trouvé utile d'ajouter ceci immédiatement après (une astuce d'emacsWiki):

(defvaralias 'c-basic-offset 'tab-width)
(defvaralias 'cperl-indent-level 'tab-width)

Les meilleures réponses ne fonctionnaient pas jusqu'à ce que j'écrive ceci dans le fichier .emacs:

(global-set-key (kbd "TAB") 'self-insert-command)

C’est la seule solution qui empêche un onglet de jamais être inséré pour moi, sans séquence ni conversion d’onglets en espaces. Les deux semblaient adéquats, mais inutiles:

(setq-default
    indent-tabs-mode nil
    tab-width 4
    tab-stop-list (quote (4 8))
)

Notez que quote a besoin de deux nombres pour fonctionner (mais pas plus!).

De plus, dans la plupart des modes majeurs ( Python par exemple), l'indentation est automatique dans Emacs. Si vous devez effectuer un retrait en dehors du retrait automatique, utilisez:

M - i

Avez-vous essayé

(setq  tab-width  4)
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)

En passant, pour le mode C , j'ajoute (setq-default c-basic-offset 4) à .emacs. Pour plus de détails, voir http://www.emacswiki.org/emacs/IndentingC .

De mon fichier init, différent parce que je voulais des espaces au lieu d'onglets:

(add-hook 'sql-mode-hook
          (lambda ()
             (progn
               (setq-default tab-width 4)
               (setq indent-tabs-mode nil)
               (setq indent-line-function 'tab-to-tab-stop) 
               (modify-syntax-entry ?_ "w")       ; now '_' is not considered a word-delimiter
               (modify-syntax-entry ?- "w")       ; now '-' is not considered a word-delimiter 
               )))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top