【发布时间】:2013-09-22 05:46:51
【问题描述】:
我是 Emacs 新手。
我正在尝试编写一个适用于所有模式的 elisp 函数。具体来说,我想编写一个插入大括号的函数(有点像insert-parentheses),就像下面的键序列对只支持自动缩进的愚蠢编辑器所做的一样:
"{" <ret> "}" <up-arrow> <end> <ret> <tab>
此键序列适用于 Java 和 C# (bsd) 样式的缩进。我需要它在所有大括号-y 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 模式下会缩进太多(尾部的 '}' 是缩进的),而在基本模式下则完全不行。
处理这个问题的正确方法是什么?
【问题讨论】:
-
是不是因为不同的模式有不同的默认缩进,除非用户特别设置?
(defun my-tabset-hook () (setq indent-tabs-mode t) (setq tab-stop-list (number-sequence 2 200 2)) (setq tab-width 2) (setq indent-line-function 'insert-tab) ) (add-hook 'text-mode-hook 'my-tabset-hook) (add-hook 'tex-mode-hook 'my-tabset-hook) (add-hook 'LaTeX-mode-hook 'my-tabset-hook)
标签: emacs elisp indentation auto-indent