Hacer que forward-sexp reconozca bloques definidos por palabras clave, no solo paréntesis

10

En un idioma (julia) que tiene bloques definidos por palabras clave como for..end, begin..endasí como paréntesis, ¿cuál es una buena manera de omitir dicho bloque? Además, endno es solo una palabra clave de bloque, sino también un identificador válido utilizado en otros lugares.

Una forma es buscar expresiones regulares de inicio / cierre de bloques y omitir todas las cadenas, comentarios y ends, etc., pero esto es algo ineficiente y un poco feo.

¿Hay alguna manera de hacer que el análisis de sintaxis propio de emacs reconozca tales palabras clave de bloque, de modo que forward/backward-sexpfuncione automáticamente, y para que uno pueda distinguir rápidamente el comienzo del bloque actual a partir de la salida de, por ejemplo syntax-ppss,?

[Nota: no me importa analizar el archivo yo mismo, pero en ese caso todavía me gustaría saber cómo se debe conectar mi analizador al resto de emacs.]

Kirill
fuente
1
Puedes ver ruby-modequé hace algo similar para el rubí. Otra opción es enganchar en smartparens , tiene una configuración especial para el modo rubí que puede usar como punto de partida
Iqbal Ansari

Respuestas:

9

Puede echar un vistazo a la biblioteca incorporada SMIE (significa Motor de sangría de mente simple). A pesar del nombre, la sangría es solo una de las características que proporciona. Este es el método utilizado por muchos modos (incluidos ruby-mode, mencionados en un comentario), para proporcionar movimiento sexp y sangría.

Implementar SMIE para un idioma es aproximadamente un trabajo de dos pasos:

  • defina la gramática para su idioma, junto con un token de identificación lexer;
  • definir reglas de sangría.

¡Para su propósito, solo se necesitará el primer paso!

En general, el analizador definido de esta manera se conecta muy bien a emacs. Por ejemplo, show-parensresaltará expresiones parecidas a paren definidas en la gramática SMIE (al menos en versiones recientes de emacs).

Tenga en cuenta que aún no podrá utilizar syntax-ppsspara obtener información sobre el entorno que lo encierra, ya que solo le dará el resultado del analizador de tabla de sintaxis. Pero las funciones de movimiento sexp (por ejemplo, up-listseguidas de backward-sexp) pueden ser un reemplazo.

T. Verron
fuente
2

Hice una biblioteca para esto

Una vez definido, hay un montón de comandos disponibles, que avanzan, retroceden, copian, etc.

Definiendo --en seudocódigo--:

(put 'MY-FORM 'beginning-op-at
           (lambda () MY-FORWARD-MOVE-CODE))

(put 'MY-FORM 'end-op-at
     (lambda () MY-BACKWARD-MOVE-CODE))

Cuando termine, debería estar disponible, es decir, copiado y devuelto de esta manera

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
Andreas Röhler
fuente