Travailler avec Python dans Emacs si je veux ajouter un essai/sauf à un bloc de code, je trouve souvent que je dois mettre en retrait le bloc entier, ligne par ligne. Dans Emacs, comment indentez-vous le bloc entier à la fois.
Je ne suis pas un utilisateur expérimenté d'Emacs, mais je trouve que c'est le meilleur outil pour travailler avec ssh. J'utilise Emacs sur la ligne de commande (Ubuntu), pas comme interface graphique, si cela fait une différence.
Si vous programmez Python en utilisant Emacs, alors vous devriez probablement utiliser le mode python. Avec le mode python, après avoir marqué le bloc de code,
C-c >
ou C-c C-l
décale la région de 4 espaces vers la droite
C-c <
ou C-c C-r
décale la région de 4 espaces vers la gauche
Si vous devez décaler le code de deux niveaux d'indentation ou d'un montant arbitraire, vous pouvez préfixer la commande avec un argument:
C-u 8 C-c >
décale la région de 8 espaces vers la droite
C-u 8 C-c <
décale la région de 8 espaces vers la gauche
Une autre alternative consiste à utiliser M-x indent-rigidly
qui est lié à C-x TAB
:
C-u 8 C-x TAB
décale la région de 8 espaces vers la droite
C-u -8 C-x TAB
décale la région de 8 espaces vers la gauche
Les commandes rectangle qui fonctionnent sur des rectangles de texte au lieu de lignes de texte sont également utiles.
Par exemple, après avoir marqué une région rectangulaire,
C-x r o
insère un espace vide pour remplir la région rectangulaire (en décalant efficacement le code vers la droite)
C-x r k
tue la région rectangulaire (en déplaçant efficacement le code vers la gauche)
C-x r t
demande une chaîne pour remplacer le rectangle. Saisie de C-u 8 <space>
entrera alors 8 espaces.
PS. Avec Ubuntu, pour faire du mode python le mode par défaut pour tous les fichiers .py, installez simplement le python-mode
paquet.
En plus de indent-region
, qui est mappé sur C-M-\
par défaut, les commandes d'édition du rectangle sont très utiles pour Python. Marquez une région comme normale, puis:
C-x r t
(string-rectangle
): vous demandera les caractères que vous souhaitez insérer dans chaque ligne; idéal pour insérer un certain nombre d'espacesC-x r k
(kill-rectangle
): supprime une zone rectangulaire; idéal pour supprimer l'indentationVous pouvez aussi C-x r y
(yank-rectangle
), mais ce n'est que rarement utile.
indent-region
orienté vers C-M-\
devrait faire l'affaire.
Je suis un newb Emacs, donc cette réponse est probablement à la limite de l'inutile.
Aucune des réponses mentionnées jusqu'à présent ne couvre la ré-indentation de littéraux comme dict
ou list
. Par exemple. M-x indent-region
ou M-x python-indent-shift-right
et la société ne vont pas vous aider si vous avez copié et collé le littéral suivant et que vous avez besoin de le ré-indenter sensiblement:
foo = {
'bar' : [
1,
2,
3 ],
'baz' : {
'asdf' : {
'banana' : 1,
'Apple' : 2 } } }
C'est comme ressentir M-x indent-region
devrait faire quelque chose de bon dans python-mode
, mais ce n'est pas (encore) le cas.
Pour le cas spécifique où vos littéraux sont entre crochets, l'utilisation de TAB sur les lignes en question obtient ce que vous voulez (car les espaces blancs ne jouent pas de rôle).
Donc, ce que j'ai fait dans de tels cas, c'est d'enregistrer rapidement un macro clavier comme <f3> C-n TAB <f4>
comme dans F3, Ctrl-n (ou flèche vers le bas), TAB, F4, puis l'utilisation répétée de F4 pour appliquer la macro peut enregistrer quelques frappes. Ou vous pouvez faire C-u 10 C-x e
pour l'appliquer 10 fois.
(Je sais que cela ne semble pas beaucoup, mais essayez de ré-indenter 100 lignes de déchets sans manquer de flèche vers le bas, puis avoir à remonter 5 lignes et répéter les choses;)).
J'utilise l'extrait de code suivant. Dans l'onglet lorsque la sélection est inactive, elle indente la ligne actuelle (comme elle le fait normalement); lorsque la sélection est inactive, elle indente toute la région vers la droite.
(defun my-python-tab-command (&optional _)
"If the region is active, shift to the right; otherwise, indent current line."
(interactive)
(if (not (region-active-p))
(indent-for-tab-command)
(let ((lo (min (region-beginning) (region-end)))
(hi (max (region-beginning) (region-end))))
(goto-char lo)
(beginning-of-line)
(set-mark (point))
(goto-char hi)
(end-of-line)
(python-indent-shift-right (mark) (point)))))
(define-key python-mode-map [remap indent-for-tab-command] 'my-python-tab-command)
J'ai utilisé cette fonction pour gérer mes indentations et indentations:
(defun unindent-dwim (&optional count-arg)
"Keeps relative spacing in the region. Unindents to the next multiple of the current tab-width"
(interactive)
(let ((deactivate-mark nil)
(beg (or (and mark-active (region-beginning)) (line-beginning-position)))
(end (or (and mark-active (region-end)) (line-end-position)))
(min-indentation)
(count (or count-arg 1)))
(save-excursion
(goto-char beg)
(while (< (point) end)
(add-to-list 'min-indentation (current-indentation))
(forward-line)))
(if (< 0 count)
(if (not (< 0 (apply 'min min-indentation)))
(error "Can't indent any more. Try `indent-rigidly` with a negative arg.")))
(if (> 0 count)
(indent-rigidly beg end (* (- 0 tab-width) count))
(let (
(indent-amount
(apply 'min (mapcar (lambda (x) (- 0 (mod x tab-width))) min-indentation))))
(indent-rigidly beg end (or
(and (< indent-amount 0) indent-amount)
(* (or count 1) (- 0 tab-width))))))))
Et puis je l'attribue à un raccourci clavier:
(global-set-key (kbd "s-[") 'unindent-dwim)
(global-set-key (kbd "s-]") (lambda () (interactive) (unindent-dwim -1)))
Faites une indentation de manière interactive.
Copié de mon message dans: Indentation de plusieurs lignes dans Emacs