自动删除智能报价


19

特别是当从Google文档之类的文本中复制文本时,我希望Emacs自动删除智能双引号,智能单引号以及各种形式的破折号和破折号字符,并用它们的ascii等效项替换它们。

有没有一种方法可以将Emacs配置为自动执行此操作?或者,除此以外,我可以调用的函数可以在缓冲区或区域上执行此操作?


1
我喜欢这个主意。过去,我曾经(occur "[^[:ascii:]]")在缓冲区中查找非ascii字符以进行手动清理,但是自动替换常用字符会很棒。
glucas 2014年

是否有任何地方可能列出所有“智能”字符及其ASCII等效项?
Jonathan Leech-Pepin

Answers:


16

基于SU:如何在复制粘贴中删除智能报价

您可以尝试以下操作:

(defcustom smart-to-ascii '(("\x201C" . "\"")
                ("\x201D" . "\"")
                ("\x2018" . "'")
                            ("\x2019" . "'")
                            ;; en-dash
                            ("\x2013" . "-")
                            ;; em-dash
                            ("\x2014" . "-"))
  ""
  :type '(repeat (cons (string :tag "Smart Character  ")
                       (string :tag "Ascii Replacement"))))

(defun replace-smart-to-ascii (beg end)
  (interactive "r")
  (format-replace-strings smart-to-ascii
                          nil beg end))

将其用作defcustom以允许添加/调整字符以匹配所需的字符。


那并不是真正的完整解决方案,unicode包含许多符号,每种符号分别用于各种类型的引号和破折号字符(例如,不间断的连字符\ u2011),并且它们有时会出现。我什至不确定随着unicode的增长,详尽的清单是否会随着时间的推移而详尽无遗。
Peteris 2014年

1
@Peteris假定该列表是最新的(将需要此列表/引用),它将长期运行。我的选择完全基于Lee H提到的那些。在这种情况下,我并不是要提供详尽的列表,而只是提供一个可以自定义以适合任何其他检索到的起点的起点。
Jonathan Leech-Pepin

替换列表中定义的任何字符后,您可以调用highlight-regexp以突出显示区域中所有剩余的非ASCII字符。
glucas 2014年

8

要添加到@Jonathan发布的内容,您可以通过执行以下操作使它自动执行(这样,yanking甚至不会添加这些字符):

(advice-add 'yank :after (lambda (&optional ignore)
                           (replace-smart-to-ascii (mark) (point)))
            '(name replace-smart))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.