Я ищу, чтобы написать шаблон yasnippet, который позволит мне добавить заголовок лицензии в буфер сценария в Emacs. Любопытное нравится this, но немного улучшилась:комментарии в блочном стиле с yasnippet
- Заголовок должен включать для каждого пользователя данные, такие как имя дата и адрес электронной почты владельца авторских прав, , который может быть получен с embedded elisp expansion из yasnippet.
- Заголовок должен быть прокомментирован с синтаксисом в зависимости от режима программирования, в котором находится файл. Уже есть a gist of a snippet that does all that. В основном это сводится к вложению
(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))
в начале моего сниппет, но это ничего не изменило. Любые идеи о том, как получить прямоугольник box?
Edit: Мы a very nice answer, along with a proposed fix, (! Престижность & спасибо, Сейджи), но остается вопрос о том, как адаптировать его к случаю, когда один хотел бы повторно использовать поле, скажем, как повторное использование $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 чара слишком широкие. Трудно предсказать при написании шаблона, который должен быть удалить символов в этой строке. Возможно, повторное использование полей и правильное отступы слишком много для запроса одновременно. Кто-нибудь видит способ сделать это?
Спасибо за предложение «point-at-eol», оно полностью исправило проблему Последняя линия. ** Отличное ** объяснение, спасибо. Ваше исправление работает, но больно обобщать многие поля в строке (где вам нужно вручную подсчитать шаблон для каждого шаблона) и невозможно распространить на * повторное использование * поля $ 1 в другом месте шаблона (где вы бы необходимо ** удалить ** столько пробелов, сколько было сделано при создании встроенного lisp). Я подожду немного, и если никто не придумает решение для этого, я «приму» ваш ответ. – huitseeker
Я согласен, что мое решение для второй строки неоптимально. Было бы здорово, если бы «yas/after-exit-snipeet-hook» работал над текстом, который мы видим. Тем не менее, кажется, что крючок работает с базовым текстом (например, '$ {1: ...}'). Кстати, если вы установите крючок в '# expand-env', крючок влияет только на фрагмент, а не на другие фрагменты --- добавив' # expand-env: ((yas/after-exit-snippet-hook (list (let ((comment-style)) (comment-region (point-min) (point-max) nil))))) ' –