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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top