En un idioma (julia) que tiene bloques definidos por palabras clave como for..end
, begin..end
así como paréntesis, ¿cuál es una buena manera de omitir dicho bloque? Además, end
no 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 end
s, 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-sexp
funcione 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.]
ruby-mode
qué 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 partidaRespuestas:
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:
¡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-parens
resaltará 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-ppss
para 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-list
seguidas debackward-sexp
) pueden ser un reemplazo.fuente
Hice una biblioteca para esto
Una vez definido, hay un montón de comandos disponibles, que avanzan, retroceden, copian, etc.
Definiendo --en seudocódigo--:
Cuando termine, debería estar disponible, es decir, copiado y devuelto de esta manera
fuente