我是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模式中缩进太多(尾部'}'缩进)而在基本模式下根本不会缩进。
处理此问题的正确方法是什么?
答案 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)))
此功能:
{}
块
在适当的地方,例如在)
之后。{}
并向后移动一个字符。
对数组和新式初始化很有用。这适用于C ++,我将缩进设置为4个空格, 以及Java,我有2个空格。