如何在elisp中获得可靠的缩进

时间:2013-09-22 05:46:51

标签: emacs elisp indentation auto-indent

我是Emacs的新手。

我正在尝试编写一个适用于所有模式的elisp函数。具体来说,我想编写一个插入大括号(有点像insert-parentheses)的函数,就像下面的键序列对只支持自动缩进的哑编辑器一样:

"{" <ret> "}" <up-arrow> <end> <ret> <tab>

此键序列适用于Java和C#(bsd)样式缩进。我需要它在所有支持emacs模式,以及纯文本文件中工作 - 我有其他格式没有emacs模式但仍然使用大括号。

这是我的第12次尝试:

(defun insert-braces-macro ()
  (interactive)
  (insert "{")
  (newline)
  (indent-relative t)
  (insert "}")
  (forward-line -1)
  (end-of-line)
  (newline)
  (indent-relative t)
  (indent-relative nil))

不幸的是,这不太正常。我不认为indent-relative是正确的函数,因为它没有以Java风格正确缩进:

f |

扩展为:

f {
  |
}

并以C模式:

somelongword another |

扩展为:

somelongword another {
             |
}

但是indent-according-to-mode也不正确,因为它会在C-ish模式中缩进太多(尾部'}'缩进)而在基本模式下根本不会缩进。

处理此问题的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

我认为

indent-according-to-mode是正确的答案,但您需要记住它无法预测未来,因此您需要在插入文本之后将其称为而不是之前:

(defun insert-braces-macro ()
  (interactive)
  (insert "{")
  (newline) (indent-according-to-mode)
  (save-excursion
    (newline)
    (insert "}")
    (indent-according-to-mode)))

答案 1 :(得分:1)

这是我长期以来一直在使用的东西:

(defun ins-c++-curly ()
  "Insert {}.
Treat it as a function body when from endline before )"
  (interactive)
  (if (looking-back "\\()\\|try\\|else\\|const\\|:\\)$")
      (progn
        (insert " {\n\n}")
        (indent-according-to-mode)
        (forward-line -1)
        (indent-according-to-mode))
    (insert "{}")
    (backward-char)))

此功能:

  1. 回顾时插入{}块 在适当的地方,例如在)之后。
  2. 否则,插入{}并向后移动一个字符。 对数组和新式初始化很有用。
  3. 这适用于C ++,我将缩进设置为4个空格, 以及Java,我有2个空格。