Removendo citações inteligentes automaticamente

19

Especialmente ao copiar texto de coisas como o Google Docs, eu gostaria que o Emacs removesse automaticamente aspas duplas inteligentes, aspas simples e todos os tipos de caracteres em-e-traço, substituindo-os por seus equivalentes ascii.

Existe uma maneira de configurar o Emacs para fazer isso automaticamente? Ou, descobrindo isso, uma função que posso chamar que fará isso no buffer ou na região?

Lee H
fonte
1
Eu gosto desta ideia. No passado, eu costumava (occur "[^[:ascii:]]")encontrar caracteres não-ascii em um buffer para limpeza manual, mas substituir automaticamente os comuns seria ótimo.
glucas
Existe algum lugar que possa listar todos os caracteres 'inteligentes' e seus equivalentes ascii?
Jonathan Sanguessuga-Pepin

Respostas:

16

Baseado em SU: Como remover aspas inteligentes na cópia Colar

Você pode tentar algo como o seguinte:

(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))

Usá-lo como um defcustom para permitir adicionar / ajustar caracteres para corresponder ao que é desejado.

Jonathan Leech-Pepin
fonte
Isso realmente não será uma solução completa, o unicode possui muitos símbolos para vários tipos de aspas e caracteres semelhantes a traços (por exemplo, hífen ininterrupto \ u2011) e todos aparecem ocasionalmente. Não tenho certeza se uma lista exaustiva permaneceria exaustiva ao longo do tempo à medida que o unicode cresce.
Peteris
1
@ Peter assumindo que a lista foi mantida atualizada (precisaria de uma lista / referência de tais), funcionaria a longo prazo. Minha seleção foi inteiramente baseada naquelas que Lee H mencionou. Eu não estava tentando fornecer uma lista exaustiva nesse caso, simplesmente um ponto de partida que poderia ser personalizado para se adequar a outras que são recuperadas.
Jonathan Sanguessuga-Pepin
Depois de substituir os caracteres definidos na lista, você pode chamar highlight-regexppara destacar os caracteres não ASCII restantes na região.
glucas
8

Para adicionar ao que o @ Jonathan postou, você pode fazer isso automaticamente (para que o arranque nem adicione esses caracteres em primeiro lugar) fazendo o seguinte:

(advice-add 'yank :after (lambda (&optional ignore)
                           (replace-smart-to-ascii (mark) (point)))
            '(name replace-smart))
Desenhou
fonte