EMACS-DOCUMENT

=============>集思广益

format-spec

上周我正在编写Emacs-y的时候,突然发现需要一个类似 format 的函数. 它接受一个包含有控制码(比如%t%或者%h这样的东西),然后返回的字符串中那些控制码被实际内容所填充. 要编写这么个东西也不怎么难,不过我是在不想再重现造轮子(而且要把这个函数写好也可得花一番功夫呢). 我在help-gnu-emacs的邮件列表上求助, 结果被告知有一个 format-spec 函数. 该函数接受两个参数: 一个格式字符串,还有一个指代说明(它其实是一个alist用来将控制码映射成对应的值),下面是一个例子:

(format-spec "%n %v %p %o."
             '((?n . "A dog")
               (?v . "jumps")
               (?p . "over")
               (?o . "the fence")))
(format-spec "%n %v %o." '((?n . 7) (?v . 8) (?o . 9)))

值得注意的是,替代的值不一定必须是字符串 - 其他的对象也是可以的,但它们必须是可打印的,会用 (format "%s" ...) 来将其转换成字符串. 另外,你也可以指定任意的宽度和精度,还能指定是否左对齐(就像你在 (format "%s" ...) 中做的那样,这在format-spec中被称为underneath).

为了完整起见, 我还要提醒一下, 如果你要为 format-spec 的指代参数设置值的话,你需要用用反引号引起来,或者用 format-spec-make 函数创建一个指代列表.

再一次,我被Emacs的可配置性所折服了 – 我也好希望我的代码能跟Emacs的代码一样有那么强的可配置性.