GNU Emacs: skeleton-mode, он все еще используется?

учитывая все возможные решения о создании системы шаблонов с GNU Emacs, что люди сегодня используют? Я все еще использую режим скелета, но, читая его здесь и там, мы должны быть очень немногими, чтобы сделать это.

Что вы используете и почему? (возможно, я мог бы переключиться на более популярный инструмент).

Например, с учетом этого фрагмента:

(define-skeleton mwe:cl-defpackage-skeleton
  "Inserts a Common Lisp DEFPACKAGE skeleton."
  (skeleton-read "Package: " (if v1
                                 (file-name-sans-extension
                                  (file-name-nondirectory
                                   (buffer-file-name)))))
  (if (setq v1 (bobp)) ";;; -*- Mode:Lisp; Syntax:ANSI-Common-Lisp;")
  & (if buffer-file-coding-system
        (concat " Coding:"
                (symbol-name 
                 (coding-system-get buffer-file-coding-system 
                                    'mime-charset))))
  & " -*-"
  & \n
  & \n "(defpackage #:" str
  \n "(:nicknames" ("Nickname: " " #:" str) & ")" | '(kill-whole-line -1)
  \n "(:use #:CL" ((slime-read-package-name "USEd package: ") " #:" str) ")"
  ")" \n
  \n
  (if v1 "(in-package #:") & str & ")" & \n &
  \n
  _)

(кредиты: http://www.foldr.org/~michaelw/log/programming/lisp/defpackage-skeleton)

который (современный) режим шаблона мог бы сделать то же самое (и как;))?

Приветствия

Ответы

Ответ 1

Я использую yasnippet.

В моих emacs у меня есть это:

(require 'yasnippet-bundle)

В моем приложении для каждого режима, где я хочу использовать фрагменты (например, мой c-mode hook и т.д.), у меня есть это:

(yas/minor-mode-on)

"Статические" фрагменты, которые я использую, доступны в структуре каталогов, которые я использую, здесь:

http://cheeso.members.winisp.net/srcview.aspx?dir=emacs&file=snippets.zip

Вам нужно создать упомянутый выше файл bundle.el, один раз, когда любой из фрагментов изменится. сделайте это так:

(require 'yasnippet)
(yas/compile-bundle 
 ; the starting point
 "c:/your/path/yasnippet.el"

 ; the bundle file to generate
 "c:/your/path/yasnippet-bundle.el" 

 ; the snippet dir from which to generate the bundle
 "c:/your/path/snippets")

Что это!

Затем, когда я нахожусь в файле С# и набираю for<TAB>, я получаю шаблон с циклом for. И так далее.


Я также использую yasnippet с динамическими шаблонами шаблонов. Модуль завершения кода С# я написал вызовы yas/expand-snippet с динамически построенной строкой, которая определяет шаблон для расширения.

Итак, вы можете ввести

  MyType.Method(<COMPLETE>

... где <COMPLETE> - это ключ завершения кода, а модуль завершения кода выполняет поиск в MyType.Method(затем строит меню вариантов и выталкивает его. Когда пользователь выбирает выбор из меню, модуль завершения кода строит шаблон, содержащий поля для каждого из аргументов для выбранного метода. Затем он вызывает yas/expand-snippet, и этот шаблон вводится в буфер, как если бы это был статический шаблон В динамически сгенерированном шаблоне каждый аргумент метода получает поле "typeover", и я просто заполняю его, набирая поля. Довольно приятно.

Эта идея "динамического фрагмента" будет работать с любым механизмом завершения кода. Вам просто нужен способ для отображения из метода или сигнатуры функции, например:

  function(int arg1, string arg2, char arg3)

в строку определения шаблона yasnippet, которая выглядит следующим образом:

  function(${1:int arg1}, ${2:string arg2}, ${3:char arg3}) 

И это довольно тривиальная часть elisp.

Ответ 2

Я не использовал режим скелета много, но я использую YASnippet во время кодирования в Ruby и C. Его довольно полезно, но я подозреваю, что режим скелета намного эффективнее.

Ответ 3

В emacs wiki перечислены Yasnippet как возможная замена скелета. Фрагменты, которые поставляются с yasnippet, довольно хороши, но вы действительно должны писать свои собственные, поскольку там находится истинная сила.