5

例如我的函数中的一行代码

 (message "char %c:%d" character count)

将打印每个字符的计数。对于不可打印的字符,例如换行符和制表符,我希望输出如下所示:

 \n:4
 \t:6

而不是逐字打印换行符和制表符。我怎样才能做到这一点?

4

3 回答 3

7

您可以通过在打印之前绑定某些变量来实现其中的一些

`print-escape-newlines' is a variable defined in `C source code'.
Its value is nil

Documentation:
Non-nil means print newlines in strings as `\n'.
Also print formfeeds as `\f'.

还有:

print-escape-nonascii
   Non-nil means print unibyte non-ASCII chars in strings as \OOO.

print-escape-multibyte
   Non-nil means print multibyte characters in strings as \xXXXX.

这些都适用于prin1,因此您可以使用%S格式中的代码。例如:

(let ((print-escape-newlines t))
  (format "%S" "new\nline"))
于 2013-07-20T23:55:20.237 回答
3

正如@wvxvw 所建议的那样

(defun escaped-print (c)
  (if (and (< c ?z)
           (> c ?A))
      (string c)
    (substring (shell-command-to-string (format "printf \"%%q\" \"%s\"" (string c)))
               2 -1)))

子字符串部分是从 printf 的输出中删除额外的内容。我对这个命令没有太多的了解,所以它可能不是完美无缺的。

于 2013-07-20T17:18:26.957 回答
1

emacs 中可能有一些代码可以为您执行此操作,但一种方法是编写一个将特殊字符转换为字符串的函数:

(defun print-char(c)
  (case c 
    (?\n "\\n")
    (?\t "\\t")
    (t (string c))))

请注意,您需要使用字符串格式而不是字符,因为您实际上是为每个特殊字符编写多个字符。

于 2013-07-20T06:28:19.223 回答