¿Reemplazar carbón en Emacs Lisp?
Pregunta
Emacs Lisp tiene replace-string
pero no tiene replace-char
.Quiero reemplazar las comillas "tipográficas" (el código de Emacs para este carácter es hexadecimal 53979) con comillas ASCII normales, y puedo hacerlo con:
(replace-string (make-string 1 ?\x53979) "'")
Creo que sería mejor con replace-char
.
¿Cuál es la mejor manera de hacer esto?
Solución
¿Por qué no simplemente usar
(replace-string "\x53979" "'")
o
(while (search-forward "\x53979" nil t)
(replace-match "'" nil t))
¿Como se recomienda en la documentación para reemplazar cadena?
Otros consejos
Así es como reemplazo los caracteres en elisp:
(subst-char-in-string ?' ?’ "John's")
da:
"John’s"
Tenga en cuenta que esta función no acepta caracteres como cadena.El primer y segundo argumento deben ser un carácter literal (ya sea usando el ?
notación o string-to-char
).
También tenga en cuenta que esta función puede ser destructiva si el opcional inplace
El argumento no es nulo.
lo que sin duda sería mejor con replace-char.¿Alguna forma de mejorar mi código?
¿Es realmente lento hasta el punto en que importa?Mi elisp suele ser ridículamente ineficiente y nunca me doy cuenta.(Sin embargo, solo lo uso para herramientas de edición, YMMV si estás creando la próxima búsqueda en vivo de MS con él).
Además, leyendo los documentos:
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))
Esta respuesta probablemente tenga ahora licencia GPL.
¿Qué pasa con esto?
(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)))
Una vez que tenga eso en su dotemacs, puede pegar códigos de ejemplo de elisp (de blogs, etc.) en su buffer temporal y luego presionar inmediatamente C-M-\ (para sangrar correctamente) y luego M-x my-replace-smart-quotes (para arreglar comillas tipográficas) y finalmente C-x C-e (para ejecutarlo).
Encuentro que la comilla rizada siempre es hexa 2019, ¿estás seguro de que es 53979 en tu caso?Puede verificar los caracteres en el búfer con C-u C-x =.
Creo que puedes escribir "’" en lugar de "\x2019" en la definición de my-replace-smart-comillas y estará bien.Es sólo para estar seguros.