Делаем свои шаблоны Erlang модулей для Emacs
12 июня 2012
erlang-mode для Emacs включает довольно приличный набор шаблонов. Попробуйте выполнить Meta-X tempo-temp Tab Tab
, и увидите что их там 23 штуки.
Но с ними связаны некоторые неудобства. Во-первых, довольно громоздкий способ вызова (впрочем, это можно обернуть в свою функцию, с более лаконичным именем). Во-вторых, сами шаблоны трудно модифицировать и добавлять (они определены здесь: /usr/lib/erlang/lib/tools-2.6.6.3/emacs/erlang_appwiz.el
). А хотелось бы, чтобы каждый шаблон был определен в отдельном файле и был удобен для модификаций.
К счастью, при некотором знании elisp Emacs позволяет сделать все так, как нам хочется :) Для начала определимся, где мы будем их хранить. Например тут: ~/emacs.d/tpl
. И положим туда, например, шаблон Erlang-модуля:
-module(module_tpl). -author('Vasja Pupkin <pupkin@somewhere.com>'). -export([]). %%% module API
Или вот такой шаблон для gen_server. Или вот такой шаблон для supervisor.
Затем определим где-нибудь (например в ~/.emacs.d/init.el
) функцию на elisp, которая будет копировать нужный файл в проект и модифицировать его соотвественно указанному имени. Много кода не понадобится :)
(defun erl-new-file (module-name tpl-file) (setq new-file (format "%s.erl" module-name)) (copy-file tpl-file new-file) (switch-to-buffer (find-file new-file)) (search-forward "(") (setq begin (point)) (search-forward ")") (backward-char) (kill-region begin (point)) (insert module-name))
Но использовать эту функцию напрямую неудобно, ибо придется прописывать полный путь к шаблону. Я вот даже не делал ее интерактивной. Мне кажется, лучше на каждый шаблон сделать отдельную функцию, которая запросит у пользователя только имя модуля, а где искать шаблон она будет знать сама.
(defun erl-new-module (module-name) (interactive "MModule name:") (erl-new-file module-name "~/.emacs.d/tpl/module_tpl.erl")) (defun erl-new-supervisor (module-name) (interactive "MModule name:") (erl-new-file module-name "~/.emacs.d/tpl/supervisor_tpl.erl")) (defun erl-new-gen-server (module-name) (interactive "MModule name:") (erl-new-file module-name "~/.emacs.d/tpl/gen_server_tpl.erl"))
Ну вот, теперь, если нам нужно создать в проекте новый модуль gen_server, то мы вызываем Meta-X erl-new-gen Tab
, указываем имя модуля, и он создается из шаблона и открывается у нас в редакторе.
Очевидно, тут речь идет о создании новых модулей, а не о вставке шаблонов кода в уже существующие файлы. Это тоже сделать не сложно, но я пока не делал :)
comments powered by Disqus