syntax-table – ¿Cómo usar una tabla de sintaxis particular con funciones arbitrarias?

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 usando modify-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

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım