комментарии в стиле коробки с yasnippet - PullRequest
6 голосов
/ 30 декабря 2010

Я хочу написать шаблон yasnippet , который позволил бы мне добавить заголовок лицензии в буфер скриптов в Emacs. Вроде как это , но немного улучшилось:

  1. Заголовок должен включать данные для каждого пользователя, такие как имя даты и адрес электронной почты владельца авторских прав, который можно получить с помощью встроенного расширения elisp от yasnippet.
  2. Заголовок должен быть прокомментирован с помощью синтаксиса в зависимости от режима программирования, в котором находится файл. Уже есть Сущность фрагмента, который делает все это . По сути это означает встраивание (comment-region (point-min) (point)) в конец вашего фрагмента.
  3. Теперь Я хочу изменить стиль комментария на поле . Обратитесь к документации по 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 символов. Возможно, повторное использование полей и правильного отступа - слишком много, чтобы просить одновременно. Кто-нибудь видит способ сделать это, хотя?

Ответы [ 2 ]

5 голосов
/ 03 января 2011

Изменение вашего фрагмента на этот исправляет последнюю строку.

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-at-eol 0)))`

Обратите внимание, что между лицензией ("... разрешено") и встроенным кодом lisp emacs есть разрыв строки.

Что касается второй строки, я сначала объясню, почему это происходит, а затем предложу (некрасивое) исправление.Когда ваш фрагмент вставлен в файл, встроенные блоки lisp последовательно оцениваются от начала буфера до конца.В вашем фрагменте это означает, что (nth 5 (decode-time)) был заменен на 2011 при оценке следующего блока (comment-region ...).

В результате comment-region видит вторую строку как

Copyright (c) ${1:2011}

Итак, comment-region оставляет достаточно пробелов для этой строки.Затем механизм шаблонов преобразует ${1:2011} в 2011, и это преобразование сокращает строку на 5 символов.Это объясняет преждевременное появление *) на 5 символов во второй строке.

Один из способов исправить эту ситуацию - вернуть 5 пробелов после оценки comment-region --- Что-то вроде строки:

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-at-eol 0)))``
(replace-string "@" "      " nil (point-min) (point))`$0
1 голос
/ 03 января 2011

Это может быть полезным для вас:

# -*- mode: snippet -*-
# name: param
# key:  param
# --
m.parameter :${1:arg},${1:$(make-string (- 14 (string-width text)) ?\ 
                         )}:${2:type}$>

Используется зеркало с функцией для создания пробела позиционирования. Так что для вас это может означать что-то вроде этого:

(* Copyright (c) ${1:2011}${1:$(make-string (- 72 (string-width text)) ?\ )} *)
(* ${2}${2:$(make-string (- 72 (string-width text)))}*)

Другим вариантом может быть использование yas / after-exit-snippet-hook , но это устарело. (о, и я хотел отфильтровать текст самостоятельно, область комментария, которую вы уже пробовали, более умна. Попробуйте indent-region?)

...