web-dev-qa-db-fra.com

Définir 4 espace de retrait dans Emacs en mode texte

Je n’ai pas réussi à faire passer Emacs de 8 à 4 onglets d’espace en appuyant sur le bouton TAB dans 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 .emacs fichier (ou les variables locales de mon tampon) le TAB Le bouton fait toujours la même chose.

  1. S'il n'y a pas de texte ci-dessus, indenter 8 espaces
  2. 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 espace lorsqu'il n'y a pas de texte dans la ligne précédente?

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

ou ajoutez tab-stop-list entrée à custom-set-variables dans . emacs fichier:

(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))))
28
Bert F

Réponse courte:

L'important 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 modifier pour insérer un onglet, puis de le modifier en 4 espaces plutôt que de le modifier 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:

From Indentation contrôlée par le mode majeur @ manuel emacs :

Une fonction importante de chaque mode majeur consiste à personnaliser la clé afin d’indenter correctement pour la langue en cours d’édition.

[...]

La variable indent-line-function est la fonction à utiliser par (et diverses commandes, comme lorsque vous appelez indent-region) pour indenter la ligne actuelle. La commande indent-to-to-mode n'appelle que cette fonction.

[...]

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

De indent-relative @ emacs manual:

Indent-relative Space Out sous le prochain retrait de la ligne non vide précédente.

[...]

Si la ligne non vide précédente ne comporte pas de points d'indentation au-delà du point de colonne, la valeur commence par une tabulation.

Il suffit de remplacer la valeur de indent-line-function par la fonction insert-tab et de configurer l'insertion de tabulation sur 4 espaces.

133
alcortes

Mise à jour: Depuis Emacs 24.4:

tab-stop-list est maintenant implicitement étendu à l'infini. Sa valeur par défaut est changée en nil, ce qui signifie un tabulation d'arrêt tous les tab-width Colonnes.

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 garder sur nil.

La réponse originale suit ...


Cela me fait toujours mal de voir des choses comme (setq tab-stop-list 4 8 12 ................) quand le number-sequence _ fonction est assis, attendant d'être utilisé.

(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))
64
phils

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

M-x customize-group

Au Customize group: Invite entrez indent.

Vous verrez un écran où vous pouvez définir toutes vos options d'indentation 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 configurer un fichier de personnalisations .

21
Dave Webb
(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)
11
Yan Li
(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

9
user2318996
(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)
9
lawlist

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 par 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 intent-for-tab-command en définissant TAB sur la méthode simplifiée tab-to-tab-stop:

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

7
Glenn

Essaye ça:

(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 taquets de tabulation 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.

6
cjm

Vous pouvez ajouter ces lignes de code à votre fichier .emacs. Il ajoute un point d'ancrage pour le mode texte afin d'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 ça aide.

6
gigilibala

Ajoutez ceci à votre fichier .emacs:

Cela définira la largeur d'affichage d'un onglet à 2 caractères (changez le nombre 2 comme vous le souhaitez)

(setq default-tab-width 2)

Pour vous assurer que 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 voulez simplement supprimer l'onglet, vous pouvez faire ceci:

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

Prendre plaisir!

4
qwerty9967

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

4
dividebyzero

Les personnalisations peuvent masquer (setq tab width 4). Vous pouvez donc utiliser setq-default Ou laisser Customize savoir ce que vous faites. J'ai également eu 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 insert:

(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)
2
Yary

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)
1
user1009285

C'est la seule solution qui empêche qu'un onglet soit jamais inséré pour moi, sans séquence ni conversion des 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 mettre en retrait en dehors du retrait automatique, utilisez:

M-i

1
ryanpcmcquen

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 "); maintenant '_' n'est pas considéré comme un délimiteur de mots 
 (modification de la syntaxe? -" w "); à présent," - "n'est pas considéré comme un délimiteur de mots 
)) ) 
0
forkandwait

As-tu essayé

(setq  tab-width  4)
0
GrokCode

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

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