Pregunta:
Tengo una función Elisp que toma una cadena y la capitaliza ( capitalize
) y luego la inserta en un archivo. Aparentemente, el uso de capitalize
no considera la comilla simple como un "componente de la palabra" y, por lo tanto, obtengo resultados como "Soy un gato".
Entiendo que esto se debe a la tabla de sintaxis en su lugar. El valor predeterminado devuelto por (standard-syntax-table)
trata la cita como un "constituyente de palabra", así que supongo que la ejecución del código usa emacs-lisp-mode-syntax-table
que lo tiene de otra manera.
Intenté ejecutar capitalize
dentro with-temp-buffer
pero eso no funcionó por alguna razón.
Entonces mis preguntas son:
- ¿Las funciones que tengo en mi configuración usan
emacs-lisp-mode-syntax-table
cuando las llamo? - ¿Cuál es la forma estándar de lidiar con esto? ¿Cuál es una forma de aislar mis funciones de heredar todo este contexto? No quiero crear manualmente una nueva tabla y usar
with-syntax-table
para cada función en mi configuración o cambiar la tabla actual usandomodify-syntax-entry
, y quiero que mis cadenas se traten como oraciones normales en inglés.
Respuesta:
Dice que no quiere tener que "crear manualmente una nueva tabla y usar with-syntax-table
para cada función en mi configuración o cambiar la tabla actual usando modify-syntax-entry
".
Creo que tienes que hacer eso o darte una función más general que puedas aplicar para lograr lo mismo.
Aquí hay un comando en particular, solo para capitalizar la región de la manera que desee:
(defun my-capitalize-region (begin end)
"..."
(interactive "r")
(let ((s-table (copy-syntax-table)))
(modify-syntax-entry ?' "w" s-table)
(with-syntax-table s-table (capitalize-region begin end))))
Puede usar esencialmente el mismo código como ayudante, para aplicarlo a un comando, como capitalize-region
pasado como arg.
(defun with-word-apostrophe (command &rest args)
"..."
(let ((s-table (copy-syntax-table)))
(modify-syntax-entry ?' "w" s-table)
(with-syntax-table s-table (apply command args))))
(defun my-capitalize-region (begin end)
"..."
(interactive "r")
(with-word-apostrophe #'capitalize-region begin end))
No puede simplemente usar standard-syntax-table
, por ejemplo:
(defun with-word-apostrophe (command &rest args)
"..."
(with-syntax-table (standard-syntax-table) (apply command args)))
porque el apóstrofo tiene puntuación de sintaxis en la tabla de sintaxis estándar:
(aref (standard-syntax-table) ?') ; ==> (1), which means punctuation