如何在emacs lisp中打印特殊字符

如何在emacs lisp中打印特殊字符,emacs,elisp,Emacs,Elisp,例如,函数中的一行代码 (message "char %c:%d" character count) 将打印每个字符的计数。对于不可打印的字符,如换行符和制表符,我希望输出如下所示: \n:4 \t:6 而不是逐字打印换行符和制表符。我怎样才能做到这一点?emacs中可能有一些代码可以为您做到这一点,但一种方法是编写一个函数,将特殊字符转换为字符串: (defun print-char(c) (case c (?\n "\\n") (?\t "\\t")

例如,函数中的一行代码

 (message "char %c:%d" character count)
将打印每个字符的计数。对于不可打印的字符,如换行符和制表符,我希望输出如下所示:

 \n:4
 \t:6

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

emacs中可能有一些代码可以为您做到这一点,但一种方法是编写一个函数,将特殊字符转换为字符串:

(defun print-char(c)
  (case c 
    (?\n "\\n")
    (?\t "\\t")
    (t (string c))))
请注意,您需要使用字符串格式而不是字符格式,因为您实际上为每个特殊字符编写了多个字符。

正如@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)))
(取消转义打印(c)
(如果(和(c?A))
(字符串c)
(子字符串(shell命令转换为字符串(格式为“printf\”%%q\“\%s\”(字符串c)))
2 -1)))
子字符串部分是从printf的输出中删除额外的内容。我对这个命令不太了解,所以它可能不是完美的。

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

`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
格式的代码。e、 g:

(let ((print-escape-newlines t))
  (format "%S" "new\nline"))

我认为Emacs永远不会以这种方式逃避角色。我只见过使用八进制代码。无论如何,我认为您可以在Bash中使用`printf“%q”来实现这一点。因此,您可以调用shell命令-这是否是一个好的解决方案取决于您需要它的情况。任何其他方法都可以-只是不要逐字打印它们。这将是令人惊讶的是,emacs没有一个内置的方式来做到这一点…嗯。。。现在,我试图找到Emacs在哪里进行这种转换,这一切都深入到了C代码中,似乎不可能直接从那里获得该功能。谢谢,但这并不理想。除了换行符和制表符之外,可能还有更多的特殊字符。在函数中列出它们会很痛苦。