Estoy buscando escribir una plantilla de yasnippet que me permita agregar un encabezado de licencia a un búfer de script en Emacs. Un poco como this, pero un poco mejorada:comentarios de estilo de caja con yasnippet
- La cabecera necesita incluir datos por usuario, tales como el nombre de la fecha y de correo electrónico del titular del copyright, que se puede obtener con embedded elisp expansion de yasnippet.
- El encabezado debe comentarse con una sintaxis según el modo de programación en el que se encuentre el archivo actualmente. Ya existe a gist of a snippet that does all that. Básicamente equivale a incrustar
(comment-region (point-min) (point))
al final de su fragmento. - Ahora, Quiero cambiar el estilo de comentario a un cuadro. Consulte la documentación de emacs para la variable
comment-style
o, si desea ver cómo se ve un comentario de estilo de cuadro, simplemente llame alM-x comment-box
en una región activa: Llama alcomment-region
con las opciones correctas.
Una primera aproximación de hacerlo es configurar el estilo modificando el final del fragmento anterior:
(let ((comment-style 'box))
(comment-region (point-min) (point)))
Por desgracia, la sangría se fastidien, y mi caja no es rectangular. Si comienzo del fragmento:
Copyright (c) ${1:`(nth 5 (decode-time))`}
All rights reserved.
Redistribution and use in source and binary forms, with or
without modification, are permitted`
(let ((comment-style 'box))
(comment-region (point-min) (point)))`
La expansión de ese fragmento "rompe la caja" (estoy de depuración este fragmento con la sintaxis de comentario ocaml, no que debe importar):
(**************************************************************)
(* Copyright (c) 2010 *)
(* All rights reserved. *)
(* *)
(* Redistribution and use in source and binary forms, with or *)
(* without modification, are permitted *)
(**************************************************************)
- Al principio pensé que la segunda línea estaba sangrada en función del tamaño del código incrustado de preexpansión, pero en ese caso, debería hacer que el final
*)
de esa línea venga 25 espacios demasiado pronto, no 4. - Si sangrado basado en no texto presente en el punto de inserción, el
*)
final debe llegar 4 espacios también tarde, no demasiado pronto. - Finalmente, no entiendo qué está pasando con la última línea, en la que hay sin expansión de código incrustado: Generalmente no tengo ningún problema para obtener un cuadro de comentario cuadrado de un párrafo con una última línea corta (ya sea usando
comment-box
, o la función elisp en el primero comentario de bloque de esta pregunta.
intenté hacer el comentario suceda después de la expansión fragmento, para evitar cualquier efecto secundario, añadiéndolo a yas/after-exit-snippet-hook
, en sustitución de la última función del fragmento anterior con:
(add-hook 'yas/after-exit-snippet-hook
(let ((comment-style 'box))
(comment-region (point-min) (point))) nil t)
Pero eso no ayudó. Incluso si lo hiciera, me dejaría un gancho de expansión que comentaría todos los los fragmentos que quisiera usar en ese búfer, algo que ciertamente no quiero.
También debo añadir que he tratado de establecer yas/indent-line
a fixed
, añadiendo
# expand-env: ((yas/indent-line 'fixed))
al comienzo de mi fragmento, pero eso no cambia nada. ¿Alguna idea sobre cómo obtener una caja rectangular?
Editar: Tenemos a very nice answer, along with a proposed fix, (! Kudos & gracias, Seiji), sino una cuestión que queda sobre la forma de adaptarlo al caso en que uno quiere reutilizar un campo, digamos como la reutilización de $1
en :
Copyright (c) ${1:`(nth 5 (decode-time))`}
All rights reserved.
Redistribution and use in $1, in source and binary forms
`(let ((comment-style 'box))
(comment-region (point-min) (point-at-eol 0)))`
En ese caso, las copias motor de la plantilla el valor (de longitud variable) obtenido para el campo $1
, a saber 2011
, a la última línea, en expansión plantilla (después de indentación), dando una línea de comentario 2 chara cters demasiado ancho. Resulta difícil predecir al escribir la plantilla que uno debe eliminar caracteres en esta línea. Quizás la reutilización de campo y la sangría correcta es demasiado pedir simultáneamente. ¿Alguien ve una manera de hacer esto, sin embargo?
Gracias por la sugerencia 'point-at-eol', solucionó completamente el problema del Última línea. ** Gran ** explicación, gracias. Su solución funciona, pero es doloroso generalizar a muchos campos en una línea (donde tiene que contar manualmente el modelo para cada plantilla) e imposible de extender a * reutilizar * del campo $ 1 en otro lugar en la plantilla (donde lo haría tiene que ** eliminar ** tantos espacios en blanco como se cree la evaluación del lisp incrustado). Voy a esperar un momento, y si nadie viene con una solución para eso, voy a "aceptar" tu respuesta. – huitseeker
Acepto que mi solución para la segunda línea no es óptima. Sería genial si 'yas/after-exit-snipeet-hook' funciona en el texto que vemos. Sin embargo, parece que el gancho funciona en el texto subyacente (por ejemplo, '$ {1: ...}'). Por cierto, si configura el gancho en '# expand-env', el gancho solo afecta al fragmento y no a otros fragmentos --- al agregar' # expand-env: ((yas/after-exit-snippet-hook list (let ((comment-style 'box)) (comment-region (point-min) (point-max) nil))))) ' –