Emacs: Wie kann man einen Bereich des Python-Codes um 4 Leerzeichen einrücken / freigeben?

60

Ich habe eine Region mit Python-Code in Emacs ausgewählt. Was sind die effizientesten Methoden, um jede Zeile darin um 4 Leerzeichen einzuziehen und die Einrückung aufzuheben?

Idealerweise möchte ich etwas, das nicht kontextsensitiv ist (z. B. das Einrücken von Passagen in Dokumentzeichenfolgen, bei denen sich der Einzug nicht auf die Python-Syntax bezieht).

Meine Moduszeile zeigt (Python). Beim Durchsuchen des Webs habe ich viele Diskussionen über die Verwendung von python-modestatt gefunden python, aber ich habe erst vor ein paar Tagen angefangen, Emacs zu verwenden. Daher bin ich vorsichtig, wenn ich die Standardeinstellungen ändern möchte, bevor ich die Gelegenheit habe, sie zu verstehen. Wenn der Wechsel zu python-modedie beste Option ist, akzeptiere ich das gerne als Antwort.

Was ich versucht habe (aus dem Handbuch):

  • <TAB> keine Wirkung
  • C-M-\ keine Wirkung
  • C-x <TAB> (starr einrücken) jede Zeile um eine Spalte einrücken (und die Auswahl der Region aufheben)
  • M-i rückt eine erste Zeile um einen Tabulator ein (Länge 8 Leerzeichen)
  • C-M-q - "CMq ist undefiniert"

Der einzige Weg, den ich gefunden habe, ist die Verwendung von regex-replace, aber das ist eine schreckliche Anzahl von Tastenanschlägen für eine so einfache Aufgabe.

Ian Mackinnon
quelle

Antworten:

69

Angenommen, die Variable python-indentist 4:

M-x python-shift-right (C-c >)
M-x python-shift-left  (C-c <)
Chen Levy
quelle
5
Was ich tun musste python-indent-shift-left.
Nnyby
17

indent-rigidlyEs wird ein Präfix-Argument verwendet, das angibt, um wie viel eingerückt werden soll, also C-u 42 C-x TABum 42 Spalten eingerückt werden soll. Da das Standard-Präfix-Argument 4 ist, C-u C-x TABwerden 4 Spalten eingerückt.

Wenn Sie die Region erneut auswählen möchten, tun Sie dies C-x C-xanschließend.

Gilles 'SO - hör auf böse zu sein'
quelle
8

Verwenden Sie den Befehl indent-rigidly mit einem numerischen Präfix.

C-u 4 M-x indent-rigidlyUm den Bereich um vier Leerzeichen einzurücken, C-u -4 M-x indent-rigidlyum vier Leerzeichen zu entfernen.

KeithB
quelle
4

Cx Cx Markiere den Code und dann Mx Einrückung für Tab-Modus

Das ist der Vorteil, wenn Sie für jede Zeile die Tabulatortaste gedrückt haben.

Nestor A. Diaz
quelle
3

Sie können auch den Spaltenmodus verwenden.

Wählen Sie die Zeilen im Spaltenmodus aus und fügen Sie allen gleichzeitig vier Leerzeichen hinzu:

  1. Wechseln Sie zu Spalte 1 der ersten Zeile, die Sie einrücken möchten.
  2. C-<space> Zeichen setzen
  3. Bewegen Sie den Punkt nach unten bis zur letzten Zeile (bleiben Sie in der ersten Spalte)
  4. C-x r tSpaltenmodus aufrufen (oder C-<RET>wenn Sie einen CUA-Modus haben)
  5. <space><space><space><space><RET>

Sie können auf ähnliche Weise vier Leerzeichen löschen - fügen Sie einfach 4 Spalten in Ihre markierte Region ein (Schritte 2-3) und drücken Sie <DEL>

Steve Lianoglou
quelle
3

Bei der Aktualisierung der obigen Lösung von Chen (getestet unter Emacs 24.4.1) wurden die Befehle umbenannt. Angenommen, Sie möchten gemäß der Variablen python-indent einrücken, lauten die Befehle python-indent-shift-left und python-indent-shift-right. Du kannst:

  1. stellen Sie sie durch Eingabe von M-x python-indent-shift-rightoder ausM-x python-indent-shift-left

  2. Verwenden Sie die Standardverknüpfungen für den Python-Modus C-c >undC-c <

  3. binde sie neu. ZB auf einer Tastatur mit einem Windows-Knopf, den ich benutze:

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

Composability ist der König bei Emacs. Kombinieren Sie einfach M-imit https://github.com/magnars/multiple-cursors.el und Sie haben Ihren Befehl zum Blockieren von Einrückungen. Das machst du:

  1. M-> N-mal (wobei N die Anzahl der Zeilen im Block ist)
  2. M-i
Evgeniy Dolzhenko
quelle
0

Beide S-<LEFT>undS-<RIGHT> funktionieren gut im PythonDur-Modus. Es ist besonders praktisch in Cua - Modus , wo C-cund C-xVerhaltensänderungen / Schnitt zu kopieren , wenn eine Region ausgewählt ist.

Vincent
quelle