web-dev-qa-db-fra.com

emacs: comment mettre en retrait / désindendre une région de code python de 4 espaces?

J'ai une région de code python sélectionnée dans emacs. Quels sont les moyens les plus efficaces d’indenter et désindenter chaque ligne de celle-ci de 4 espaces?

Idéalement, j'aimerais quelque chose qui ne soit pas sensible au contexte (par exemple, cela me permettra d'indenter des passages dans docstrings où l'indentation ne se rapporte pas à la syntaxe python).

Ma ligne de mode affiche (Python). En recherchant sur le Web, j'ai trouvé beaucoup de discussions sur l'utilisation de python-mode au lieu de python, mais je n'ai commencé à utiliser emacs que depuis quelques jours. changer les valeurs par défaut avant d’avoir eu la chance de les comprendre. Si passer à python-mode est la meilleure option, je suis heureux de l’accepter comme réponse.

Ce que j'ai essayé (d'après le manuel):

  • <TAB> aucun effet
  • C-M-\ aucun effet
  • C-x <TAB> (indent-rigidly) indenter chaque ligne d'une colonne (et désélectionne la région)
  • M-i indente une première ligne d'un onglet (longueur de 8 espaces)
  • C-M-q - "C-M-q n'est pas défini"

La seule façon que j'ai trouvée consiste à utiliser regex-replace, mais c'est un nombre impressionnant de frappes au clavier pour une tâche aussi simple.

58
Ian Mackinnon

En supposant que la variable python-indent est 4:

M-x python-shift-right (C-c >)
M-x python-shift-left  (C-c <)
69
Chen Levy

indent-rigidly prend un argument de préfixe indiquant le niveau d'indentation, donc C-u 42 C-x TAB indente de 42 colonnes et, puisque l'argument de préfixe par défaut est 4, C-u C-x TAB indente de 4 colonnes.

Si vous souhaitez sélectionner à nouveau la région, faites C-x C-x par la suite.

16
Gilles

Utilisez la commande indent-rigidly avec un préfixe numérique.

C-u 4 M-x indent-rigidly pour indenter la région de quatre espaces, C-u -4 M-x indent-rigidly pour supprimer quatre espaces.

8
KeithB

C-x C-x marque le code puis M-x indent-for-tab-mode

C'est la sauvegarde si vous avez appuyé sur Tab pour chaque ligne.

4
Nestor A. Diaz

Vous pouvez également utiliser le mode colonne.

Sélectionnez les lignes en mode colonne, puis ajoutez quatre espaces à la fois:

  1. Passez à la colonne 1 de la première ligne à mettre en retrait.
  2. C-<space> pour définir la marque
  3. déplace le point vers la dernière ligne (reste dans la première colonne)
  4. C-x r t pour entrer en mode colonne (ou C-<RET> si vous avez le mode CUA)
  5. <space><space><space><space><RET>

Vous pouvez effectuer une manœuvre similaire pour supprimer quatre espaces - il suffit d'inclure 4 colonnes dans la région marquée (étapes 2 à 3) et d'appuyer sur <DEL>

3
Steve Lianoglou

Mise à jour de la solution de Chen ci-dessus, actuellement (testé sur Emacs 24.4.1), les commandes ont été renommées. Donc, si vous voulez indenter en fonction de la variable python-indent, les commandes sont python-indent-shift-left et python-indent-shift-right. Vous pouvez:

  1. les émettre en tapant M-x python-indent-shift-right ou M-x python-indent-shift-left

  2. utiliser les raccourcis en mode python par défaut C-c > et C-c <

  3. les relier. Par exemple, sur un clavier avec un bouton Windows, j'utilise:

    (global-set-key (kbd "s-s") 'python-indent-shift-left) 
    (global-set-key (kbd "s-d") 'python-indent-shift-right)
    
3
Amnon Harel

Les deux S-<LEFT> ET S-<RIGHT> fonctionnent correctement en mode majeur Python. C'est particulièrement pratique en mode Cua où le comportement de C-c et C-x se transforme en copier/couper lorsqu'une région est sélectionnée.

0
Vincent

La composabilité est le roi avec Emacs, combinez simplement M-i avec https://github.com/magnars/multiple-cursors.el et vous obtiendrez votre bloc d'indentation commander. C'est ce que vous faites:

  1. M-> N fois (où N est le nombre de lignes du bloc)
  2. M-i
0
Evgeniy Dolzhenko