Удаление умных цитат автоматически

19

Особенно при копировании текста из таких документов, как Google, я бы хотел, чтобы Emacs автоматически удалял умные двойные кавычки, умные одиночные кавычки и всевозможные символы em-dash и en-dash, заменяя их их эквивалентами ascii.

Есть ли способ настроить Emacs, чтобы сделать это автоматически? Или, если не считать этого, функцию, которую я могу вызвать, которая будет делать это в буфере или области?

Ли Х
источник
1
Мне нравится эта идея. Раньше я использовал (occur "[^[:ascii:]]")для поиска не-ascii символов в буфере для ручной очистки, но было бы неплохо автоматически заменить обычные.
glucas
Есть ли где-нибудь, что может перечислить все «умные» персонажи и их эквиваленты ascii?
Джонатан Лич-Пепин

Ответы:

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 для добавления / настройки символов в соответствии с желаемым.

Джонатан Лич-Пепин
источник
Это не будет полным решением, в Юникоде есть много символов, каждый для различных типов кавычек и черточко-подобных символов (например, неразрывный дефис \ u2011), и они все время от времени появляются. Я даже не уверен, что исчерпывающий список останется исчерпывающим со временем по мере роста юникода.
Петерис
1
@Peteris при условии, что список был актуален (потребуется список / ссылка на него), он будет работать в долгосрочной перспективе. Мой выбор был полностью основан на тех, что упоминал Ли Х. В этом случае я не пытался предоставить исчерпывающий список, просто отправную точку, которую можно настроить так, чтобы она подходила для любых других извлекаемых данных.
Джонатан Лич-Пепин
После замены любых символов, определенных в alist, вы можете вызвать, highlight-regexpчтобы выделить все оставшиеся не-ASCII символы в регионе.
glucas
8

Чтобы добавить к тому, что написал @Jonathan, вы можете сделать это автоматически (так, чтобы янки даже не добавляли эти символы в первую очередь), выполнив это:

(advice-add 'yank :after (lambda (&optional ignore)
                           (replace-smart-to-ascii (mark) (point)))
            '(name replace-smart))
Нарисовалась
источник