Делаем свои шаблоны 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