有没有人有一个Emacs宏来缩进(和unindenting)文本块?

时间:2009-04-24 19:04:13

标签: emacs lisp elisp

是否有人使用Emacs宏来缩进(和隐藏)文本块?

我的意思是在通常理解的意义上“缩进”,而不是在Emacspeak中。换句话说,我想标记一个区域,按C-u 2,运行这个宏,并在该区域的每一行之前添加两个空格。

或者在运行宏之前按C-u -2并从区域中每行的开头删除两个空格。如果线条没有足够的前导空格,则会引发奖励。

3 个答案:

答案 0 :(得分:12)

indent-rigidly(绑定到C-x TAB)可以满足您的需求。它位于indent.el中,它应该是标准emacs发行版的一部分。

另外,当某个地方没有足够的空白时让它抱怨/中止,你可以做这样的事情:(快速丑陋的原始缩进代码严重破解)

(defun enough-whitespace-to-indent-p (start end arg)
  (save-excursion
    (goto-char end)
    (setq end (point-marker))
    (goto-char start)
    (or (bolp) (forward-line 1))
    (while (and (< (point) end)
                (>= (+ (current-indentation) arg) 0))
      (forward-line 1))
    (>= (point) end)))

(defun indent-rigidly-and-be-picky (start end arg)
  (interactive "r\np")
  (if (or (plusp arg) (enough-whitespace-to-indent-p start end arg))
      (indent-rigidly start end arg)
(message "Not enough whitespace to unindent!")))

答案 1 :(得分:3)

还可以使用rectangles的世界。 要插入两个空格:

C-x r t SPC SPC RET

删除两个空格

C-x r d

前提是您已定义矩形以覆盖两个空格。在CUA包中还有一个很好的矩形编辑功能。 CUA包不仅仅包含矩形,所以如果您只想要矩形部分,请查看this description(完全披露,链接到我的博客)。

答案 2 :(得分:2)

默认使用indent-rigidly绑定到C-x TAB