Emacs config utilizing prelude as a base
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1345 lines
45 KiB

  1. ;;; -*- Emacs-Lisp -*-
  2. ;;; File: erlang_appwiz.el
  3. ;;; Author: Johan Bevermyr
  4. ;;; Created: Tue Dec 9 13:14:24 1997
  5. ;;; Purpose: Adds a simple application wizard to erlang.el.
  6. ;; OBS! Must be loaded before the erlang.el file is loaded.
  7. ;; Add the following to your .emacs file before erlang.el is loaded.
  8. ;;
  9. ;; (load "erlang_appwiz" t nil)
  10. ;;
  11. ;; Customisation of makefile generation:
  12. ;;
  13. ;; The templates for generating makefiles are stored in the
  14. ;; variables erlang-skel-makefile-src and erlang-skel-makefile-middle.
  15. ;;
  16. ;; These can be modified by setting the variables before or after this
  17. ;; file is loaded.
  18. ;;
  19. ;; For example, to generate OTP-style make files:
  20. ;;
  21. ;;
  22. ;;(defvar erlang-skel-makefile-src
  23. ;; '((erlang-skel-include erlang-skel-nomodule-header)
  24. ;; "CC_ROOT := $(shell pwd | sed 's/erts.*$$//')" n
  25. ;; "AUTOCONF := $(CC_ROOT)/erts/autoconf" n
  26. ;; "TARGET := $(shell $(AUTOCONF)/config.guess)"
  27. ;; "include $(CC_ROOT)/internal_tools/make/$(TARGET)/otp.mk" n
  28. ;; n
  29. ;; "# ----------------------------------------------------" n
  30. ;; "# Application version " n
  31. ;; "# ----------------------------------------------------" n
  32. ;; "include ../vsn.mk" n
  33. ;; "VSN=$(KERNEL_VSN)" n
  34. ;; n
  35. ;; "# ----------------------------------------------------" n
  36. ;; "# Release directory specification" n
  37. ;; "# ----------------------------------------------------" n
  38. ;; "RELEASE_PATH= ../../../release/$(TARGET)" n
  39. ;; "RELSYSDIR = $(RELEASE_PATH)/lib/kernel-$(VSN)" n
  40. ;; n
  41. ;; "# ----------------------------------------------------" n
  42. ;; "# Target Specs" n
  43. ;; "# ----------------------------------------------------" n
  44. ;; n
  45. ;; "MODULES= " appwiz-erlang-modulename n
  46. ;; n
  47. ;; "HRL_FILES="
  48. ;; n
  49. ;; INTERNAL_HRL_FILES= appwiz-erlang-modulename "_sup.hrl" n
  50. ;; n
  51. ;; "ERL_FILES= $(MODULES:%=%.erl)" n
  52. ;; n
  53. ;; "TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(APP_TARGET)" n
  54. ;; n
  55. ;; "APP_FILE= " appwiz-erlang-modulename ".app" n
  56. ;; n
  57. ;; "APP_SRC= $(APP_FILE).src" n
  58. ;; "APP_TARGET= ../ebin/$(APP_FILE)" n
  59. ;; n
  60. ;; "# ----------------------------------------------------" n
  61. ;; "# FLAGS " n
  62. ;; "# ----------------------------------------------------" n
  63. ;; "ERL_FLAGS += " n
  64. ;; "ERL_COMPILE_FLAGS += -I../include" n
  65. ;; n
  66. ;; "# ----------------------------------------------------" n
  67. ;; "# Targets" n
  68. ;; "# ----------------------------------------------------" n
  69. ;; n
  70. ;; "debug opt: $(TARGET_FILES)" n
  71. ;; n
  72. ;; "clean:" n
  73. ;; " rm -f $(TARGET_FILES) $(GEN_FILES)" n
  74. ;; " rm -f core" n
  75. ;; n
  76. ;; "docs:" n
  77. ;; n
  78. ;; "# ----------------------------------------------------" n
  79. ;; "# Special Build Targets " n
  80. ;; "# ----------------------------------------------------" n
  81. ;; " " n
  82. ;; "$(APP_TARGET): $(APP_SRC) " n
  83. ;; " sed -e 's;%VSN%;$(VSN);' $(APP_SRC) > $(APP_TARGET)" n
  84. ;; " " n
  85. ;; "# ----------------------------------------------------" n
  86. ;; "# Release Target " n
  87. ;; "# ----------------------------------------------------" n
  88. ;; "include $(CC_ROOT)/internal_tools/make/otp_release_targets.mk" n
  89. ;; n
  90. ;; "release_spec: opt" n
  91. ;; " $(INSTALL_DIR) $(RELSYSDIR)/src " n
  92. ;; " $(INSTALL_DATA) $(ERL_FILES) $(RELSYSDIR)/src " n
  93. ;; " $(INSTALL_DATA) $(INTERNAL_HRL_FILES) $(RELSYSDIR)/src " n
  94. ;; " $(INSTALL_DIR) $(RELSYSDIR)/include " n
  95. ;; " $(INSTALL_DATA) $(HRL_FILES) $(RELSYSDIR)/include " n
  96. ;; " $(INSTALL_DIR) $(RELSYSDIR)/ebin " n
  97. ;; " $(INSTALL_DATA) $(TARGET_FILES) $(RELSYSDIR)/ebin " n
  98. ;; n
  99. ;; "release_docs_spec:" n
  100. ;; ))
  101. ;;
  102. ;;
  103. ;;
  104. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  105. ;;
  106. ;; Erlang application wizard
  107. ;;
  108. (defun erlang-application-wizard (directory name)
  109. "Creates all files and directories needed for an application.
  110. The top-level directory is placed in DIRECTORY. NAME is used when
  111. creating the root directory and for naming application files."
  112. (interactive "DApplication root directory: \nsName of application: ")
  113. (let ((dir nil)
  114. (lastchar (substring directory (- (length directory) 1)))
  115. (apptype (completing-read "Type of application: "
  116. '(("gen_server" 1)
  117. ("gen_event" 2)
  118. ("gen_fsm" 3)
  119. ("other" 4))
  120. nil t "gen_server"))
  121. (appname nil)
  122. (apptemplate nil)
  123. (apitemplate nil)
  124. (extension nil))
  125. (if (string= lastchar "/")
  126. (setq dir directory)
  127. (setq dir (concat directory "/")))
  128. ;; determine type of application
  129. (cond ((string= apptype "gen_server")
  130. (setq extension "_server")
  131. (setq appname (concat name extension))
  132. (setq apptemplate 'tempo-template-erlang-generic-server)
  133. (setq apitemplate 'tempo-template-erlang-large-header))
  134. ((string= apptype "gen_event")
  135. (setq extension "_event")
  136. (setq appname (concat name extension))
  137. (setq apptemplate 'tempo-template-erlang-gen-event)
  138. (setq apitemplate 'tempo-template-erlang-large-header))
  139. ((string= apptype "gen_fsm")
  140. (setq extension "_fsm")
  141. (setq appname (concat name extension))
  142. (setq apptemplate 'tempo-template-erlang-gen-fsm)
  143. (setq apitemplate 'tempo-template-large-header))
  144. (t
  145. ;; use defaults _work
  146. (setq extension "_work")
  147. (setq appname (concat name extension))
  148. (setq apptemplate 'tempo-template-erlang-large-header)
  149. (setq apitemplate 'tempo-template-erlang-large-header)))
  150. (setq appwiz-erlang-modulename appname)
  151. (setq appwiz-erlang-ext extension)
  152. ;; create directories
  153. (make-directory (concat dir name "/" "src") t)
  154. (make-directory (concat dir name "/" "ebin") t)
  155. (make-directory (concat dir name "/" "include") t)
  156. ;; create directory content
  157. ;;;;;;;;; .erl
  158. (find-file (concat dir name "/" "src/" name ".erl"))
  159. (funcall apitemplate)
  160. (insert "API module for the application " name ".")
  161. (save-buffer)
  162. ;;;;;;;;; _app.erl
  163. (find-file (concat dir name "/" "src/" name "_app.erl"))
  164. (tempo-template-erlang-application)
  165. (insert "Application callback module for the application " name ".")
  166. (let ((quotedname (erlang-add-quotes-if-needed
  167. (concat name "_sup")))
  168. (start (point)))
  169. (while (search-forward "'TopSupervisor':start_link" nil t)
  170. (replace-match (concat quotedname ":start_link") nil t))
  171. (goto-char start))
  172. (save-buffer)
  173. ;;;;;;;;; _sup.erl
  174. (find-file (concat dir name "/" "src/" name "_sup.erl"))
  175. (tempo-template-erlang-supervisor)
  176. (insert "Top level supervisor for the application " name ".")
  177. (let ((quotedname (erlang-add-quotes-if-needed appname))
  178. (start (point)))
  179. (while (search-forward "'AName'" nil t)
  180. (replace-match quotedname nil t))
  181. (goto-char start))
  182. (let ((quotedname (erlang-add-quotes-if-needed appname))
  183. (start (point)))
  184. (goto-char 0)
  185. (while (search-forward "'AMODULE'" nil t)
  186. (replace-match quotedname nil t))
  187. (goto-char start))
  188. (save-buffer)
  189. ;;;;;;;;; _sup.hrl
  190. (find-file (concat dir name "/" "src/" name "_sup.hrl"))
  191. (tempo-template-erlang-nomodule-header)
  192. (save-buffer)
  193. ;;;;;;;;; _(application).erl
  194. (find-file (concat dir name "/" "src/" appname ".erl"))
  195. (funcall apptemplate)
  196. (save-buffer)
  197. ;;;;;;;;; makefile (src)
  198. (find-file (concat dir name "/" "src/makefile"))
  199. (setq appwiz-erlang-modulename name)
  200. (setq appwiz-erlang-ext extension)
  201. (tempo-template-erlang-makefile-src)
  202. (insert "Makefile for application " name ".")
  203. (let ((start (point)))
  204. (goto-char 0)
  205. (while (search-forward "%" nil t)
  206. (replace-match "#" nil t))
  207. (goto-char start))
  208. (save-buffer)
  209. ;;;;;;;;; makefile (middle)
  210. (find-file (concat dir name "/" "makefile"))
  211. (tempo-template-erlang-makefile-middle)
  212. (insert "Makefile for application " name ".")
  213. (let ((start (point)))
  214. (goto-char 0)
  215. (while (search-forward "%" nil t)
  216. (replace-match "#" nil t))
  217. (goto-char start))
  218. (save-buffer)
  219. ;;;;;;;;; .app
  220. (find-file (concat dir name "/" "ebin/" name ".app"))
  221. (erlang-mode)
  222. (tempo-template-erlang-app)
  223. (insert "Application specification file for " name ".")
  224. (save-buffer)))
  225. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  226. ;;
  227. ;; These are setq:ed
  228. ;;
  229. (defvar appwiz-erlang-modulename "foo")
  230. (defvar appwiz-erlang-ext "_work")
  231. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  232. ;;
  233. ;; Skeletons.
  234. ;; Skeletons for nomodule header and .app file added by JB.
  235. ;;
  236. (defvar erlang-skel
  237. '(("If" "if" erlang-skel-if)
  238. ("Case" "case" erlang-skel-case)
  239. ("Receive" "receive" erlang-skel-receive)
  240. ("Receive After" "after" erlang-skel-receive-after)
  241. ("Receive Loop" "loop" erlang-skel-receive-loop)
  242. ("Module" "module" erlang-skel-module)
  243. ("Author" "author" erlang-skel-author)
  244. ("Query" "query" erlang-skel-query)
  245. ()
  246. ("Small Header" "small-header"
  247. erlang-skel-small-header erlang-skel-header)
  248. ("Normal Header" "normal-header"
  249. erlang-skel-normal-header erlang-skel-header)
  250. ("Large Header" "large-header"
  251. erlang-skel-large-header erlang-skel-header)
  252. ("No Moudle Header" "nomodule-header"
  253. erlang-skel-nomodule-header erlang-skel-header)
  254. ()
  255. ("Small Server" "small-server"
  256. erlang-skel-small-server erlang-skel-header)
  257. ()
  258. ("application" "application"
  259. erlang-skel-application erlang-skel-header)
  260. ("app" "app"
  261. erlang-skel-app erlang-skel-header)
  262. ("supervisor" "supervisor"
  263. erlang-skel-supervisor erlang-skel-header)
  264. ("supervisor_bridge" "supervisor-bridge"
  265. erlang-skel-supervisor-bridge erlang-skel-header)
  266. ("gen_server" "generic-server"
  267. erlang-skel-generic-server erlang-skel-header)
  268. ("gen_event" "gen-event"
  269. erlang-skel-gen-event erlang-skel-header)
  270. ("gen_fsm" "gen-fsm"
  271. erlang-skel-gen-fsm erlang-skel-header))
  272. "*Description of all skeletons templates.
  273. Both functions and menu entries will be created.
  274. Each entry in `erlang-skel' should be a list with three or four
  275. elements, or the empty list.
  276. The first element is the name which shows up in the menu. The second
  277. is the `tempo' identfier (The string \"erlang-\" will be added in
  278. front of it). The third is the skeleton descriptor, a variable
  279. containing `tempo' attributes as described in the function
  280. `tempo-define-template'. The optinal fourth elements denotes a
  281. function which should be called when the menu is selected.
  282. Functions corresponding to every template will be created. The name
  283. of the function will be `tempo-template-erlang-X' where `X' is the
  284. tempo identifier as specified in the second argument of the elements
  285. in this list.
  286. A list with zero elemets means that the a horisontal line should
  287. be placed in the menu.")
  288. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  289. ;;
  290. ;; Template for .app file skeleton
  291. ;;
  292. (defvar erlang-skel-app
  293. '((erlang-skel-include erlang-skel-nomodule-header)
  294. "{application, "
  295. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name)) "," n>
  296. "[{description, \"" (erlang-get-module-from-file-name) "\"}," n>
  297. "{vsn, \"0.1\"}," n>
  298. "{modules, ["
  299. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name)) "," n>
  300. (erlang-add-quotes-if-needed
  301. (concat (erlang-get-module-from-file-name) "_app")) "," n>
  302. (erlang-add-quotes-if-needed
  303. (concat (erlang-get-module-from-file-name) "_sup")) "," n>
  304. (erlang-add-quotes-if-needed
  305. (concat (erlang-get-module-from-file-name) appwiz-erlang-ext)) "]}," n>
  306. "{registered, ["
  307. (erlang-add-quotes-if-needed
  308. (concat (erlang-get-module-from-file-name) appwiz-erlang-ext)) ","
  309. (erlang-add-quotes-if-needed
  310. (concat (erlang-get-module-from-file-name) "_sup")) "]}," n>
  311. "{applications, [kernel," n>
  312. "stdlib," n>
  313. "sasl," n>
  314. "mnesia]}," n>
  315. "{env, []}," n>
  316. "{mod, {"
  317. (erlang-add-quotes-if-needed
  318. (concat (erlang-get-module-from-file-name) "_app"))
  319. ", []}}]}." n
  320. )
  321. "*The template of an application file
  322. Please see the function `tempo-define-template'.")
  323. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  324. ;;
  325. ;; Template for no-module header skeleton.
  326. ;;
  327. (defvar erlang-skel-nomodule-header
  328. '(o (erlang-skel-separator)
  329. (erlang-skel-include erlang-skel-copyright-comment
  330. erlang-skel-file-comment
  331. erlang-skel-author-comment)
  332. "%%% Purpose : " p n
  333. (erlang-skel-include erlang-skel-created-comment)
  334. (erlang-skel-separator) n)
  335. "*The template of a normal header.
  336. Please see the function `tempo-define-template'.")
  337. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  338. ;;
  339. ;; .app extension added.
  340. ;;
  341. (defvar erlang-file-name-extension-regexp "\\.\\(erl\\|hrl\\|app\\)$"
  342. "*Regexp which should match an erlang file name.
  343. This regexp is used when an Erlang module name is extracted from the
  344. name of an Erlang source file.
  345. The regexp should only match the section of the file name which should
  346. be excluded from the module name.
  347. To match all files set this variable to \"\\\\(\\\\..*\\\\|\\\\)$\".
  348. The matches all except the extension. This is useful if the Erlang
  349. tags system should interpretate tags on the form `module:tag' for
  350. files written in other languages than Erlang.")
  351. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  352. ;;
  353. ;; Wizard menu added.
  354. ;;
  355. (defvar erlang-menu-items
  356. '(("Indent"
  357. (("Indent Line" erlang-indent-command)
  358. ("Indent Region " erlang-indent-region
  359. (if erlang-xemacs-p (mark) mark-active))
  360. ("Indent Clause" erlang-indent-caluse)
  361. ("Indent Function" erlang-indent-function)
  362. ("Indent Buffer" erlang-indent-current-buffer)))
  363. ("Edit"
  364. (("Fill Comment" erlang-fill-paragraph)
  365. ("Comment Region" comment-region
  366. (if erlang-xemacs-p (mark) mark-active))
  367. ("Uncomment Region" erlang-uncomment-region
  368. (if erlang-xemacs-p (mark) mark-active))
  369. nil
  370. ("beginning of Function" erlang-beginning-of-function)
  371. ("End of Function" erlang-end-of-function)
  372. ("Mark Function" erlang-mark-function)
  373. nil
  374. ("beginning of Clause" erlang-beginning-of-clause)
  375. ("End of Clause" erlang-end-of-clause)
  376. ("Mark Clause" erlang-mark-clause)
  377. nil
  378. ("New Clause" erlang-generate-new-clause)
  379. ("Clone Arguments" erlang-clone-arguments)))
  380. ("Font Lock Mode"
  381. (("Level 3" erlang-font-lock-level-3)
  382. ("Level 2" erlang-font-lock-level-2)
  383. ("Level 1" erlang-font-lock-level-1)
  384. ("Off" erlang-font-lock-level-0)))
  385. ("TAGS"
  386. (("Find Tag" find-tag)
  387. ("Find Next Tag" erlang-find-next-tag)
  388. ;("Find Regexp" find-tag-regexp)
  389. ("Complete Word" erlang-complete-tag)
  390. ("Tags Apropos" tags-apropos)
  391. ("Search Files" tags-search)))
  392. nil
  393. ("Erlang Shell" inferior-erlang-run-or-select)
  394. ("Compile" erlang-compile)
  395. ("Next Error" inferior-erlang-next-error)
  396. nil
  397. ("Version" erlang-version)
  398. nil
  399. ("Wizards"
  400. (("Application Wizard" erlang-application-wizard))))
  401. "*Description of menu used in Erlang mode.
  402. This variable must be a list. The elements are either nil representing
  403. a horisontal line or a list with two or three elements. The first is
  404. the name of the menu item, the second is the function to call, or a
  405. submenu, on the same same form as ITEMS. The third optional argument
  406. is an expression which is evaluated every time the menu is displayed.
  407. Should the expression evaluate to nil the menu item is ghosted.
  408. Example:
  409. '((\"Func1\" function-one)
  410. (\"SubItem\"
  411. ((\"Yellow\" function-yellow)
  412. (\"Blue\" function-blue)))
  413. nil
  414. (\"Region Funtion\" spook-function midnight-variable))
  415. Call the function `erlang-menu-init' after modifying this variable.")
  416. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  417. ;;
  418. ;; Prefixing space removed from date string
  419. ;;
  420. (defun erlang-skel-d-mmm-yyyy ()
  421. "Return the current date as a string in \"DD Mon YYYY\" form.
  422. The first character of DD is *not* space if the value is less than 10."
  423. (let ((date (current-time-string)))
  424. (format "%d %s %s"
  425. (string-to-int (substring date 8 10))
  426. (substring date 4 7)
  427. (substring date -4))))
  428. (defvar erlang-skel-date-function 'erlang-skel-d-mmm-yyyy
  429. "*Function which returns date string.
  430. Look in the module `time-stamp' for a battery of functions.")
  431. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  432. ;;
  433. ;; Fixed skeletons. erlang-add-quotes-if-needed introduced where needed.
  434. ;;
  435. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  436. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  437. ;; Server templates.
  438. (defvar erlang-skel-small-server
  439. '((erlang-skel-include erlang-skel-large-header)
  440. "-export([start/0,init/1])." n n n
  441. "start() ->" n> "spawn("
  442. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name))
  443. ", init, [self()])." n n
  444. "init(From) ->" n>
  445. "loop(From)." n n
  446. "loop(From) ->" n>
  447. "receive" n>
  448. p "_ ->" n>
  449. "loop(From)" n>
  450. "end."
  451. )
  452. "*Template of a small server.
  453. Please see the function `tempo-define-template'.")
  454. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  455. ;; Behaviour templates.
  456. (defvar erlang-skel-application
  457. '((erlang-skel-include erlang-skel-large-header)
  458. "-behaviour(application)." n
  459. n
  460. "%% application callbacks" n
  461. "-export([start/2, stop/1])." n n
  462. (erlang-skel-separator)
  463. "%%% Callback functions from application" n
  464. (erlang-skel-separator)
  465. n
  466. (erlang-skel-separator 2)
  467. "%% Func: start/2" n
  468. "%% Returns: {ok, Pid} |" n
  469. "%% {ok, Pid, State} |" n
  470. "%% {error, Reason} " n
  471. (erlang-skel-separator 2)
  472. "start(Type, StartArgs) ->" n>
  473. "case 'TopSupervisor':start_link(StartArgs) of" n>
  474. "{ok, Pid} -> " n>
  475. "{ok, Pid};" n>
  476. "Error ->" n>
  477. "Error" n>
  478. "end." n
  479. n
  480. (erlang-skel-separator 2)
  481. "%% Func: stop/1" n
  482. "%% Returns: any "n
  483. (erlang-skel-separator 2)
  484. "stop(State) ->" n>
  485. "ok." n
  486. n
  487. (erlang-skel-separator)
  488. "%%% Internal functions" n
  489. (erlang-skel-separator)
  490. )
  491. "*The template of an application behaviour.
  492. Please see the function `tempo-define-template'.")
  493. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  494. (defvar erlang-skel-supervisor
  495. '((erlang-skel-include erlang-skel-large-header)
  496. "-behaviour(supervisor)." n
  497. n
  498. "%% External exports" n
  499. "-export([start_link/1])." n
  500. n
  501. "%% supervisor callbacks" n
  502. "-export([init/1])." n n
  503. (erlang-skel-separator)
  504. "%%% API" n
  505. (erlang-skel-separator)
  506. "start_link(StartArgs) ->" n>
  507. "supervisor:start_link({local, "
  508. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name)) "}, "
  509. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name))
  510. ", StartArgs)." n
  511. n
  512. (erlang-skel-separator)
  513. "%%% Callback functions from supervisor" n
  514. (erlang-skel-separator)
  515. n
  516. (erlang-skel-separator 2)
  517. "%% Func: init/1" n
  518. "%% Returns: {ok, {SupFlags, [ChildSpec]}} |" n
  519. "%% ignore |" n
  520. "%% {error, Reason} " n
  521. (erlang-skel-separator 2)
  522. "init(StartArgs) ->" n>
  523. "AChild = {'AName',{'AModule',start_link,[]}," n>
  524. "permanent,2000,worker,['AModule']}," n>
  525. "{ok,{{one_for_all,4,3600}, [AChild]}}." n
  526. n
  527. (erlang-skel-separator)
  528. "%%% Internal functions" n
  529. (erlang-skel-separator)
  530. )
  531. "*The template of an supervisor behaviour.
  532. Please see the function `tempo-define-template'.")
  533. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  534. (defvar erlang-skel-supervisor-bridge
  535. '((erlang-skel-include erlang-skel-large-header)
  536. "-behaviour(supervisor_bridge)." n
  537. n
  538. "%% External exports" n
  539. "-export([start_link/0])." n
  540. n
  541. "%% supervisor callbacks" n
  542. "-export([init/1, terminate/2])." n n
  543. "-record(state, {})." n
  544. n
  545. (erlang-skel-separator)
  546. "%%% API" n
  547. (erlang-skel-separator)
  548. "start_link() -> " n>
  549. "supervisor_bridge:start_link({local, "
  550. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name)) "}, "
  551. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name))
  552. ", [])." n
  553. n
  554. (erlang-skel-separator)
  555. "%%% Callback functions from supervisor_bridge" n
  556. (erlang-skel-separator)
  557. n
  558. (erlang-skel-separator 2)
  559. "%% Func: init/1" n
  560. "%% Returns: {ok, Pid, State} |" n
  561. "%% ignore |" n
  562. "%% {error, Reason} " n
  563. (erlang-skel-separator 2)
  564. "init([]) ->" n>
  565. "case 'AModule':start_link() of" n>
  566. "{ok, Pid} ->" n>
  567. "{ok, Pid, #state{}};" n>
  568. "Error ->" n>
  569. "Error" n>
  570. "end." n
  571. n
  572. (erlang-skel-separator 2)
  573. "%% Func: terminate/2" n
  574. "%% Purpose: Synchronized shutdown of the underlying sub system." n
  575. "%% Returns: any" n
  576. (erlang-skel-separator 2)
  577. "terminate(Reason, State) ->" n>
  578. "'AModule':stop()," n>
  579. "ok." n
  580. n
  581. (erlang-skel-separator)
  582. "%%% Internal functions" n
  583. (erlang-skel-separator)
  584. )
  585. "*The template of an supervisor_bridge behaviour.
  586. Please see the function `tempo-define-template'.")
  587. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  588. (defvar erlang-skel-generic-server
  589. '((erlang-skel-include erlang-skel-large-header)
  590. "-behaviour(gen_server)." n
  591. n
  592. "%% External exports" n
  593. "-export([start_link/0])." n
  594. n
  595. "%% gen_server callbacks" n
  596. "-export([init/1, handle_call/3, handle_cast/2, "
  597. "handle_info/2, terminate/2])." n n
  598. "-record(state, {})." n
  599. n
  600. (erlang-skel-separator)
  601. "%%% API" n
  602. (erlang-skel-separator)
  603. "start_link() -> " n>
  604. "gen_server:start_link({local, "
  605. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name)) "}, "
  606. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name))
  607. ", [], [])." n
  608. n
  609. (erlang-skel-separator)
  610. "%%% Callback functions from gen_server" n
  611. (erlang-skel-separator)
  612. n
  613. (erlang-skel-separator 2)
  614. "%% Func: init/1" n
  615. "%% Returns: {ok, State} |" n
  616. "%% {ok, State, Timeout} |" n
  617. "%% ignore |" n
  618. "%% {stop, Reason}" n
  619. (erlang-skel-separator 2)
  620. "init([]) ->" n>
  621. "{ok, #state{}}." n
  622. n
  623. (erlang-skel-separator 2)
  624. "%% Func: handle_call/3" n
  625. "%% Returns: {reply, Reply, State} |" n
  626. "%% {reply, Reply, State, Timeout} |" n
  627. "%% {noreply, State} |" n
  628. "%% {noreply, State, Timeout} |" n
  629. "%% {stop, Reason, Reply, State} | (terminate/2 is called)" n
  630. "%% {stop, Reason, State} (terminate/2 is called)" n
  631. (erlang-skel-separator 2)
  632. "handle_call(Request, From, State) ->" n>
  633. "Reply = ok," n>
  634. "{reply, Reply, State}." n
  635. n
  636. (erlang-skel-separator 2)
  637. "%% Func: handle_cast/2" n
  638. "%% Returns: {noreply, State} |" n
  639. "%% {noreply, State, Timeout} |" n
  640. "%% {stop, Reason, State} (terminate/2 is called)" n
  641. (erlang-skel-separator 2)
  642. "handle_cast(Msg, State) ->" n>
  643. "{noreply, State}." n
  644. n
  645. (erlang-skel-separator 2)
  646. "%% Func: handle_info/2" n
  647. "%% Returns: {noreply, State} |" n
  648. "%% {noreply, State, Timeout} |" n
  649. "%% {stop, Reason, State} (terminate/2 is called)" n
  650. (erlang-skel-separator 2)
  651. "handle_info(Info, State) ->" n>
  652. "{noreply, State}." n
  653. n
  654. (erlang-skel-separator 2)
  655. "%% Func: terminate/2" n
  656. "%% Purpose: Shutdown the server" n
  657. "%% Returns: any (ignored by gen_server)" n
  658. (erlang-skel-separator 2)
  659. "terminate(Reason, State) ->" n>
  660. "ok." n
  661. n
  662. (erlang-skel-separator)
  663. "%%% Internal functions" n
  664. (erlang-skel-separator)
  665. )
  666. "*The template of a generic server.
  667. Please see the function `tempo-define-template'.")
  668. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  669. (defvar erlang-skel-gen-event
  670. '((erlang-skel-include erlang-skel-large-header)
  671. "-behaviour(gen_event)." n
  672. n
  673. "%% External exports" n
  674. "-export([start_link/0, add_handler/0])." n
  675. n
  676. "%% gen_event callbacks" n
  677. "-export([init/1, handle_event/2, handle_call/2, "
  678. "handle_info/2, terminate/2])." n n
  679. "-record(state, {})." n
  680. n
  681. (erlang-skel-separator)
  682. "%%% API" n
  683. (erlang-skel-separator)
  684. "start_link() ->" n>
  685. "gen_event:start_link({local, "
  686. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name)) "}). " n
  687. n
  688. "add_handler() ->" n>
  689. "gen_event:add_handler("
  690. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name)) ", "
  691. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name))
  692. ", [])." n
  693. n
  694. (erlang-skel-separator)
  695. "%%% Callback functions from gen_event" n
  696. (erlang-skel-separator)
  697. n
  698. (erlang-skel-separator 2)
  699. "%% Func: init/1" n
  700. "%% Returns: {ok, State} |" n
  701. "%% Other" n
  702. (erlang-skel-separator 2)
  703. "init([]) ->" n>
  704. "{ok, #state{}}." n
  705. n
  706. (erlang-skel-separator 2)
  707. "%% Func: handle_event/2" n
  708. "%% Returns: {ok, State} |" n
  709. "%% {swap_handler, Args1, State1, Mod2, Args2} |" n
  710. "%% remove_handler " n
  711. (erlang-skel-separator 2)
  712. "handle_event(Event, State) ->" n>
  713. "{ok, State}." n
  714. n
  715. (erlang-skel-separator 2)
  716. "%% Func: handle_call/2" n
  717. "%% Returns: {ok, Reply, State} |" n
  718. "%% {swap_handler, Reply, Args1, State1, Mod2, Args2} |" n
  719. "%% {remove_handler, Reply} " n
  720. (erlang-skel-separator 2)
  721. "handle_call(Request, State) ->" n>
  722. "Reply = ok," n>
  723. "{ok, Reply, State}." n
  724. n
  725. (erlang-skel-separator 2)
  726. "%% Func: handle_info/2" n
  727. "%% Returns: {ok, State} |" n
  728. "%% {swap_handler, Args1, State1, Mod2, Args2} |" n
  729. "%% remove_handler " n
  730. (erlang-skel-separator 2)
  731. "handle_info(Info, State) ->" n>
  732. "{ok, State}." n
  733. n
  734. (erlang-skel-separator 2)
  735. "%% Func: terminate/2" n
  736. "%% Purpose: Shutdown the server" n
  737. "%% Returns: any" n
  738. (erlang-skel-separator 2)
  739. "terminate(Reason, State) ->" n>
  740. "ok." n
  741. n
  742. (erlang-skel-separator)
  743. "%%% Internal functions" n
  744. (erlang-skel-separator)
  745. )
  746. "*The template of a gen_event.
  747. Please see the function `tempo-define-template'.")
  748. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  749. (defvar erlang-skel-gen-fsm
  750. '((erlang-skel-include erlang-skel-large-header)
  751. "-behaviour(gen_fsm)." n
  752. n
  753. "%% External exports" n
  754. "-export([start_link/0])." n
  755. n
  756. "%% gen_fsm callbacks" n
  757. "-export([init/1, state_name/2, state_name/3, handle_event/3," n>
  758. "handle_sync_event/4, handle_info/3, terminate/3])." n n
  759. "-record(state, {})." n
  760. n
  761. (erlang-skel-separator)
  762. "%%% API" n
  763. (erlang-skel-separator)
  764. "start_link() ->" n>
  765. "gen_fsm:start_link({local, "
  766. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name)) "}, "
  767. (erlang-add-quotes-if-needed (erlang-get-module-from-file-name))
  768. ", [], [])." n
  769. n
  770. (erlang-skel-separator)
  771. "%%% Callback functions from gen_fsm" n
  772. (erlang-skel-separator)
  773. n
  774. (erlang-skel-separator 2)
  775. "%% Func: init/1" n
  776. "%% Returns: {ok, StateName, StateData} |" n
  777. "%% {ok, StateName, StateData, Timeout} |" n
  778. "%% ignore |" n
  779. "%% {stop, StopReason} " n
  780. (erlang-skel-separator 2)
  781. "init([]) ->" n>
  782. "{ok, state_name, #state{}}." n
  783. n
  784. (erlang-skel-separator 2)
  785. "%% Func: StateName/2" n
  786. "%% Returns: {next_state, NextStateName, NextStateData} |" n
  787. "%% {next_state, NextStateName, NextStateData, Timeout} |" n
  788. "%% {stop, Reason, NewStateData} " n
  789. (erlang-skel-separator 2)
  790. "state_name(Event, StateData) ->" n>
  791. "{nextstate, state_name, StateData}." n
  792. n
  793. (erlang-skel-separator 2)
  794. "%% Func: StateName/3" n
  795. "%% Returns: {next_state, NextStateName, NextStateData} |" n
  796. "%% {next_state, NextStateName, NextStateData, Timeout} |" n
  797. "%% {reply, Reply, NextStateName, NextStateData} |" n
  798. "%% {reply, Reply, NextStateName, NextStateData, Timeout} |" n
  799. "%% {stop, Reason, NewStateData} |" n
  800. "%% {stop, Reason, Reply, NewStateData} " n
  801. (erlang-skel-separator 2)
  802. "state_name(Event, From, StateData) ->" n>
  803. "Reply = ok," n>
  804. "{reply, Reply, state_name, StateData}." n
  805. n
  806. (erlang-skel-separator 2)
  807. "%% Func: handle_event/3" n
  808. "%% Returns: {next_state, NextStateName, NextStateData} |" n
  809. "%% {next_state, NextStateName, NextStateData, Timeout} |" n
  810. "%% {stop, Reason, NewStateData} " n
  811. (erlang-skel-separator 2)
  812. "handle_event(Event, StateName, StateData) ->" n>
  813. "{nextstate, StateName, StateData}." n
  814. n
  815. (erlang-skel-separator 2)
  816. "%% Func: handle_sync_event/4" n
  817. "%% Returns: {next_state, NextStateName, NextStateData} |" n
  818. "%% {next_state, NextStateName, NextStateData, Timeout} |" n
  819. "%% {reply, Reply, NextStateName, NextStateData} |" n
  820. "%% {reply, Reply, NextStateName, NextStateData, Timeout} |" n
  821. "%% {stop, Reason, NewStateData} |" n
  822. "%% {stop, Reason, Reply, NewStateData} " n
  823. (erlang-skel-separator 2)
  824. "handle_sync_event(Event, From, StateName, StateData) ->" n>
  825. "Reply = ok," n>
  826. "{reply, Reply, StateName, StateData}." n
  827. n
  828. (erlang-skel-separator 2)
  829. "%% Func: handle_info/3" n
  830. "%% Returns: {next_state, NextStateName, NextStateData} |" n
  831. "%% {next_state, NextStateName, NextStateData, Timeout} |" n
  832. "%% {stop, Reason, NewStateData} " n
  833. (erlang-skel-separator 2)
  834. "handle_info(Info, StateName, StateData) ->" n>
  835. "{nextstate, StateName, StateData}." n
  836. n
  837. (erlang-skel-separator 2)
  838. "%% Func: terminate/3" n
  839. "%% Purpose: Shutdown the fsm" n
  840. "%% Returns: any" n
  841. (erlang-skel-separator 2)
  842. "terminate(Reason, StateName, StatData) ->" n>
  843. "ok." n
  844. n
  845. (erlang-skel-separator)
  846. "%%% Internal functions" n
  847. (erlang-skel-separator)
  848. )
  849. "*The template of a gen_fsm.
  850. Please see the function `tempo-define-template'.")
  851. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  852. ;;
  853. ;; Original erlang-add-quotes-if-needed is broken, we install a
  854. ;; new version.
  855. ;;
  856. (add-hook 'erlang-load-hook 'my-erlang-load-mods)
  857. (defun fixed-erlang-add-quotes-if-needed (str)
  858. "Return STR, possibly with quotes."
  859. (let ((saved-case-fold-search case-fold-search)
  860. (result nil))
  861. (setq case-fold-search nil)
  862. (setq result (if (string-match (concat "\\`" erlang-atom-regexp "\\'") str)
  863. str
  864. (concat "'" str "'")))
  865. (setq case-fold-search saved-case-fold-search)
  866. result))
  867. (defun my-erlang-load-mods ()
  868. (fset 'erlang-add-quotes-if-needed
  869. (symbol-function 'fixed-erlang-add-quotes-if-needed))
  870. (appwiz-skel-init))
  871. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  872. ;;
  873. ;; Additional skeletons which are not shown in the Erlang menu.
  874. ;;
  875. (defvar appwiz-skel
  876. '(
  877. ; ("generic-server-no-api" erlang-skel-generic-server-no-api)
  878. ; ("generic-server-api" erlang-skel-generic-server-api)
  879. ; ("gen-event-no-api" erlang-skel-gen-event-no-api)
  880. ; ("gen-event-api" erlang-skel-gen-event-api)
  881. ; ("gen-fsm-no-api" erlang-skel-gen-fsm-no-api)
  882. ; ("gen-fsm-api" erlang-skel-gen-fsm-api)
  883. ("makefile-middle" erlang-skel-makefile-middle)
  884. ("makefile-src" erlang-skel-makefile-src)))
  885. (defun appwiz-skel-init ()
  886. "Generate the skeleton functions."
  887. (interactive)
  888. (condition-case nil
  889. (require 'tempo)
  890. (error t))
  891. (if (featurep 'tempo)
  892. (let ((skel appwiz-skel))
  893. (while skel
  894. (funcall (symbol-function 'tempo-define-template)
  895. (concat "erlang-" (nth 0 (car skel)))
  896. ;; The tempo template used contains an `include'
  897. ;; function call only, hence changes to the
  898. ;; variables describing the templates take effect
  899. ;; immdiately.
  900. (list (list 'erlang-skel-include (nth 1 (car skel))))
  901. (nth 0 (car skel)))
  902. (setq skel (cdr skel))))))
  903. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  904. ;;;;
  905. ;;;;
  906. ;;
  907. ;;(defvar erlang-skel-generic-server-no-api
  908. ;; '((erlang-skel-include erlang-skel-large-header)
  909. ;; "-behaviour(gen_server)." n
  910. ;; n
  911. ;; "%% gen_server callbacks" n
  912. ;; "-export([init/1, handle_call/3, handle_cast/2, "
  913. ;; "handle_info/2, terminate/2])." n n
  914. ;; "-record(state, {})." n
  915. ;; n
  916. ;; (erlang-skel-separator)
  917. ;; "%%% Callback functions from gen_server" n
  918. ;; (erlang-skel-separator)
  919. ;; n
  920. ;; (erlang-skel-separator 2)
  921. ;; "%% Func: init/1" n
  922. ;; "%% Returns: {ok, State} |" n
  923. ;; "%% {ok, State, Timeout} |" n
  924. ;; "%% ignore |" n
  925. ;; "%% {stop, Reason}" n
  926. ;; (erlang-skel-separator 2)
  927. ;; "init([]) ->" n>
  928. ;; "{ok, #state{}}." n
  929. ;; n
  930. ;; (erlang-skel-separator 2)
  931. ;; "%% Func: handle_call/3" n
  932. ;; "%% Returns: {reply, Reply, State} |" n
  933. ;; "%% {reply, Reply, State, Timeout} |" n
  934. ;; "%% {noreply, State} |" n
  935. ;; "%% {noreply, State, Timeout} |" n
  936. ;; "%% {stop, Reason, Reply, State} | (terminate/2 is called)" n
  937. ;; "%% {stop, Reason, State} (terminate/2 is called)" n
  938. ;; (erlang-skel-separator 2)
  939. ;; "handle_call(Request, From, State) ->" n>
  940. ;; "Reply = ok," n>
  941. ;; "{reply, Reply, State}." n
  942. ;; n
  943. ;; (erlang-skel-separator 2)
  944. ;; "%% Func: handle_cast/2" n
  945. ;; "%% Returns: {noreply, State} |" n
  946. ;; "%% {noreply, State, Timeout} |" n
  947. ;; "%% {stop, Reason, State} (terminate/2 is called)" n
  948. ;; (erlang-skel-separator 2)
  949. ;; "handle_cast(Msg, State) ->" n>
  950. ;; "{noreply, State}." n
  951. ;; n
  952. ;; (erlang-skel-separator 2)
  953. ;; "%% Func: handle_info/2" n
  954. ;; "%% Returns: {noreply, State} |" n
  955. ;; "%% {noreply, State, Timeout} |" n
  956. ;; "%% {stop, Reason, State} (terminate/2 is called)" n
  957. ;; (erlang-skel-separator 2)
  958. ;; "handle_info(Info, State) ->" n>
  959. ;; "{noreply, State}." n
  960. ;; n
  961. ;; (erlang-skel-separator 2)
  962. ;; "%% Func: terminate/2" n
  963. ;; "%% Purpose: Shutdown the server" n
  964. ;; "%% Returns: any (ignored by gen_server)" n
  965. ;; (erlang-skel-separator 2)
  966. ;; "terminate(Reason, State) ->" n>
  967. ;; "ok." n
  968. ;; n
  969. ;; (erlang-skel-separator)
  970. ;; "%%% Internal functions" n
  971. ;; (erlang-skel-separator)
  972. ;; )
  973. ;; "*The template of a generic server.
  974. ;;Please see the function `tempo-define-template'.")
  975. ;;
  976. ;;(defvar erlang-skel-generic-server-api
  977. ;; '((erlang-skel-include erlang-skel-large-header)
  978. ;; "%% External exports" n
  979. ;; "-export([start_link/0])." n
  980. ;; n
  981. ;; (erlang-skel-separator)
  982. ;; "%%% API" n
  983. ;; (erlang-skel-separator)
  984. ;; "start_link() ->" n>
  985. ;; "gen_server:start_link({local, "
  986. ;; (erlang-add-quotes-if-needed
  987. ;; (concat (erlang-get-module-from-file-name) "_server")) "}, "
  988. ;; (erlang-add-quotes-if-needed
  989. ;; (concat (erlang-get-module-from-file-name) "_server")) ", [], [])." n
  990. ;; n
  991. ;; ))
  992. ;;
  993. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  994. ;;;;
  995. ;;;;
  996. ;;
  997. ;;(defvar erlang-skel-gen-event-no-api
  998. ;; '((erlang-skel-include erlang-skel-large-header)
  999. ;; "-behaviour(gen_event)." n
  1000. ;; n
  1001. ;; "%% gen_event callbacks" n
  1002. ;; "-export([init/1, handle_event/2, handle_call/2, "
  1003. ;; "handle_info/2, terminate/2])." n n
  1004. ;; "-record(state, {})." n
  1005. ;; n
  1006. ;; (erlang-skel-separator)
  1007. ;; "%%% Callback functions from gen_event" n
  1008. ;; (erlang-skel-separator)
  1009. ;; n
  1010. ;; (erlang-skel-separator 2)
  1011. ;; "%% Func: init/1" n
  1012. ;; "%% Returns: {ok, State} |" n
  1013. ;; "%% Other" n
  1014. ;; (erlang-skel-separator 2)
  1015. ;; "init([]) ->" n>
  1016. ;; "{ok, #state{}}." n
  1017. ;; n
  1018. ;; (erlang-skel-separator 2)
  1019. ;; "%% Func: handle_event/2" n
  1020. ;; "%% Returns: {ok, State} |" n
  1021. ;; "%% {swap_handler, Args1, State1, Mod2, Args2} |" n
  1022. ;; "%% remove_handler " n
  1023. ;; (erlang-skel-separator 2)
  1024. ;; "handle_event(Event, State) ->" n>
  1025. ;; "{ok, State}." n
  1026. ;; n
  1027. ;; (erlang-skel-separator 2)
  1028. ;; "%% Func: handle_call/2" n
  1029. ;; "%% Returns: {ok, Reply, State} |" n
  1030. ;; "%% {swap_handler, Reply, Args1, State1, Mod2, Args2} |" n
  1031. ;; "%% {remove_handler, Reply} " n
  1032. ;; (erlang-skel-separator 2)
  1033. ;; "handle_call(Request, State) ->" n>
  1034. ;; "Reply = ok," n>
  1035. ;; "{ok, Reply, State}." n
  1036. ;; n
  1037. ;; (erlang-skel-separator 2)
  1038. ;; "%% Func: handle_info/2" n
  1039. ;; "%% Returns: {ok, State} |" n
  1040. ;; "%% {swap_handler, Args1, State1, Mod2, Args2} |" n
  1041. ;; "%% remove_handler " n
  1042. ;; (erlang-skel-separator 2)
  1043. ;; "handle_info(Info, State) ->" n>
  1044. ;; "{ok, State}." n
  1045. ;; n
  1046. ;; (erlang-skel-separator 2)
  1047. ;; "%% Func: terminate/2" n
  1048. ;; "%% Purpose: Shutdown the server" n
  1049. ;; "%% Returns: any" n
  1050. ;; (erlang-skel-separator 2)
  1051. ;; "terminate(Reason, State) ->" n>
  1052. ;; "ok." n
  1053. ;; n
  1054. ;; (erlang-skel-separator)
  1055. ;; "%%% Internal functions" n
  1056. ;; (erlang-skel-separator)
  1057. ;; )
  1058. ;; "*The template of a gen_event.
  1059. ;;Please see the function `tempo-define-template'.")
  1060. ;;
  1061. ;;(defvar erlang-skel-gen-event-api
  1062. ;; '((erlang-skel-include erlang-skel-large-header)
  1063. ;; "%% External exports" n
  1064. ;; "-export([start_link/0, add_handler/0])." n
  1065. ;; n
  1066. ;; (erlang-skel-separator)
  1067. ;; "%%% API" n
  1068. ;; (erlang-skel-separator)
  1069. ;; "start_link() ->" n>
  1070. ;; "gen_event:start_link({local, "
  1071. ;; (erlang-add-quotes-if-needed
  1072. ;; (concat (erlang-get-module-from-file-name) "_event")) "}). " n
  1073. ;; n
  1074. ;; "add_handler() ->" n>
  1075. ;; "gen_event:add_handler("
  1076. ;; (erlang-add-quotes-if-needed
  1077. ;; (concat (erlang-get-module-from-file-name) "_event")) ", "
  1078. ;; (erlang-add-quotes-if-needed
  1079. ;; (concat (erlang-get-module-from-file-name) "_event")) ", [])." n
  1080. ;; n))
  1081. ;;
  1082. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1083. ;;;;
  1084. ;;;;
  1085. ;;
  1086. ;;(defvar erlang-skel-gen-fsm
  1087. ;; '((erlang-skel-include erlang-skel-large-header)
  1088. ;; "-behaviour(gen_fsm)." n
  1089. ;; n
  1090. ;; "%% gen_fsm callbacks" n
  1091. ;; "-export([init/1, state_name/2, state_name/3, handle_event/3," n>
  1092. ;; "handle_sync_event/4, handle_info/3, terminate/3])." n n
  1093. ;; "-record(state, {})." n
  1094. ;; n
  1095. ;; (erlang-skel-separator)
  1096. ;; "%%% Callback functions from gen_fsm" n
  1097. ;; (erlang-skel-separator)
  1098. ;; n
  1099. ;; (erlang-skel-separator 2)
  1100. ;; "%% Func: init/1" n
  1101. ;; "%% Returns: {ok, StateName, StateData} |" n
  1102. ;; "%% {ok, StateName, StateData, Timeout} |" n
  1103. ;; "%% ignore |" n
  1104. ;; "%% {stop, StopReason} " n
  1105. ;; (erlang-skel-separator 2)
  1106. ;; "init([]) ->" n>
  1107. ;; "{ok, state_name, #state{}}." n
  1108. ;; n
  1109. ;; (erlang-skel-separator 2)
  1110. ;; "%% Func: StateName/2" n
  1111. ;; "%% Returns: {next_state, NextStateName, NextStateData} |" n
  1112. ;; "%% {next_state, NextStateName, NextStateData, Timeout} |" n
  1113. ;; "%% {stop, Reason, NewStateData} " n
  1114. ;; (erlang-skel-separator 2)
  1115. ;; "state_name(Event, StateData) ->" n>
  1116. ;; "{nextstate, state_name, StateData}." n
  1117. ;; n
  1118. ;; (erlang-skel-separator 2)
  1119. ;; "%% Func: StateName/3" n
  1120. ;; "%% Returns: {next_state, NextStateName, NextStateData} |" n
  1121. ;; "%% {next_state, NextStateName, NextStateData, Timeout} |" n
  1122. ;; "%% {reply, Reply, NextStateName, NextStateData} |" n
  1123. ;; "%% {reply, Reply, NextStateName, NextStateData, Timeout} |" n
  1124. ;; "%% {stop, Reason, NewStateData} |" n
  1125. ;; "%% {stop, Reason, Reply, NewStateData} " n
  1126. ;; (erlang-skel-separator 2)
  1127. ;; "state_name(Event, From, StateData) ->" n>
  1128. ;; "Reply = ok," n>
  1129. ;; "{reply, Reply, state_name, StateData}." n
  1130. ;; n
  1131. ;; (erlang-skel-separator 2)
  1132. ;; "%% Func: handle_event/3" n
  1133. ;; "%% Returns: {next_state, NextStateName, NextStateData} |" n
  1134. ;; "%% {next_state, NextStateName, NextStateData, Timeout} |" n
  1135. ;; "%% {stop, Reason, NewStateData} " n
  1136. ;; (erlang-skel-separator 2)
  1137. ;; "handle_event(Event, StateName, StateData) ->" n>
  1138. ;; "{nextstate, StateName, StateData}." n
  1139. ;; n
  1140. ;; (erlang-skel-separator 2)
  1141. ;; "%% Func: handle_sync_event/4" n
  1142. ;; "%% Returns: {next_state, NextStateName, NextStateData} |" n
  1143. ;; "%% {next_state, NextStateName, NextStateData, Timeout} |" n
  1144. ;; "%% {reply, Reply, NextStateName, NextStateData} |" n
  1145. ;; "%% {reply, Reply, NextStateName, NextStateData, Timeout} |" n
  1146. ;; "%% {stop, Reason, NewStateData} |" n
  1147. ;; "%% {stop, Reason, Reply, NewStateData} " n
  1148. ;; (erlang-skel-separator 2)
  1149. ;; "handle_sync_event(Event, From, StateName, StateData) ->" n>
  1150. ;; "Reply = ok," n>
  1151. ;; "{reply, Reply, StateName, StateData}." n
  1152. ;; n
  1153. ;; (erlang-skel-separator 2)
  1154. ;; "%% Func: handle_info/3" n
  1155. ;; "%% Returns: {next_state, NextStateName, NextStateData} |" n
  1156. ;; "%% {next_state, NextStateName, NextStateData, Timeout} |" n
  1157. ;; "%% {stop, Reason, NewStateData} " n
  1158. ;; (erlang-skel-separator 2)
  1159. ;; "handle_info(Info, StateName, StateData) ->" n>
  1160. ;; "{nextstate, StateName, StateData}." n
  1161. ;; n
  1162. ;; (erlang-skel-separator 2)
  1163. ;; "%% Func: terminate/3" n
  1164. ;; "%% Purpose: Shutdown the fsm" n
  1165. ;; "%% Returns: any" n
  1166. ;; (erlang-skel-separator 2)
  1167. ;; "terminate(Reason, StateName, StatData) ->" n>
  1168. ;; "ok." n
  1169. ;; n
  1170. ;; (erlang-skel-separator)
  1171. ;; "%%% Internal functions" n
  1172. ;; (erlang-skel-separator)
  1173. ;; )
  1174. ;; "*The template of a gen_fsm.
  1175. ;;Please see the function `tempo-define-template'.")
  1176. ;;
  1177. ;;(defvar erlang-skel-gen-fsm-no-api
  1178. ;; '((erlang-skel-include erlang-skel-large-header)
  1179. ;; "%% External exports" n
  1180. ;; "-export([start_link/0])." n
  1181. ;; n
  1182. ;; (erlang-skel-separator)
  1183. ;; "%%% API" n
  1184. ;; (erlang-skel-separator)
  1185. ;; "start_link() ->" n>
  1186. ;; "gen_fsm:start_link({local, "
  1187. ;; (erlang-add-quotes-if-needed
  1188. ;; (concat (erlang-get-module-from-file-name) "_fsm")) "}, "
  1189. ;; (erlang-add-quotes-if-needed
  1190. ;; (concat (erlang-get-module-from-file-name) "_fsm")) ", [], [])." n
  1191. ;; n
  1192. ;; ))
  1193. ;;
  1194. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1195. ;;
  1196. ;; requires that the variables appwiz-erlang-modulename and
  1197. ;; appwiz-erlang-ext are defined.
  1198. ;;
  1199. (defvar erlang-skel-makefile-src
  1200. '((erlang-skel-include erlang-skel-nomodule-header)
  1201. "MAKE = make" n
  1202. n
  1203. "ERL = erlc" n
  1204. n
  1205. "EBIN = ../ebin" n
  1206. n
  1207. (erlang-skel-makefile-separator)
  1208. n
  1209. (upcase appwiz-erlang-modulename) "_HEADER_FILES = "
  1210. appwiz-erlang-modulename "_sup.hrl" n
  1211. n
  1212. (upcase appwiz-erlang-modulename) "_SOURCE_FILES = \\" n
  1213. " " appwiz-erlang-modulename ".erl" " "
  1214. appwiz-erlang-modulename "_sup.erl \\" n
  1215. " " appwiz-erlang-modulename "_app.erl" " "
  1216. appwiz-erlang-modulename appwiz-erlang-ext ".erl" n
  1217. n
  1218. (upcase appwiz-erlang-modulename) "_OBJECT_FILES = $("
  1219. (upcase appwiz-erlang-modulename) "_SOURCE_FILES:.erl=.jam)" n
  1220. n
  1221. n
  1222. (erlang-skel-makefile-separator)
  1223. "#" n
  1224. "# Transformations " n
  1225. "#" n
  1226. n
  1227. ".erl.jam:" n
  1228. " $(ERL) $<" n
  1229. n
  1230. (erlang-skel-makefile-separator) n
  1231. n
  1232. n
  1233. "def : "
  1234. appwiz-erlang-modulename n
  1235. n
  1236. appwiz-erlang-modulename ": $("
  1237. (upcase appwiz-erlang-modulename) "_OBJECT_FILES)" n
  1238. " cp $(" (upcase appwiz-erlang-modulename) "_OBJECT_FILES) "
  1239. "$(EBIN)" n
  1240. n
  1241. "clean :" n
  1242. " /bin/rm -f $(" (upcase appwiz-erlang-modulename)
  1243. "_OBJECT_FILES)" n
  1244. n
  1245. "$(" (upcase appwiz-erlang-modulename) "_OBJECT_FILES): $("
  1246. (upcase appwiz-erlang-modulename) "_HEADER_FILES)" n
  1247. n
  1248. ".SUFFIXES : .erl .jam" n
  1249. n
  1250. ))
  1251. (defvar erlang-skel-makefile-middle
  1252. '((erlang-skel-include erlang-skel-nomodule-header)
  1253. "MAKE = make" n
  1254. n
  1255. (erlang-skel-makefile-separator)
  1256. n
  1257. "def:" n
  1258. " (cd src ; $(MAKE))" n
  1259. n
  1260. "clean:" n
  1261. " (cd src ; $(MAKE) clean)" n
  1262. n
  1263. ))
  1264. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1265. (defun erlang-skel-makefile-separator ()
  1266. "Return a comment separator."
  1267. (concat (make-string 70 ?\#) "\n"))