如何在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代码中,似乎不可能直接从那里获得该功能。谢谢,但这并不理想。除了换行符和制表符之外,可能还有更多的特殊字符。在函数中列出它们会很痛苦。