Emacs lisp; how to make a string from a variable o

2019-06-23 19:29发布

Like error messages for wrongly called functions show, eg.:

(message (file-attributes "."))

Produces the message:

"eval: Wrong type argument: stringp, ("/home14/tjones" 1 0 0 (20415 35598) (20211 19255) (20211 19255) 14 "lrwxrwxrwx" t ...)"

How do you do this type of translation intentionally, eg.:

(message (thing-to-string (file-attributes ".")))

To message something like:

("/home14/tjones" 1 0 0 (20415 35598) (20211 19255) (20211 19255) 14 "lrwxrwxrwx" t ...)

This is for debugging/info only. I'm assuming there's a way as message is doing it, but is this exposed to us users?

标签: elisp
3条回答
再贱就再见
2楼-- · 2019-06-23 20:00

In your example, message did not do anything (it just refused to run), so the translation to string was done by the read-eval-print loop which caught the error and turned it into a text message. But yes, message can also do that, and it does that by calling format, which internally uses things like prin1-to-string. So (format "%S" <foo>) would do your thing-to-string.

查看更多
劳资没心,怎么记你
3楼-- · 2019-06-23 20:22

Look into prin1-to-string and related functions (prin1, princ, etc). And do try the manual! http://www.gnu.org/software/emacs/manual/html_node/elisp/Output-Functions.html

查看更多
Emotional °昔
4楼-- · 2019-06-23 20:23

The first argument to message is supposed to be a format string (same as the one you pass to the format function. If you give it the format "%s" (or "%S" as in Stefan's answer.) it will stringify anything you give it as the next argument.

The capital S version will escape characters in the string so that it can be read again as an s-expression. In this case, I think that is what you want. So, you don't need to change your code very much to get what you are looking for:

(message "%S" (file-attributes "."))
查看更多
登录 后发表回答