Использование Emacs для отступа (сдвиг 4) кода

Я редактирую свои ответы и вопросы StackOverflow с помощью ViewSourceWith и Emacs. Часто я включаю код и правила форматирования StackOverflow говорят, что он должен иметь отступ в четыре пробела, чтобы его можно было распознать. Делать это вручную или даже с помощью макросов болезненно.

Я искал в предыдущих сообщениях SO, но ничего не нашел.

Начиная с режима Python, я написал:

(defun text-shift-region (start end count)
  "Indent lines from START to END by COUNT spaces."
  (save-excursion
(goto-char end)
(beginning-of-line)
(setq end (point))
(goto-char start)
(beginning-of-line)
(setq start (point))
(indent-rigidly start end count)))

(defun text-shift-region-right (start end &optional count)
  "Shift region of code to the right
   Stolen from python-mode.
   The lines from the line containing the start of the current region up
   to (but not including) the line containing the end of the region are
   shifted to the right, by `text-indent-offset' columns.

   If a prefix argument is given, the region is instead shifted by that
   many columns.  With no active region, indent only the current line."
  (interactive
   (let ((p (point))
     (m (mark))
     (arg current-prefix-arg))
 (if m
     (list (min p m) (max p m) arg)
   (list p (save-excursion (forward-line 1) (point)) arg))))
  (text-shift-region start end (prefix-numeric-value
              (or count text-indent-offset)))
  )

;; Code in StackOverflow must be marked by four spaces at the
;; beginning of the line
(setq text-indent-offset 4)
(global-set-key "\C-c>" 'text-shift-region-right)

Кажется, это работает, но я приветствую советы, альтернативы, сообщения об ошибках и т. Д.


person bortzmeyer    schedule 27.02.2009    source источник
comment
Я надеюсь получить альтернативы своему быстро приготовленному решению или получить интересные патчи.   -  person bortzmeyer    schedule 27.02.2009
comment
Кроме того, кажется, что это может помочь некоторым людям, поэтому я использую это как способ проверить, есть ли достаточно интереса, чтобы попросить где-нибудь документацию.   -  person bortzmeyer    schedule 27.02.2009
comment
Рискуя указать на очевидное, в редакторе уценки есть кнопка на панели инструментов (также клавиатура CTRL + K), которая отводит текст на 4 пробела.   -  person Jeff Atwood    schedule 27.02.2009
comment
Спасибо, но смысл в том, чтобы использовать Emacs, а не встроенный редактор (чтобы использовать все остальные функции Emacs).   -  person bortzmeyer    schedule 27.02.2009
comment
Вы просто копируете исходный код, выбираете исходный код и нажимаете кнопку кода / отступа. Как это больно?   -  person drby    schedule 27.02.2009
comment
@hackinwords: потому что, как я уже говорил несколько раз, я предпочитаю Emacs встроенному редактору SO.   -  person bortzmeyer    schedule 27.02.2009
comment
Может ли кто-нибудь изменить заголовок на что-то вроде Как добавить 4 пробела в начало каждой строки в emacs? Я думал, что этот вопрос касается M-x indent-region.   -  person Ryan C. Thompson    schedule 16.04.2010
comment
@bortzmeyer В качестве дополнительной заметки вы также можете использовать It's All Text для редактирования вопросов и ответов с помощью Emacs.   -  person N.N.    schedule 15.10.2012


Ответы (5)


C-x TAB запускает indent-rigidly. Если числовой аргумент равен четырем, он будет делать то, что вы хотите. В качестве альтернативы используйте ‹pre> ‹code>, чтобы представить свой код (см. Первый абзац справки по редактированию Markdown).

Изменить: ваше интерактивное объявление лучше было бы написать:

(interactive "r
p")
person kmkaplan    schedule 27.02.2009
comment
C-x TAB требует, чтобы регион был отмечен. Код режима Python, который я украл, работает с регионом, если он есть, или с текущей строкой. - person bortzmeyer; 27.02.2009
comment
Вы имеете в виду активный. Обычно отступ одной строки на 4 не требует конкретной привязки. C-ПРОСТРАНСТВО КОСМОС КОСМИЧЕСКОЕ ПРОСТРАНСТВО. - person kmkaplan; 27.02.2009
comment
Что ж, я все еще предпочитаю свой метод, но эти два решения тоже хороши. Принятый. - person bortzmeyer; 01.03.2009
comment
YMMV, но я всегда считал, что набирать C-x C-i легче, чем C-x TAB. (TAB и C-i (обычно) одно и то же.) - person phils; 09.12.2011
comment
Удивительно, но если вы хотите убрать отступ, C-u -4 C-x TAB делает то, что нужно. Woohoo! - person Daniel; 05.12.2013

Еще один простой способ сделать это - использовать мощную возможность редактирования прямоугольников в emacs: установите регион, начиная с начала первой строки и заканчивая началом последней строки, в которой вы хотите сделать отступ (примечание: it имеет быть в начале строки, так как вы не хотите заменять существующий текст!), затем выполните

C-x r t (string-rectangle)

Затем просто введите 4 пробела в соответствии с запросом. Вуаля! Никакого дополнительного взлома шепелявых не требуется. Это дополнительно дает вам возможность вставлять другие элементы помимо пробелов в начало или в любое место в середине группы строк.

person polyglot    schedule 27.02.2009
comment
Еще более простая команда - Cx ro, open-rectangle, при условии, что первая или последняя строка области имеет длину не менее четырех символов: поместите любой конец области на четыре символа в строку, а другой - в начало строку и введите Cx r o. - person Jouni K. Seppänen; 18.04.2009

Использование C-x TAB для жесткого отступа (как упоминалось в другом ответе) - самый простой способ. Просто отметьте область, в которой вы хотите сделать отступ, и нажмите C-u C-x TAB. Поскольку по умолчанию для C-u используется префикс 4, это должно делать именно то, что вы хотите.

person Juan Garcia    schedule 27.02.2009

Мне нравится ваш код. Я думаю, что переустановка end в text-shift-region не нужна, но в остальном все выглядит нормально.

person Joe Casadonte    schedule 27.02.2009

В режиме Python вы можете отметить область (C-space, переместить курсор) и нажать C-c > для отступа 4 места.

person akaihola    schedule 08.12.2011