Вопрос
Emacs Lisp имеет replace-string
но не имеет replace-char
.Я хочу заменить "типографские" фигурные кавычки (код Emacs для этого символа - шестнадцатеричный 53979) обычными кавычками ASCII, и я могу сделать это с помощью:
(replace-string (make-string 1 ?\x53979) "'")
Я думаю, что было бы лучше с replace-char
.
Каков наилучший способ сделать это?
Решение
Почему бы просто не использовать
(replace-string "\x53979" "'")
или
(while (search-forward "\x53979" nil t)
(replace-match "'" nil t))
как рекомендовано в документации для replace-string?
Другие советы
Именно так я заменяю символы в elisp:
(subst-char-in-string ?' ?’ "John's")
дает:
"John’s"
Обратите внимание, что эта функция не принимает символы в виде строки.Первый и второй аргументы должны быть буквальными символами (либо с использованием ?
обозначение или string-to-char
).
Также обратите внимание, что эта функция может быть разрушительной, если необязательный inplace
аргумент не равен нулю.
что, безусловно, было бы лучше с replace-char .Есть какой-нибудь способ улучшить мой код?
Действительно ли это медленно до такой степени, что это имеет значение?Мой elisp обычно смехотворно неэффективен, и я никогда этого не замечаю.(Однако я использую его только для инструментов редактирования, YMMV, если вы создаете с его помощью следующий MS live search.)
Кроме того, чтение документов:
This function is usually the wrong thing to use in a Lisp program.
What you probably want is a loop like this:
(while (search-forward "’" nil t)
(replace-match "'" nil t))
Этот ответ, вероятно, теперь имеет лицензию GPL.
А как насчет этого
(defun my-replace-smart-quotes (beg end)
"replaces ’ (the curly typographical quote, unicode hexa 2019) to ' (ordinary ascii quote)."
(interactive "r")
(save-excursion
(format-replace-strings '(("\x2019" . "'")) nil beg end)))
Как только у вас это появится в вашем dotemacs, вы можете вставить примеры кодов elisp (из блогов и т.д.) В свой буфер обмена, а затем сразу же нажать C-M-\ (для правильного отступа), а затем M-x my-replace-smart-quotes (для исправления интеллектуальных кавычек) и, наконец, C-x C-e (для запуска).
Я нахожу, что фигурная кавычка всегда имеет значение hexa 2019, вы уверены, что в вашем случае это 53979?Вы можете проверить символы в буфере с помощью C-u C-x =.
Я думаю, вы можете написать "’" вместо "\x2019" в определении my-replace-smart-quotes и все будет в порядке.Это просто на всякий случай.