6

Emacs Lisp 有replace-string但没有replace-char. 我想用常规的 ASCII 引号替换“印刷”大引号(这个字符的 Emacs 代码是十六进制 53979),我可以这样做:

(replace-string (make-string 1 ?\x53979) "'")

我认为它会更好replace-char

做这个的最好方式是什么?

4

4 回答 4

9

这是我在 elisp 中替换字符的方式:

(subst-char-in-string ?' ?’ "John's")

给出:

"John’s"

请注意,此函数不接受字符作为字符串。第一个和第二个参数必须是文字字符(使用?符号或string-to-char)。

inplace另请注意,如果可选参数为非零,则此函数可能具有破坏性。

于 2017-07-06T19:39:01.113 回答
7

为什么不直接使用

(replace-string "\x53979" "'")

或者

(while (search-forward "\x53979" nil t)
    (replace-match "'" nil t))

按照替换字符串的文档中的建议?

于 2008-09-18T21:37:44.690 回答
2

使用替换字符肯定会更好。有什么方法可以改进我的代码?

它真的慢到重要的程度吗?我的 elisp 通常效率低得可笑,我从来没有注意到。(不过,我只将它用于编辑器工具,如果您正在使用它构建下一个 MS 实时搜索,则为 YMMV。)

另外,阅读文档:

This function is usually the wrong thing to use in a Lisp program.
What you probably want is a loop like this:
  (while (search-forward "’" nil t)
    (replace-match "'" nil t))

这个答案现在可能是 GPL 许可的。

于 2008-09-18T08:55:04.413 回答
2

那这个呢

(defun my-replace-smart-quotes (beg end)
  "replaces ’ (the curly typographical quote, unicode hexa 2019) to ' (ordinary ascii quote)."
  (interactive "r")
  (save-excursion
    (format-replace-strings '(("\x2019" . "'")) nil beg end)))

一旦你在你的 dotmacs 中有了它,你可以将 elisp 示例代码(来自博客等)粘贴到你的暂存缓冲区,然后立即按 CM-\ (正确缩进),然后按 Mx my-replace-smart-quotes (修复智能引号),最后是 Cx Ce(运行它)。

我发现大引号总是 hexa 2019,你确定它是 53979 吗?您可以使用 Cu Cx = 检查缓冲区中的字符。

我认为您可以在 my-replace-smart-quotes 的定义中用 "'" 代替 "\x2019" 并且没问题。这只是为了安全起见。

于 2009-06-27T14:12:23.150 回答