Emacs bulk indent for Python

Praca z Pythonem w Emacsie jeśli chcę dodać try / except do bloku kodu, często stwierdzam, że muszę wciąć cały blok, Linia po linii. W Emacsie, jak wciąć cały blok naraz.

Nie jestem doświadczonym użytkownikiem Emacsa, ale po prostu uważam, że jest to najlepsze narzędzie do pracy przez ssh. Używam Emacsa w linii poleceń (Ubuntu), a nie jako gui, jeśli to robi jakąś różnicę.

Author: Vernon, 2010-04-06

7 answers

Jeśli programujesz Pythona używając Emacsa, prawdopodobnie powinieneś używać trybu Pythona. Z Pythonem-mode, po zaznaczeniu bloku kodu,

C-c > LUB C-c C-l przesuwa obszar o 4 spacje w prawo

C-c < lub C-c C-r przesuwa obszar o 4 spacje w lewo

Jeśli chcesz zmienić kod o dwa poziomy wcięć lub pewną ilość arbiterową, możesz poprzedzić polecenie argumentem:

C-u 8 C-c > przesuwa region 8 miejsc do prawo

C-u 8 C-c < przesuwa obszar o 8 spacji w lewo

Inną alternatywą jest użycie M-x indent-rigidly, które jest związane z C-x TAB:

C-u 8 C-x TAB przesuwa obszar o 8 spacji w prawo

C-u -8 C-x TAB przesuwa obszar o 8 spacji w lewo

Przydatne są również polecenia rectangle , które operują na prostokątach tekstu zamiast linii tekstu.

Na przykład, po zaznaczeniu prostokątnego obszaru,

C-x r o wstawia puste miejsce do wypełnienia obszar prostokątny (efektywnie przesuwając kod w prawo)

C-x r k zabija prostokątny obszar (skutecznie przesuwając kod w lewo)

C-x r t wyświetla monit o zastąpienie prostokąta ciągiem znaków. Wpisanie C-u 8 <space> spowoduje wpisanie 8 spacji.

PS. W Ubuntu, aby tryb Pythona stał się domyślnym trybem dla wszystkich plików .py, wystarczy zainstalować pakiet python-mode.

 182
Author: unutbu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 14:02:50

Oprócz indent-region, które jest domyślnie odwzorowane na C-M-\, polecenia edycji prostokąta są bardzo przydatne w Pythonie. Oznacz region jako normalny, to:

  • C-x r t (string-rectangle): wyświetli monit o znaki, które chcesz wstawić do każdej linii; świetnie nadaje się do wstawiania określonej liczby spacji
  • C-x r k (kill-rectangle): Usuń obszar prostokąta; świetny do usuwania wcięć

Możesz także C-x r y (yank-rectangle), ale to rzadko przydatne.

 8
Author: Daniel Stutzbach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-06 13:47:58

indent-region zmapowane do {[1] } powinno wystarczyć.

 4
Author: Łukasz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-06 13:28:20

Używam tej funkcji do obsługi mojego wcięcia i unindentowania:

(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))))))))

A następnie przypisuję go do skrótu klawiaturowego:

(global-set-key (kbd "s-[") 'unindent-dwim)
(global-set-key (kbd "s-]") (lambda () (interactive) (unindent-dwim -1)))
 1
Author: Singletoned,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-07 17:08:30

Jestem Emacs newb, więc ta odpowiedź prawdopodobnie graniczy z bezużytecznym.

Żadna z wymienionych dotąd odpowiedzi nie obejmuje ponownego wcięcia liter, takich jak dict lub list. Np. M-x indent-region lub M-x python-indent-shift-right i firma nie pomoże, jeśli wyciąłeś i wkleiłeś następujący literał i potrzebujesz go sensownie ponownie wciąć:

    foo = {
  'bar' : [
     1,
    2,
        3 ],
      'baz' : {
     'asdf' : {
        'banana' : 1,
        'apple' : 2 } } }

Wydaje się, że M-x indent-region powinno zrobić coś sensownie w python-mode, ale tak nie jest(jeszcze).

Dla konkretnego przypadku, w którym literały są zapisywane, korzystanie z TAB w danych liniach dostaje to, co chcesz (ponieważ białe znaki nie odgrywają żadnej roli).

Więc to, co robiłem w takich przypadkach, to szybkie nagrywanie makro klawiatury Jak <f3> C-n TAB <f4> jak w F3, Ctrl - N( lub Strzałka w dół), TAB, F4, a następnie wielokrotne użycie F4 do zastosowania makra może zapisać kilka naciśnięć klawiszy. Lub możesz zrobić C-u 10 C-x e, aby zastosować go 10 razy.

(wiem, że to nie brzmi jak wiele, ale spróbuj ponownie wciąć 100 linii śmieci literalnie bez pominięcia strzałki w dół, a potem trzeba iść w górę 5 linijek i powtarzać rzeczy ;)).

 1
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-08 14:42:42

Używam poniższego fragmentu. Na karcie, gdy zaznaczenie jest nieaktywne, wciska bieżącą linię (jak to zwykle robi); gdy zaznaczenie jest nieaktywne, wciska cały region w prawo.

(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
Author: mookid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-09 01:15:39

Robię coś takiego

;; intent whole buffer 
(defun iwb ()
  "indent whole buffer"
  (interactive)
  ;;(delete-trailing-whitespace)
  (indent-region (point-min) (point-max) nil)
  (untabify (point-min) (point-max)))
 -2
Author: hpavc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-06 14:28:40