Emacs массовый отступ для Python

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

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

126
задан Vernon 6 April 2010 в 14:26
поделиться

5 ответов

Если вы программируете Python с помощью Emacs, вам, вероятно, следует использовать режим python. В режиме Python после маркировки блока кода

Cc> или Cc Cl сдвигает область на 4 пробела вправо

Cc < или Cc Cr сдвигает область на 4 пробела влево

Если вам нужно сдвинуть код на два уровня отступа или на произвольную величину, вы можете префикс команды с аргументом:

Cu 8 Cc> сдвигает область 8 пробелов вправо

Cu 8 Cc < сдвигает область 8 пробелов влево

Другой альтернативой является использование Mx с жестким отступом , который привязан к Cx TAB :

Cu 8 Cx TAB сдвигает область на 8 позиций вправо

Cu -8 Cx TAB сдвигает область на 8 позиций влево

Также полезны команды прямоугольника , которые работают с прямоугольниками текста вместо строк текста.

Например, после маркировки прямоугольной области

Cx ro вставляет пустое пространство для заполнения прямоугольной области (эффективно сдвигая код вправо)

Cx rk уничтожает прямоугольную область (эффективно сдвиг кода влево)

Cx rt запрашивает строку, которой нужно заменить прямоугольник. При вводе C-u 8 <пробел> будет введено 8 пробелов.

PS. В Ubuntu, чтобы сделать режим python режимом по умолчанию для всех файлов .py, просто установите пакет python-mode .

202
ответ дан 24 November 2019 в 00:53
поделиться

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

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

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

8
ответ дан 24 November 2019 в 00:53
поделиться

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

(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)))
1
ответ дан 24 November 2019 в 00:53
поделиться

Я делаю что-то подобное повсеместно

;; 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
ответ дан 24 November 2019 в 00:53
поделиться

indent-region , отображаемая в C-M - \ , должна помочь.

3
ответ дан 24 November 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: