Menghapus kutipan pintar secara otomatis

19

Terutama ketika menyalin teks dari hal-hal seperti Google docs, saya ingin Emacs secara otomatis menghapus tanda kutip ganda cerdas, tanda kutip tunggal pintar, dan segala macam karakter em-dash dan en-dash, menggantinya dengan padanan ascii mereka.

Apakah ada cara untuk mengkonfigurasi Emacs untuk melakukan ini secara otomatis? Atau, kalau tidak, fungsi yang bisa saya panggil yang akan melakukannya di buffer atau wilayah?

Lee H
sumber
1
Aku suka ide ini. Di masa lalu saya sudah terbiasa (occur "[^[:ascii:]]")menemukan karakter non-ascii di buffer untuk pembersihan manual, tetapi secara otomatis mengganti yang umum akan lebih bagus.
glucas
Adakah di mana saja yang mungkin mendaftar semua karakter 'pintar' dan padanan ascii mereka?
Jonathan Leech-Pepin

Jawaban:

16

Berdasarkan SU: Cara menghapus kutipan pintar di copy Tempel

Anda dapat mencoba sesuatu seperti berikut ini:

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

Menggunakannya sebagai defcustom untuk memungkinkan penambahan / penyesuaian karakter agar sesuai dengan apa yang diinginkan.

Jonathan Leech-Pepin
sumber
Itu tidak akan benar-benar solusi lengkap, unicode memiliki banyak simbol masing-masing untuk berbagai jenis tanda kutip dan karakter seperti-dash (mis. Non-breaking hyphen \ u2011) dan semuanya kadang-kadang muncul. Saya bahkan tidak yakin apakah daftar lengkap akan tetap lengkap seiring berjalannya waktu seiring meningkatnya kode unicode.
Peteris
1
@Peteris dengan asumsi bahwa daftar itu tetap aktual (akan membutuhkan daftar / referensi semacam itu) itu akan bekerja dalam jangka panjang. Pilihan saya sepenuhnya didasarkan pada apa yang disebutkan Lee H. Saya tidak berusaha memberikan daftar lengkap dalam hal ini, hanya titik awal yang dapat disesuaikan agar sesuai dengan yang lain yang diambil.
Jonathan Leech-Pepin
Setelah mengganti karakter apa pun yang didefinisikan dalam daftar, Anda dapat memanggil highlight-regexpuntuk menyoroti karakter non-ASCII yang tersisa di wilayah tersebut.
glukas
8

Untuk menambahkan apa yang diposkan @Jonathan, Anda dapat membuatnya secara otomatis (sehingga mencabut bahkan tidak menambahkan karakter itu di tempat pertama) dengan melakukan ini:

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