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