Я хочу написать шаблон yasnippet , который позволил бы мне добавить заголовок лицензии в буфер скриптов в Emacs. Вроде как это , но немного улучшилось:
- Заголовок должен включать данные для каждого пользователя, такие как имя даты и адрес электронной почты владельца авторских прав,
который можно получить с помощью встроенного расширения elisp от yasnippet.
- Заголовок должен быть прокомментирован с помощью синтаксиса в зависимости от режима программирования, в котором находится файл. Уже есть Сущность фрагмента, который делает все это . По сути это означает встраивание
(comment-region (point-min) (point))
в конец вашего фрагмента.
- Теперь Я хочу изменить стиль комментария на поле . Обратитесь к документации по emacs для переменной
comment-style
, или, если вы хотите увидеть, как выглядит комментарий в виде блока, просто вызовите M-x comment-box
для активной области: он вызывает comment-region
с правильными параметрами.
Первый подход к этому - настроить стиль, изменив конец предыдущего фрагмента так:
(let ((comment-style 'box))
(comment-region (point-min) (point)))
К сожалению, отступы испорчены, и мой ящик не прямоугольный . Если я начну с фрагмента:
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)))`
Расширение этого фрагмента «разбивает окно» (я отлаживаю этот фрагмент с синтаксисом комментариев ocaml, не то чтобы это должно было иметь значение):
(**************************************************************)
(* Copyright (c) 2010 *)
(* All rights reserved. *)
(* *)
(* Redistribution and use in source and binary forms, with or *)
(* without modification, are permitted *)
(**************************************************************)
- Сначала я думал, что вторая строка имеет отступ с учетом размера встроенного кода перед расширением, но в этом случае он должен сделать так, чтобы окончательный
*)
этой строки пришел на 25 пробелов слишком рано, а не 4.
- Если с отступом на основе нет текста, присутствующего в точке встраивания, окончательный
*)
должен прибыть с 4 пробелами поздно , не слишком скоро .
- Наконец, я не понимаю, что происходит с последней строкой, в которой нет расширения встроенного кода : Обычно у меня нет проблем с получением квадратного комментария из абзаца с короткая последняя строка (либо с использованием
comment-box
, либо с помощью функции elisp в 1-м блоке комментариев этого вопроса.
Я попытался сделать комментарий после расширения фрагмента, чтобы избежать какого-либо побочного эффекта, добавив его к yas/after-exit-snippet-hook
, заменив последнюю функцию фрагмента выше на:
(add-hook 'yas/after-exit-snippet-hook
(let ((comment-style 'box))
(comment-region (point-min) (point))) nil t)
Но это не помогло. Даже если это произойдет, у меня останется ловушка расширения, которая комментирует все фрагменты, которые я хотел бы использовать в этом буфере, чего я определенно не хочу.
Я также должен добавить, что я пытался установить yas/indent-line
на fixed
, добавив
# expand-env: ((yas/indent-line 'fixed))
в начале моего фрагмента, но это ничего не изменило. Любые идеи о том, как получить прямоугольную коробку?
Редактировать: У нас есть очень хороший ответ вместе с предлагаемым исправлением, (слава и благодарность, Сейджи!), Но остается вопрос о том, как адаптировать его к случаю где можно повторно использовать поле, например, повторное использование $1
в:
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)))`
В этом случае механизм шаблонов копирует значение (переменной длины), полученное для поля $1
, а именно 2011
, в последнюю строку при раскрытии шаблона (после отступа), давая строку комментария 2 символа слишком широкий. При написании шаблона становится трудно предсказать, что в этой строке нужно удалить 4 символов. Возможно, повторное использование полей и правильного отступа - слишком много, чтобы просить одновременно. Кто-нибудь видит способ сделать это, хотя?