web-dev-qa-db-fra.com

Retrait en vrac Emacs pour Python

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.

122
Vernon

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.

198
unutbu

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'espaces
  • C-x r k (kill-rectangle): supprime une zone rectangulaire; idéal pour supprimer l'indentation

Vous pouvez aussi C-x r y (yank-rectangle), mais ce n'est que rarement utile.

8
Daniel Stutzbach

indent-region orienté vers C-M-\ devrait faire l'affaire.

4
Łukasz

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;)).

1
Rob

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

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

Faites une indentation de manière interactive.

  1. Sélectionnez la région à mettre en retrait.
  2. C-x TAB.
  3. Utilisez des flèches (<- et ->) pour indenter de manière interactive.
  4. Presse Esc trois fois lorsque vous avez terminé avec l'indentation requise.

Copié de mon message dans: Indentation de plusieurs lignes dans Emacs

0
dtypist