Tự động xóa báo giá thông minh


18

Đặc biệt là khi sao chép văn bản từ những thứ như tài liệu của Google, tôi muốn Emacs tự động xóa dấu ngoặc kép thông minh, dấu ngoặc đơn thông minh và tất cả các kiểu ký tự em-dash và en-dash, thay thế chúng bằng các tương đương ascii của chúng.

Có cách nào để cấu hình Emacs để làm điều này tự động không? Hoặc, nói rằng, một chức năng mà tôi có thể gọi sẽ thực hiện nó trên bộ đệm hoặc vùng?


1
Tôi thích ý tưởng này. Trước đây, tôi đã từng (occur "[^[:ascii:]]")tìm thấy các ký tự không phải mã ascii trong bộ đệm để dọn dẹp thủ công, nhưng tự động thay thế các ký tự phổ biến sẽ rất tuyệt.
glucas

Có nơi nào có thể liệt kê tất cả các nhân vật 'thông minh' và tương đương ascii của họ không?
Jonathan Leech-Pepin

Câu trả lời:


15

Dựa trên SU: Cách xóa dấu ngoặc kép thông minh trong bản sao Dán

Bạn có thể thử một cái gì đó như sau:

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

Sử dụng nó như một tùy chọn để cho phép thêm / điều chỉnh các ký tự phù hợp với những gì mong muốn.


Đó thực sự không phải là một giải pháp đầy đủ, unicode có nhiều ký hiệu cho mỗi loại dấu ngoặc kép và ký tự giống như dấu gạch ngang (ví dụ: dấu gạch nối không phá vỡ \ u2011) và tất cả chúng thỉnh thoảng xuất hiện. Tôi thậm chí không chắc chắn nếu một danh sách đầy đủ sẽ duy trì đầy đủ theo thời gian khi unicode phát triển.
Peteris

1
@Peteris giả sử danh sách được giữ nguyên (sẽ cần một danh sách / tài liệu tham khảo như vậy) nó sẽ hoạt động lâu dài. Lựa chọn của tôi hoàn toàn dựa trên những gì mà Lee H đã đề cập. Tôi đã không cố gắng cung cấp một danh sách đầy đủ trong trường hợp này, chỉ đơn giản là một điểm khởi đầu có thể được tùy chỉnh để phù hợp với bất kỳ người nào khác được truy xuất.
Jonathan Leech-Pepin

Sau khi thay thế bất kỳ ký tự nào được xác định trong alist, bạn có thể gọi highlight-regexpđể tô sáng bất kỳ ký tự không phải ASCII nào còn lại trong vùng.
glucas

8

Để thêm vào những gì @Jonathan đã đăng, bạn có thể thực hiện điều đó tự động (để việc đánh cắp thậm chí không thêm các ký tự đó vào vị trí đầu tiên) bằng cách thực hiện điều này:

(advice-add 'yank :after (lambda (&optional ignore)
                           (replace-smart-to-ascii (mark) (point)))
            '(name replace-smart))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.