Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Emacs to indent (shift 4) code

Tags:

emacs

elisp

I edit my StackOverflow answers and questions with ViewSourceWith and Emacs. Often, I include code and StackOverflow formatting rules say that it must be indented by four spaces to be recognized as such. Doing it by hand or even with macros is painful.

I searched in SO's previous postings but found nothing.

Starting from the Python mode, I wrote:

(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)

It seems to work but I welcome advices, alternatives, bug reports, etc.

like image 745
bortzmeyer Avatar asked Feb 27 '09 09:02

bortzmeyer


1 Answers

C-x TAB runs indent-rigidly. Given a numerical argument of four it will do what you want. Alternatively use <pre><code> to introduce your code (see the first paragraph of Markdown Editing Help).

Edit: your interactive declaration would better be written:

(interactive "r
p")
like image 68
kmkaplan Avatar answered Oct 20 '22 11:10

kmkaplan