Définir un retrait de 4 espaces dans Emacs en mode texte

160

Je n'ai pas réussi à faire passer Emacs de 8 onglets d'espace à 4 onglets d'espace en appuyant sur TABdans les tampons avec le mode majeur text-mode. J'ai ajouté ce qui suit à 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)

Peu importe comment je change mon .emacsfichier (ou les variables locales de ma mémoire tampon), le TABbouton fait toujours la même chose.

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

Autant j'aime Emacs cela devient ennuyeux. Existe-t-il un moyen de rendre Emacs à au moins 4 espaces en retrait lorsqu'il n'y a pas de texte dans la ligne précédente?

Cristian
la source
Pour une ligne de mode C ++ ou csharp-mode, j'ai ajouté (setq tab-width 4) (setq c-basic-offset 4) à la fin de (defun csharp-mode () ...) et il a fait l'astuce pour faire ( 1) les onglets s'affichent sous la forme de 4 au lieu de 8 caractères et (2) lorsque j'appuie sur l'onglet, j'obtiens 4 espaces sur une nouvelle ligne.
Jared Updike
Très tard, mais je viens de réaliser que l'utilisation de (setq tab-width 4) ne fonctionne pas, mais si vous utilisez (setq-default tab-width 4), vous n'avez rien d'autre à faire.
Sambatyon
Voir ma réponse si vous souhaitez utiliser des espaces mais allez aux taquets de tabulation.
forkandwait
Note aux autres qui ont trouvé cette question: ce (setq-default tab-width 4)n'est PAS la même chose que d' (setq tab-width 4)être sûr de ne pas manquer le "-default"!
zachaysan
10
Je ne peux pas croire que ce soit si difficile à faire.
gwg

Réponses:

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

ou ajoutez une entrée tab-stop-list à custom-set-variables 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))))
Bert F
la source
9
La largeur de tabulation et la liste d'arrêt de tabulation sont nécessaires. tab-width est utilisé lors de l'AFFICHAGE des onglets, tandis que tab-stop-list est nécessaire pour déterminer les taquets de tabulation lorsque vous AJOUTEZ des onglets.
Michael Ratanapintha
3
Veuillez noter stackoverflow.com/questions/69934/…
phils
5
N'y a-t-il vraiment rien de plus court que '(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)))? Eh bien, tant que cela fonctionne je suppose ...: P
HelloGoodbye
5
D'après la documentation, vous n'avez pas besoin de tous ces postes. Faites simplement 4 8 12 et cela s'étendra à tous les autres (continuez à ajouter 4). Apparemment, si vous utilisez juste 1 ou 2 éléments au lieu de 3, il utilisera simplement la largeur de tabulation comme dernière étape. Donc théoriquement, si je voulais tabuler de quatre espaces et que ma largeur de tabulation était fixée à 4. Je pourrais écrire '(tab-stop-list (quote (4))).
Nicholas Peterson
1
@NicholasPeterson merci d'avoir remarqué ça! Il semblerait cependant qu'en pratique, il quotefaut deux nombres pour continuer la séquence à l'infini. Voir: stackoverflow.com/a/42148697/2662028
ryanpcmcquen
138

Réponse courte:

Le point clé est de dire à emacs d'insérer ce que vous voulez lors de l'indentation, ceci se fait en modifiant la fonction indent-line-function. Il est plus facile de le changer pour insérer une tabulation puis de changer les tabulations en 4 espaces 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:

À partir de l' indentation contrôlée par le mode majeur @ manuel emacs :

Une fonction importante de chaque mode majeur est de personnaliser la clé pour qu'elle se désente correctement pour la langue en cours d'édition.

[...]

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

[...]

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

Depuis le manuel indent-relative @ emacs:

Indentation relative de l'espace sous le point de retrait suivant dans la ligne non vierge précédente.

[...]

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

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

Alcortes
la source
10
J'ai le même problème que l'OP, votre solution ne fonctionne pas pour moi.
Gauthier
Veuillez donner plus de détails. Voulez-vous dire qu'utiliser les lignes ci-dessus comme seul contenu de votre .emacs et appeler "Mx indent-selon-mode" n'insérera pas 4 espaces?
alcortes
3
votre confuguration insère 8 espaces pour moi.
Vladimir Mihailenco
4
J'utilise la version 23.3.1 d'emacs et la réponse courte ne le change pas en espaces. cette réponse est trompeuse.
VNarasimhaM
2
@BruceBarnett Je suis en mode texte et ces instructions ne fonctionnent toujours pas.
ensoleillé
66

Mise à jour: depuis Emacs 24.4:

tab-stop-listest maintenant implicitement étendu à l'infini. Sa valeur par défaut est remplacée par nilun taquet de tabulation toutes les tab-widthcolonnes.

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

La réponse originale suit ...


Cela me fait toujours un peu mal de voir des choses comme (setq tab-stop-list 4 8 12 ................)lorsque la number-sequencefonction attend d'être utilisée.

(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))
phils
la source
C'est la seule réponse que je pourrais obtenir pour travailler sur mon système.
Karpov
La page de personnalisation du retrait emacs indique que la liste des onglets "s'étend implicitement à l'infini par la répétition de la dernière étape" - ce qui signifie qu'une liste (4 8) devrait être assez bonne, sans séquence de nombres explicite
James Waldby - jwpat7
@ JamesWaldby-jwpat7 En effet, cela s'est produit dans 24.4 (2014). NEWS dit: " tab-stop-listest maintenant implicitement étendu à l'infini. Sa valeur par défaut est changée en nil, ce qui signifie une tabulation toutes les tab-widthcolonnes." - donc en fait, vous pouvez simplement utiliser la valeur par défaut de nil.
phils
21

