Объемный абзац 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

Делайте отступы в интерактивном режиме.

  1. Выберите регион для отступа.
  2. C-x TAB.
  3. Используйте стрелки (<- и ->) для интерактивного отступа.
  4. Нажмите 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)))