Объемный абзац Emacs для Python
Работа с Python в Emacs, если я хочу добавить try/except в блок кода, часто обнаруживаю, что мне приходится отступать весь блок, строчно. В Emacs, как вы отступаете весь блок сразу.
Я не опытный пользователь Emacs, но просто найдите, что это лучший инструмент для работы через ssh. Я использую Emacs в командной строке (Ubuntu), а не как gui, если это имеет значение.
Ответы
Ответ 1
Если вы программируете Python с помощью Emacs, то вы, вероятно, должны использовать python-режим. В режиме python после маркировки блока кода
C-c >
или C-c C-l
сдвигает область 4 пробелов вправо
C-c <
или C-c C-r
сдвигает область 4 пробелов влево
Если вам нужно сменить код на два уровня отступа или какую-то суровую сумму, вы можете префикс команды с аргументом:
C-u 8 C-c >
сдвигает область 8 пробелов вправо
C-u 8 C-c <
сдвигает область 8 пробелов влево
Другой альтернативой является использование M-x indent-rigidly
, привязанного к C-x TAB
:
C-u 8 C-x TAB
сдвигает область 8 пробелов вправо
C-u -8 C-x TAB
сдвигает область 8 пробелов влево
Также полезны прямоугольные команды, которые работают с прямоугольниками текста вместо строк текста.
Например, после маркировки прямоугольной области
C-x r o
вставляет пустое пространство для заполнения прямоугольной области (эффективно сдвигая код вправо)
C-x r k
убивает прямоугольную область (эффективно сдвигая код влево)
C-x r t
запрашивает строку для замены прямоугольника. После ввода C-u 8 <space>
введите 8 пробелов.
PS. С Ubuntu, чтобы сделать режим python в режиме по умолчанию для всех .py файлов, просто установите пакет python-mode
.
Ответ 2
В дополнение к indent-region
, который по умолчанию отображается на C-M-\
, команды редактирования прямоугольника очень полезны для Python. Отметьте область как обычно, затем:
-
C-x r t
(string-rectangle
): предложит вам символы, которые вы хотите вставить в каждую строку; отлично подходит для вставки определенного количества пробелов.
-
C-x r k
(kill-rectangle
): удалите область прямоугольника; отлично подходит для удаления отступов
Вы также можете C-x r y
(yank-rectangle
), но это редко полезно.
Ответ 3
indent-region
, отображаемый в C-M-\
, должен сделать трюк.
Ответ 4
Я использую эту функцию для обработки моего отступов и unindenting:
(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))))))))
И затем я назначаю его сочетанию клавиш:
(global-set-key (kbd "s-[") 'unindent-dwim)
(global-set-key (kbd "s-]") (lambda () (interactive) (unindent-dwim -1)))
Ответ 5
Я - новобранец Emacs, поэтому этот ответ, вероятно, граничит с бесполезным.
Ни один из ответов, упомянутых до сих пор, не охватывает повторный отпечаток литералов типа dict
или list
. Например. M-x indent-region
или M-x python-indent-shift-right
, и компания не собирается помогать, если вы вырезали и вставляли следующий литерал и нуждались в том, чтобы он был правильно отредактирован:
foo = {
'bar' : [
1,
2,
3 ],
'baz' : {
'asdf' : {
'banana' : 1,
'apple' : 2 } } }
Кажется, что M-x indent-region
должен сделать что-то разумное в python-mode
, но это еще не все.
В конкретном случае, когда ваши литералы заключены в скобки, использование TAB на соответствующих строках получает то, что вы хотите (поскольку пробелы не играют роли).
Итак, что я делал в таких случаях, быстро записываю клавиатурный макрос, например <f3> C-n TAB <f4>
, как в F3, Ctrl-n ( или стрелка вниз), TAB, F4, а затем с помощью F4 для применения макроса можно сохранить пару нажатий клавиш. Или вы можете сделать C-u 10 C-x e
, чтобы применить его 10 раз.
(Я знаю, что это звучит не так много, но попробуйте перефразировать 100 строк литерала мусора без пропущенной стрелки вниз, а затем нужно подняться на 5 строк и повторить вещи;)).
Ответ 6
Я использую следующий фрагмент. На вкладке, когда выбор неактивен, он отбрасывает текущую строку (как обычно); когда выбор неактивен, он отбрасывает всю область вправо.
(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)
Ответ 7
Делайте отступы в интерактивном режиме.
- Выберите регион для отступа.
- C-x TAB.
- Используйте стрелки (<- и ->) для интерактивного отступа.
- Нажмите Esc три раза, когда закончите с требуемым отступом.
Скопировано из моего поста в: Отступ на несколько строк в Emacs
Ответ 8
Я делаю что-то вроде этого универсально
;; intent whole buffer
(defun iwb ()
"indent whole buffer"
(interactive)
;;(delete-trailing-whitespace)
(indent-region (point-min) (point-max) nil)
(untabify (point-min) (point-max)))