Emacs массовый отступ для Python - PullRequest
121 голосов
/ 06 апреля 2010

Работая с Python в Emacs, если я хочу добавить попробовать / кроме блока кода, я часто нахожу, что мне приходится отступать весь блок построчно. В Emacs, как сделать отступ для всего блока сразу.

Я не опытный пользователь Emacs, но просто считаю, что это лучший инструмент для работы через ssh. Я использую Emacs в командной строке (Ubuntu), а не в качестве графического интерфейса, если это имеет значение.

Ответы [ 7 ]

195 голосов
/ 06 апреля 2010

Если вы программируете 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.

8 голосов
/ 06 апреля 2010

В дополнение к indent-region, который по умолчанию отображается на C-M-\, команды редактирования прямоугольника очень полезны для Python. Отметьте регион как нормальный, затем:

  • C-x r t (string-rectangle): запросит символы, которые вы хотите вставить в каждую строку; отлично подходит для вставки определенного количества пробелов
  • C-x r k (kill-rectangle): удалить область прямоугольника; отлично подходит для удаления отступов

Вы также можете C-x r y (yank-rectangle), но это редко полезно.

4 голосов
/ 06 апреля 2010

indent-region сопоставленный с C-M-\ должен сделать трюк.

1 голос
/ 09 июля 2017

Я использую следующий фрагмент. На вкладке, когда выбор неактивен, он выравнивает текущую строку (как обычно); когда выбор неактивен, он выравнивает весь регион вправо.

(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 голос
/ 08 июля 2015

Я новичок в 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 строк и повторять вещи;)).

1 голос
/ 07 апреля 2010

Я использовал эту функцию для обработки отступов и отступов:

(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)))
0 голосов
/ 06 апреля 2010

Я делаю что-то подобное универсально

;; intent whole buffer 
(defun iwb ()
  "indent whole buffer"
  (interactive)
  ;;(delete-trailing-whitespace)
  (indent-region (point-min) (point-max) nil)
  (untabify (point-min) (point-max)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...