Ответ 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.