使用Emacs进行代码缩进(shift 4)

13

我使用ViewSourceWith和Emacs编辑我的StackOverflow答案和问题。经常我会包含代码,而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)

看起来它可以工作,但我欢迎建议、替代方案、错误报告等。


谢谢,但重点是要使用Emacs,而不是内置编辑器(为了使用Emacs的所有其他功能)。 - bortzmeyer
你只需要复制源代码,选择源代码并点击代码/缩进按钮。这有什么痛苦的呢? - drby
3
正如我多次所说的那样,我更喜欢使用Emacs而不是Stack Overflow内置的编辑器。 - bortzmeyer
有人可以把标题改成类似于“如何在emacs中每行开头添加4个空格”吗?我以为这个问题是在问M-x indent-region - Ryan C. Thompson
@bortzmeyer 作为旁注,你也可以使用 It's All Text 来使用 Emacs 编辑问题和答案。 - N.N.
显示剩余3条评论
5个回答

14

C-x TAB 运行 indent-rigidly。 如果给出数字参数为四,则会执行您想要的操作。 或者使用<pre><code>引入您的代码(请参阅Markdown编辑帮助的第一段)。

编辑:您的交互式声明最好写成:

(interactive "r
p")

C-x TAB 需要标记区域。我抄袭的 Python-mode 代码,如果有区域,则在该区域上工作,否则在当前行上工作。 - bortzmeyer
你的意思是激活状态。通常单独将一行缩进4个空格并不需要特定的绑定键。可以使用C-a SPACE SPACE SPACE SPACE实现。 - kmkaplan
嗯,我仍然更喜欢我的方法,但这两种解决方案也不错。已接受。 - bortzmeyer
可能因人而异,但我一直觉得C-x C-iC-x TAB更容易打。(TABC-i通常是相同的。) - phils
令人惊讶的是,如果你想要取消缩进,C-u -4 C-x TAB 就能做到。哇哦! - Daniel

12
另一种简单的方法是利用Emacs强大的矩形编辑功能:从第一行开头开始设置您的区域,并以您想要缩进的最后一行的开头结束(注意:它必须在行的开头,因为您不想替换现有文本!),然后执行。
C-x r t (string-rectangle)

然后只需按提示输入4个空格。大功告成!无需额外的Lisp编程。这还为您提供了灵活性,使您能够在一堆行首或任何中间插入其他内容。


2
一个更简单的命令是C-x r o,打开矩形区域,假设区域的第一行或最后一行至少有四个字符长:将区域的任一端点定位到行中的前四个字符或后四个字符,另一端点定位到该行的开头,然后键入C-x r o。 - Jouni K. Seppänen

8

使用C-x TAB进行刚性缩进(如另一个答案中所提到的)是最简单的方法。只需标记要缩进的区域,然后按C-u C-x TAB。由于C-u的默认前缀为4,因此这应该正好符合您的要求。


1

你的代码看起来很好。我认为在text-shift-region中重新设置end并不必要,但除此之外,它看起来很好。


1
python-mode中,您可以标记一个区域(C-space,移动光标),然后按下C-c >以缩进4个空格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接