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的代码一样有那么强的可配置性.