例如,一行代碼在我的功能如何打印特殊字符中的Emacs Lisp
(message "char %c:%d" character count)
將打印計數的每個字符。對於非打印字符,如換行和標籤,我想輸出的樣子:的
\n:4
\t:6
,而不是打印換行和標籤字面上。我怎樣才能做到這一點?
例如,一行代碼在我的功能如何打印特殊字符中的Emacs Lisp
(message "char %c:%d" character count)
將打印計數的每個字符。對於非打印字符,如換行和標籤,我想輸出的樣子:的
\n:4
\t:6
,而不是打印換行和標籤字面上。我怎樣才能做到這一點?
有可能在Emacs的一些代碼的地方,可以爲你做這一點,但一個方法是編寫特殊字符轉換爲字符串的函數:
(defun print-char(c)
(case c
(?\n "\\n")
(?\t "\\t")
(t (string c))))
請注意,您需要使用字符串格式而不是字符,因爲您實際上是爲每個特殊字符寫入多個字符。
謝謝,但它並不理想。除了換行符和製表符之外,可能會有更多特殊字符。將它們全部列在函數中將會很痛苦。 – RNA
至於建議的@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的輸出切出多餘的東西。我對這個命令並不瞭解,所以它可能並不完美。
您可以通過在打印之前綁定某些變量來實現的某些。
`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"))
我不認爲Emacs會以這種方式逃脫字符。我只看到它使用八進制代碼。無論如何,我認爲你可以在Bash中用'printf「%q」來做到這一點。所以你可以調用shell命令 - 這是否是一個好的解決方案,真正取決於你需要的情況。 – 2013-07-20 07:26:09
任何其他方式都很好 - 只是不要直接打印它們。 emacs沒有內置的方法來做到這一點是令人驚訝的...... – RNA
嗯......現在我試圖找到Emacs在做這種轉換的地方,這一切都深入到C代碼中,而且它看起來並不像可以直接從那裏獲得該功能。 – 2013-07-20 17:04:31