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

60

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 des docstrings où l'indentation n'est pas liée à la syntaxe python).

Ma ligne de mode montre (Python). En cherchant sur le Web, j'ai trouvé beaucoup de discussions sur l'utilisation à la python-modeplace de python, mais j'ai seulement commencé à utiliser emacs il y a quelques jours, alors je me méfie des modifications des valeurs par défaut avant que je puisse les comprendre. Si python-modele choix de 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 - "CMq n'est pas défini"

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

Ian Mackinnon
la source

Réponses:

69

En supposant que la variable python-indentest 4:

M-x python-shift-right (C-c >)
M-x python-shift-left  (C-c <)
Chen Levy
la source
5
Je devais faire python-indent-shift-left.
Nnyby
17

indent-rigidlyprend un argument de préfixe indiquant le retrait par conséquent, donc indente de C-u 42 C-x TAB42 colonnes, et puisque l’argument de préfixe par défaut est 4, C-u C-x TABindent de 4 colonnes.

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

Gilles, arrête de faire le mal
la source
8

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

C-u 4 M-x indent-rigidlyindenter la région de quatre espaces, C-u -4 M-x indent-rigidlysupprimer quatre espaces.

KeithB
la source
4

Cx Cx marque le code puis Mx indent-for-tab-mode

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

Nestor A. Diaz
la source
3

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 marquer
  3. déplace le point vers la dernière ligne (reste dans la première colonne)
  4. C-x r tpour 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 vous suffit d'inclure 4 colonnes dans la région marquée (étapes 2-3) et d'appuyer sur <DEL>

Steve Lianoglou
la source
3

Mise à jour de la solution de Chen ci-dessus, actuellement (testé sur Emacs 24.4.1), les commandes ont été renommées. Ainsi, en supposant que vous vouliez 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-rightouM-x python-indent-shift-left

  2. utilisez les raccourcis par défaut en mode python C-c >etC-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)
    
Amnon Harel
la source
0

La composabilité est le roi avec Emacs, combinez-la simplement M-iavec https://github.com/magnars/multiple-cursors.el et vous obtiendrez votre commande de mise en retrait. C'est ce que vous faites:

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

Les deux S-<LEFT>etS-<RIGHT> fonctionnent très bien en Pythonmode majeur. Il est particulièrement pratique en mode CuaC-cet C-xdes changements de comportement à copier / couper quand une région est sélectionnée.

Vincent
la source