Vous trouverez peut-être plus facile de configurer vos onglets comme suit:

M-x customize-group

À l' Customize group:invite, entrez indent.

Vous verrez un écran où 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 le faites de cette façon, vous voudrez créer un fichier de personnalisation .

Dave Webb
la source
Je dois me souvenir du groupe de personnalisation Mx - un raccourci très pratique!
Nick Bolton
11
(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)

la source
10
(defun my-custom-settings-fn ()
  (setq indent-tabs-mode t)
  (setq tab-stop-list (number-sequence 2 200 2))
  (setq tab-width 2)
  (setq indent-line-function 'insert-tab))

(add-hook 'text-mode-hook 'my-custom-settings-fn)
liste de lois
la source
Cela a fonctionné pour moi quand les autres sur cette page n'ont pas fonctionné.
Michael Terry
Works in emacs26.3
Saurabh
9
(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

utilisateur2318996
la source
En retard à la fête, mais merci. Je ne peux pas comprendre pourquoi emacs aurait besoin d'instructions spécifiques pour appliquer également ses règles d'indentation au code C / C ++. Je
lorgnerai sur Vim
Je veux poser cette question moi-même JUSTE POUR QUE JE PEUX ACCEPTER CETTE RÉPONSE. Je lui donnerais une prime si je le pouvais. J'étais très, très contrarié qu'un changement ait empêché emacs de tabuler à 4, qu'il passait par toutes les solutions sur cette page, et vous m'avez économisé énormément de travail!
Tri topologique
7

Ce problème n'est pas causé par des taquets de tabulation manquants; c'est qu'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 mappée à la méthode indent-for-tab-command, qui appelle la méthode sur laquelle la variable indent-line-function est définie, qui est la méthode relative à l'indentation pour le mode texte. Je n'ai pas trouvé un bon moyen de remplacer la variable indent-line-function (le hook de mode texte ne fonctionne pas, alors peut-être qu'il est réinitialisé après l'exécution des modes-hooks?) Mais un moyen simple de se débarrasser de cela Le comportement consiste simplement à lancer la méthode intent-for-tab-command en définissant TAB sur la méthode tab-to-tab-stop plus simple:

(définir-clé text-mode-map (kbd "TAB") 'tab-to-tab-stop)


la source
6

Essaye ça:

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

Cela obligera TAB à toujours insérer un caractère TAB littéral avec des taquets de tabulation tous les 4 caractères (mais uniquement en mode texte). Si ce n'est pas ce que vous demandez, veuillez décrire le comportement que vous aimeriez voir.

cjm
la source
4
Je pense que l'OP veut des espaces au lieu des tabulations (donc frapper Tab insère 4 espaces).
mipadi
En conjonction avec Aquamacs 2.4, cette réponse particulière me donne des caractères dans une autre langue au lieu d'un onglet: 렔. Si la touche de tabulation est enfoncée plusieurs fois, le résultat est: 렔렔 (sans aucune séparation). Et il en va de même pour chaque presse à onglets successive.
lawlist
6

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 aide.

gigilibala
la source
4

Le simple fait de changer de style avec le style c-set me suffisait.

diviser par zéro
la source
4

Ajoutez ceci à votre fichier .emacs:

Cela définira la largeur d'affichage d'un onglet à 2 caractères (changez le numéro 2 en ce que 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 du retour arrière sur un onglet est de le convertir en espaces, puis de supprimer un espace. Cela peut être ennuyeux. Si vous souhaitez simplement supprimer l'onglet, vous pouvez le faire:

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

Prendre plaisir!

qwerty9967
la source
Ne répond pas aux au moins 4 espaces posés dans la question.
kmarsh
2

C'est la seule solution qui empêche un onglet d'ê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 qu'il quotefaut deux nombres pour fonctionner (mais pas plus!).

De plus, dans la plupart des modes principaux ( Pythonpar exemple), l'indentation est automatique dans Emacs. Si vous devez mettre en retrait en dehors de l'indentation automatique, utilisez:

M-i

ryanpcmcquen
la source
2

Les personnalisations peuvent être ombrées, (setq tab width 4)alors utilisez setq-defaultou faites savoir à Personnaliser ce que vous faites. J'ai également eu des problèmes similaires à l'OP et je l'ai résolu avec cela seul, je n'ai pas besoin d'ajuster tab-stop-listou de insertfonctions:

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

J'ai 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)
Yary
la source
1

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

(global-set-key (kbd "TAB") 'self-insert-command)
user1009285
la source
0

As-tu essayé

(setq  tab-width  4)

la source
2
Ils ont cela dans leur question, alors oui, on peut supposer qu'ils l'ont essayé.
ryanpcmcquen
0
(setq-default tab-width 4)
(setq-default indent-tabs-mode nil)
Dason
la source
0

De mon fichier init, différent car je voulais des espaces plutôt que des tabulations:

(ajouter-crochet 'sql-mode-hook
          (lambda ()
             (progn
               (setq-default tab-width 4)
               (setq indent-tabs-mode nil)
               (setq indent-line-function 'tab-to-tab-stop) 
               (modifier-syntaxe-entrée? _ "w"); maintenant '_' n'est pas considéré comme un séparateur de mot
               (modifier-syntaxe-entrée? - "w"); maintenant '-' n'est pas considéré comme un séparateur de mot
               )))
fourchette et attendre
la source
0

Modifié cette réponse sans aucun crochet:

(setq-default
  indent-tabs-mode t
  tab-stop-list (number-sequence 4 200 4)
  tab-width 4
  indent-line-function 'insert-tab)
Saurabh
la source