遵守以下规范可让你的程序在 Emacs 中运行时融合得更自然。
next-line 或 previous-line;
几乎在所有场景下,forward-line 更便捷、更可预测且更健壮。See 按文本行移动。
特别地,避免使用以下函数:
beginning-of-buffer、end-of-buffer
replace-string、replace-regexp
insert-file、insert-buffer
若仅需移动光标、替换指定字符串或插入文件/缓冲区内容,而不需要面向交互用户的其他功能, 可用一两行简单 Lisp 代码替代这些函数。
向量适用于体积较大、随机访问(而非从前到后遍历)且无需插入删除元素的表结构(仅列表支持增删元素)。
message 函数,而非 princ。See 回显区。
error(或 signal)函数。
error 函数不会返回。See 如何发出错误信号。
不要使用 message、throw、sleep-for 或 beep 报告错误。
即使 debug-on-error 为 nil,有时告知用户错误发生位置也很有用。
此类情况下可在错误信息前添加小写的 Lisp 符号。
例如,错误信息 “无效输入(Invalid input)”可写为 “some-function: 无效输入”。
yes-or-no-p 或 y-or-n-p 在小缓冲中提问时,
应以大写字母开头并以 ‘?’ 结尾。
Enter the answer (default 42):
interactive 中,若使用 Lisp 表达式生成参数列表,
不要尝试为区域或位置参数提供正确默认值。
若参数未指定则传入 nil,并在函数体内为 nil 参数计算默认值。例如:
(defun foo (pos) (interactive (list (if specified specified-pos))) (unless pos (setq pos default-pos)) ...)
而不是:
(defun foo (pos)
(interactive
(list (if specified specified-pos
default-pos)))
...)
这样可保证重复执行命令时,会根据当前上下文重新计算默认值。
使用 ‘d’、‘m’、‘r’ 这类交互式声明时无需如此处理, 因为它们已做特殊处理,会在重复执行时重新计算参数。