Définir 4 espace de retrait dans Emacs en mode texte
-
09-06-2019 - |
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.
- S'il n'y a pas de texte ci-dessus, indentez les 8 espaces .
- 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?
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 parnil
, ce qui signifie qu'un onglet arrête chaque colonnetab-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
(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)
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 )))