Modifier le comportement de RET (avec retrait électrique) pour ne mettre en retrait que la nouvelle ligne, pas la précédente

10

/programming/27077770/how-do-i-disable-electric-indent-on-ret-but-still-keep-other-electric-characters demande et répond comment désactiver le retrait électrique en appuyant sur RET . Toutes les questions similaires semblent également s'arrêter à "désactiver le mode de retrait électrique".

Prêt à l'emploi, RET indente la ligne précédente et la nouvelle ligne. Pour la nouvelle ligne, cela signifie qu'elle ajoute simplement suffisamment d'espace pour que le curseur apparaisse à la position correcte.

J'aime la deuxième partie du comportement mais pas la première, c'est-à-dire que je ne veux jamais qu'elle indente la ligne précédente. Y a-t-il un moyen de le changer pour qu'il me donne suffisamment d'espace sur la nouvelle ligne mais sans toucher à la ligne précédente?

En fait, je n'ai pas besoin / je veux la plupart de l'électricité. Une solution qui implique de désactiver le mode de retrait électrique mais d'activer d'une manière ou d'une autre la fonction "ajouter des espaces pour les nouvelles lignes" me conviendrait.

AnoE
la source

Réponses:

6

Je pense que vous obtiendrez ce que vous voulez

(setq-default electric-indent-inhibit t)

Il s'agissait d'une variable pour les modes principaux (plutôt que pour les utilisateurs), mais elle devrait également prendre en charge votre cas d'utilisation.

Stefan
la source
Super merci. Je suis tombé sur cette variable en passant au crible electric.elmais je l'ai mise de côté en raison de sa documentation: "Si non nulle, la réindentation n'est pas appropriée pour ce tampon." Mon interprétation de cela était qu'il désactiverait simplement le mode électrique pour ce tampon ...
AnoE
L'essentiel est qu'il parle de ré- indentation, c'est-à-dire de changer l'indentation d'une ligne existante, par opposition à l'indentation d'une nouvelle ligne.
Stefan
J'aime le mode de retrait électrique lorsque je tape une accolade (pour la ligne actuelle). Est-il possible de conserver ce comportement tout en empêchant la ligne précédente de changer lorsque j'appuie sur Entrée?
Stanley Bak
1

En fait, je n'ai pas besoin / je veux la plupart de l'électricité. Une solution qui implique de désactiver le mode de retrait électrique mais d'activer d'une manière ou d'une autre la fonction "ajouter des espaces pour les nouvelles lignes" me conviendrait.

Cette approche pourrait être intéressante:

Dans les modes de programmation, je veux RETinvoquer invariablement indent-new-comment-lineou son analogue spécifique au mode, qui a toujours une liaison par défaut de M-j. Ces fonctions prennent en charge l'indentation, et commentent également la continuation lorsque vous en êtes à l'intérieur.

(defun my-coding-config ()
  ;; ...
  (local-set-key (kbd "RET") (key-binding (kbd "M-j")))
  (local-set-key (kbd "<S-return>") 'newline)
  )

(mapc
 (lambda (language-mode-hook)
   (add-hook language-mode-hook 'my-coding-config))
 '(prog-mode-hook
   ;; plus anything not derived from prog-mode:
   inferior-emacs-lisp-mode-hook
   css-mode-hook
   python-mode-hook))

(add-hook 'js-mode-hook 'my-js-mode-hook)
(defun my-js-mode-hook ()
  ;; Fix M-j behaviour in block comments in js-mode
  (setq-local comment-multi-line t)
  (local-set-key [remap indent-new-comment-line] 'c-indent-new-comment-line))
phils
la source