10 changed files with 10481 additions and 0 deletions
-
4init.el
-
3modules/prelude-editor.el
-
52modules/prelude-erlang.el
-
448vendor/erlang/erlang-eunit.el
-
103vendor/erlang/erlang-flymake.el
-
1267vendor/erlang/erlang-skels-old.el
-
1553vendor/erlang/erlang-skels.el
-
121vendor/erlang/erlang-start.el
-
5585vendor/erlang/erlang.el
-
1345vendor/erlang/erlang_appwiz.el
@ -0,0 +1,52 @@ |
|||||
|
;;; prelude-coffee.el --- Emacs Prelude: Erlang programming support. |
||||
|
;; |
||||
|
;; Copyright (c) 2011 Gleb Peregud |
||||
|
;; |
||||
|
;; Author: Gleb Peregud <gleber.p@gmail.com> |
||||
|
;; Version: 1.0.0 |
||||
|
;; Keywords: convenience erlang |
||||
|
|
||||
|
;; This file is not part of GNU Emacs. |
||||
|
|
||||
|
;;; Commentary: |
||||
|
|
||||
|
;; Erlang is a concurrent functional language |
||||
|
|
||||
|
;;; License: |
||||
|
|
||||
|
;; This program is free software; you can redistribute it and/or |
||||
|
;; modify it under the terms of the GNU General Public License |
||||
|
;; as published by the Free Software Foundation; either version 3 |
||||
|
;; of the License, or (at your option) any later version. |
||||
|
;; |
||||
|
;; This program is distributed in the hope that it will be useful, |
||||
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
;; GNU General Public License for more details. |
||||
|
;; |
||||
|
;; You should have received a copy of the GNU General Public License |
||||
|
;; along with GNU Emacs; see the file COPYING. If not, write to the |
||||
|
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
||||
|
;; Boston, MA 02110-1301, USA. |
||||
|
|
||||
|
;;; Code: |
||||
|
|
||||
|
(defcustom wrangler-path nil |
||||
|
"*The location of wrangler elisp directory" |
||||
|
:group 'prelude-erlang |
||||
|
:type 'string |
||||
|
:safe 'stringp) |
||||
|
|
||||
|
(when (require 'erlang-start nil t) |
||||
|
|
||||
|
(eval-after-load 'erlang-mode |
||||
|
'(progn |
||||
|
(flymake-mode))) |
||||
|
|
||||
|
(when (not (null wrangler-path)) |
||||
|
(add-to-list 'load-path wrangler-path) |
||||
|
(require 'wrangler))) |
||||
|
|
||||
|
(provide 'prelude-erlang) |
||||
|
|
||||
|
;;; prelude-erlang.el ends here |
||||
@ -0,0 +1,448 @@ |
|||||
|
;; |
||||
|
;; %CopyrightBegin% |
||||
|
;; |
||||
|
;; Copyright Ericsson AB 2009-2010. All Rights Reserved. |
||||
|
;; |
||||
|
;; The contents of this file are subject to the Erlang Public License, |
||||
|
;; Version 1.1, (the "License"); you may not use this file except in |
||||
|
;; compliance with the License. You should have received a copy of the |
||||
|
;; Erlang Public License along with this software. If not, it can be |
||||
|
;; retrieved online at http://www.erlang.org/. |
||||
|
;; |
||||
|
;; Software distributed under the License is distributed on an "AS IS" |
||||
|
;; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See |
||||
|
;; the License for the specific language governing rights and limitations |
||||
|
;; under the License. |
||||
|
;; |
||||
|
;; %CopyrightEnd% |
||||
|
;;; |
||||
|
;;; Purpose: Provide EUnit utilities. |
||||
|
;;; |
||||
|
;;; Author: Klas Johansson |
||||
|
|
||||
|
(eval-when-compile |
||||
|
(require 'cl)) |
||||
|
|
||||
|
(defvar erlang-eunit-src-candidate-dirs '("../src" ".") |
||||
|
"*Name of directories which to search for source files matching |
||||
|
an EUnit test file. The first directory in the list will be used, |
||||
|
if there is no match.") |
||||
|
|
||||
|
(defvar erlang-eunit-test-candidate-dirs '("../test" ".") |
||||
|
"*Name of directories which to search for EUnit test files matching |
||||
|
a source file. The first directory in the list will be used, |
||||
|
if there is no match.") |
||||
|
|
||||
|
(defvar erlang-eunit-autosave nil |
||||
|
"*Set to non-nil to automtically save unsaved buffers before running tests. |
||||
|
This is useful, reducing the save-compile-load-test cycle to one keychord.") |
||||
|
|
||||
|
(defvar erlang-eunit-recent-info '((mode . nil) (module . nil) (test . nil) (cover . nil)) |
||||
|
"Info about the most recent running of an EUnit test representation.") |
||||
|
|
||||
|
;;; |
||||
|
;;; Switch between src/EUnit test buffers |
||||
|
;;; |
||||
|
(defun erlang-eunit-toggle-src-and-test-file-other-window () |
||||
|
"Switch to the src file if the EUnit test file is the current |
||||
|
buffer and vice versa" |
||||
|
(interactive) |
||||
|
(if (erlang-eunit-test-file-p buffer-file-name) |
||||
|
(erlang-eunit-open-src-file-other-window buffer-file-name) |
||||
|
(erlang-eunit-open-test-file-other-window buffer-file-name))) |
||||
|
|
||||
|
;;; |
||||
|
;;; Open the EUnit test file which corresponds to a src file |
||||
|
;;; |
||||
|
(defun erlang-eunit-open-test-file-other-window (src-file-path) |
||||
|
"Open the EUnit test file which corresponds to a src file" |
||||
|
(find-file-other-window (erlang-eunit-test-filename src-file-path))) |
||||
|
|
||||
|
;;; |
||||
|
;;; Open the src file which corresponds to the an EUnit test file |
||||
|
;;; |
||||
|
(defun erlang-eunit-open-src-file-other-window (test-file-path) |
||||
|
"Open the src file which corresponds to the an EUnit test file" |
||||
|
(find-file-other-window (erlang-eunit-src-filename test-file-path))) |
||||
|
|
||||
|
;;; Return the name and path of the EUnit test file |
||||
|
;;, (input may be either the source filename itself or the EUnit test filename) |
||||
|
(defun erlang-eunit-test-filename (file-path) |
||||
|
(if (erlang-eunit-test-file-p file-path) |
||||
|
file-path |
||||
|
(erlang-eunit-rewrite-filename file-path erlang-eunit-test-candidate-dirs))) |
||||
|
|
||||
|
;;; Return the name and path of the source file |
||||
|
;;, (input may be either the source filename itself or the EUnit test filename) |
||||
|
(defun erlang-eunit-src-filename (file-path) |
||||
|
(if (erlang-eunit-src-file-p file-path) |
||||
|
file-path |
||||
|
(erlang-eunit-rewrite-filename file-path erlang-eunit-src-candidate-dirs))) |
||||
|
|
||||
|
;;; Rewrite a filename from the src or test filename to the other |
||||
|
(defun erlang-eunit-rewrite-filename (orig-file-path candidate-dirs) |
||||
|
(or (erlang-eunit-locate-buddy orig-file-path candidate-dirs) |
||||
|
(erlang-eunit-buddy-file-path orig-file-path (car candidate-dirs)))) |
||||
|
|
||||
|
;;; Search for a file's buddy file (a source file's EUnit test file, |
||||
|
;;; or an EUnit test file's source file) in a list of candidate |
||||
|
;;; directories. |
||||
|
(defun erlang-eunit-locate-buddy (orig-file-path candidate-dirs) |
||||
|
(when candidate-dirs |
||||
|
(let ((buddy-file-path (erlang-eunit-buddy-file-path |
||||
|
orig-file-path |
||||
|
(car candidate-dirs)))) |
||||
|
(if (file-readable-p buddy-file-path) |
||||
|
buddy-file-path |
||||
|
(erlang-eunit-locate-buddy orig-file-path (cdr candidate-dirs)))))) |
||||
|
|
||||
|
(defun erlang-eunit-buddy-file-path (orig-file-path buddy-dir-name) |
||||
|
(let* ((orig-dir-name (file-name-directory orig-file-path)) |
||||
|
(buddy-dir-name (file-truename |
||||
|
(filename-join orig-dir-name buddy-dir-name))) |
||||
|
(buddy-base-name (erlang-eunit-buddy-basename orig-file-path))) |
||||
|
(filename-join buddy-dir-name buddy-base-name))) |
||||
|
|
||||
|
;;; Return the basename of the buddy file: |
||||
|
;;; /tmp/foo/src/x.erl --> x_tests.erl |
||||
|
;;; /tmp/foo/test/x_tests.erl --> x.erl |
||||
|
(defun erlang-eunit-buddy-basename (file-path) |
||||
|
(let ((src-module-name (erlang-eunit-source-module-name file-path))) |
||||
|
(cond |
||||
|
((erlang-eunit-src-file-p file-path) |
||||
|
(concat src-module-name "_tests.erl")) |
||||
|
((erlang-eunit-test-file-p file-path) |
||||
|
(concat src-module-name ".erl"))))) |
||||
|
|
||||
|
;;; Checks whether a file is a source file or not |
||||
|
(defun erlang-eunit-src-file-p (file-path) |
||||
|
(not (erlang-eunit-test-file-p file-path))) |
||||
|
|
||||
|
;;; Checks whether a file is a EUnit test file or not |
||||
|
(defun erlang-eunit-test-file-p (file-path) |
||||
|
(erlang-eunit-string-match-p "^\\(.+\\)_tests.erl$" file-path)) |
||||
|
|
||||
|
;;; Return the module name of the source file |
||||
|
;;; /tmp/foo/src/x.erl --> x |
||||
|
;;; /tmp/foo/test/x_tests.erl --> x |
||||
|
(defun erlang-eunit-source-module-name (file-path) |
||||
|
(interactive) |
||||
|
(let ((module-name (erlang-eunit-module-name file-path))) |
||||
|
(if (string-match "^\\(.+\\)_tests$" module-name) |
||||
|
(substring module-name (match-beginning 1) (match-end 1)) |
||||
|
module-name))) |
||||
|
|
||||
|
;;; Return the module name of the file |
||||
|
;;; /tmp/foo/src/x.erl --> x |
||||
|
;;; /tmp/foo/test/x_tests.erl --> x_tests |
||||
|
(defun erlang-eunit-module-name (file-path) |
||||
|
(interactive) |
||||
|
(file-name-sans-extension (file-name-nondirectory file-path))) |
||||
|
|
||||
|
;;; Older emacsen don't have string-match-p. |
||||
|
(defun erlang-eunit-string-match-p (regexp string &optional start) |
||||
|
(if (fboundp 'string-match-p) ;; appeared in emacs 23 |
||||
|
(string-match-p regexp string start) |
||||
|
(save-match-data ;; fallback for earlier versions of emacs |
||||
|
(string-match regexp string start)))) |
||||
|
|
||||
|
;;; Join filenames |
||||
|
(defun filename-join (dir file) |
||||
|
(if (or (= (elt file 0) ?/) |
||||
|
(= (car (last (append dir nil))) ?/)) |
||||
|
(concat dir file) |
||||
|
(concat dir "/" file))) |
||||
|
|
||||
|
;;; Get info about the most recent running of EUnit |
||||
|
(defun erlang-eunit-recent (key) |
||||
|
(cdr (assq key erlang-eunit-recent-info))) |
||||
|
|
||||
|
;;; Record info about the most recent running of EUnit |
||||
|
;;; Known modes are 'module-mode and 'test-mode |
||||
|
(defun erlang-eunit-record-recent (mode module test) |
||||
|
(setcdr (assq 'mode erlang-eunit-recent-info) mode) |
||||
|
(setcdr (assq 'module erlang-eunit-recent-info) module) |
||||
|
(setcdr (assq 'test erlang-eunit-recent-info) test)) |
||||
|
|
||||
|
;;; Record whether the most recent running of EUnit included cover |
||||
|
;;; compilation |
||||
|
(defun erlang-eunit-record-recent-compile (under-cover) |
||||
|
(setcdr (assq 'cover erlang-eunit-recent-info) under-cover)) |
||||
|
|
||||
|
;;; Determine options for EUnit. |
||||
|
(defun erlang-eunit-opts () |
||||
|
(if current-prefix-arg ", [verbose]" "")) |
||||
|
|
||||
|
;;; Determine current test function |
||||
|
(defun erlang-eunit-current-test () |
||||
|
(save-excursion |
||||
|
(erlang-end-of-function 1) |
||||
|
(erlang-beginning-of-function 1) |
||||
|
(erlang-name-of-function))) |
||||
|
|
||||
|
(defun erlang-eunit-simple-test-p (test-name) |
||||
|
(if (erlang-eunit-string-match-p "^\\(.+\\)_test$" test-name) t nil)) |
||||
|
|
||||
|
(defun erlang-eunit-test-generator-p (test-name) |
||||
|
(if (erlang-eunit-string-match-p "^\\(.+\\)_test_$" test-name) t nil)) |
||||
|
|
||||
|
;;; Run one EUnit test |
||||
|
(defun erlang-eunit-run-test (module-name test-name) |
||||
|
(let ((command |
||||
|
(cond ((erlang-eunit-simple-test-p test-name) |
||||
|
(format "eunit:test({%s, %s}%s)." |
||||
|
module-name test-name (erlang-eunit-opts))) |
||||
|
((erlang-eunit-test-generator-p test-name) |
||||
|
(format "eunit:test({generator, %s, %s}%s)." |
||||
|
module-name test-name (erlang-eunit-opts))) |
||||
|
(t (format "%% WARNING: '%s' is not a test function" test-name))))) |
||||
|
(erlang-eunit-record-recent 'test-mode module-name test-name) |
||||
|
(erlang-eunit-inferior-erlang-send-command command))) |
||||
|
|
||||
|
;;; Run EUnit tests for the current module |
||||
|
(defun erlang-eunit-run-module-tests (module-name) |
||||
|
(let ((command (format "eunit:test(%s%s)." module-name (erlang-eunit-opts)))) |
||||
|
(erlang-eunit-record-recent 'module-mode module-name nil) |
||||
|
(erlang-eunit-inferior-erlang-send-command command))) |
||||
|
|
||||
|
(defun erlang-eunit-compile-and-run-recent () |
||||
|
"Compile the source and test files and repeat the most recent EUnit test run. |
||||
|
|
||||
|
With prefix arg, compiles for debug and runs tests with the verbose flag set." |
||||
|
(interactive) |
||||
|
(case (erlang-eunit-recent 'mode) |
||||
|
('test-mode |
||||
|
(erlang-eunit-compile-and-test |
||||
|
'erlang-eunit-run-test (list (erlang-eunit-recent 'module) |
||||
|
(erlang-eunit-recent 'test)))) |
||||
|
('module-mode |
||||
|
(erlang-eunit-compile-and-test |
||||
|
'erlang-eunit-run-module-tests (list (erlang-eunit-recent 'module)) |
||||
|
(erlang-eunit-recent 'cover))) |
||||
|
(t (error "EUnit has not yet been run. Please run a test first.")))) |
||||
|
|
||||
|
(defun erlang-eunit-cover-compile () |
||||
|
"Cover compile current module." |
||||
|
(interactive) |
||||
|
(let* ((erlang-compile-extra-opts |
||||
|
(append (list 'debug_info) erlang-compile-extra-opts)) |
||||
|
(module-name |
||||
|
(erlang-add-quotes-if-needed |
||||
|
(erlang-eunit-module-name buffer-file-name))) |
||||
|
(compile-command |
||||
|
(format "cover:compile_beam(%s)." module-name))) |
||||
|
(erlang-compile) |
||||
|
(if (erlang-eunit-last-compilation-successful-p) |
||||
|
(erlang-eunit-inferior-erlang-send-command compile-command)))) |
||||
|
|
||||
|
(defun erlang-eunit-analyze-coverage () |
||||
|
"Analyze the data collected by cover tool for the module in the |
||||
|
current buffer. |
||||
|
|
||||
|
Assumes that the module has been cover compiled prior to this |
||||
|
call. This function will do two things: print the number of |
||||
|
covered and uncovered functions in the erlang shell and display a |
||||
|
new buffer called *<module name> coverage* which shows the source |
||||
|
code along with the coverage analysis results." |
||||
|
(interactive) |
||||
|
(let* ((module-name (erlang-add-quotes-if-needed |
||||
|
(erlang-eunit-module-name buffer-file-name))) |
||||
|
(tmp-filename (make-temp-file "cover")) |
||||
|
(analyze-command (format "cover:analyze_to_file(%s, \"%s\"). " |
||||
|
module-name tmp-filename)) |
||||
|
(buf-name (format "*%s coverage*" module-name))) |
||||
|
(erlang-eunit-inferior-erlang-send-command analyze-command) |
||||
|
;; The purpose of the following snippet is to get the result of the |
||||
|
;; analysis from a file into a new buffer (or an old, if one with |
||||
|
;; the specified name already exists). Also we want the erlang-mode |
||||
|
;; *and* view-mode to be enabled. |
||||
|
(save-excursion |
||||
|
(let ((buf (get-buffer-create (format "*%s coverage*" module-name)))) |
||||
|
(set-buffer buf) |
||||
|
(setq buffer-read-only nil) |
||||
|
(insert-file-contents tmp-filename nil nil nil t) |
||||
|
(if (= (buffer-size) 0) |
||||
|
(kill-buffer buf) |
||||
|
;; FIXME: this would be a good place to enable (emacs-mode) |
||||
|
;; to get some nice syntax highlighting in the |
||||
|
;; coverage report, but it doesn't play well with |
||||
|
;; flymake. Leave it off for now. |
||||
|
(view-buffer buf)))) |
||||
|
(delete-file tmp-filename))) |
||||
|
|
||||
|
(defun erlang-eunit-compile-and-run-current-test () |
||||
|
"Compile the source and test files and run the current EUnit test. |
||||
|
|
||||
|
With prefix arg, compiles for debug and runs tests with the verbose flag set." |
||||
|
(interactive) |
||||
|
(let ((module-name (erlang-add-quotes-if-needed |
||||
|
(erlang-eunit-module-name buffer-file-name))) |
||||
|
(test-name (erlang-eunit-current-test))) |
||||
|
(erlang-eunit-compile-and-test |
||||
|
'erlang-eunit-run-test (list module-name test-name)))) |
||||
|
|
||||
|
(defun erlang-eunit-compile-and-run-module-tests () |
||||
|
"Compile the source and test files and run all EUnit tests in the module. |
||||
|
|
||||
|
With prefix arg, compiles for debug and runs tests with the verbose flag set." |
||||
|
(interactive) |
||||
|
(let ((module-name (erlang-add-quotes-if-needed |
||||
|
(erlang-eunit-source-module-name buffer-file-name)))) |
||||
|
(erlang-eunit-compile-and-test |
||||
|
'erlang-eunit-run-module-tests (list module-name)))) |
||||
|
|
||||
|
;;; Compile source and EUnit test file and finally run EUnit tests for |
||||
|
;;; the current module |
||||
|
(defun erlang-eunit-compile-and-test (test-fun test-args &optional under-cover) |
||||
|
"Compile the source and test files and run the EUnit test suite. |
||||
|
|
||||
|
If under-cover is set to t, the module under test is compile for |
||||
|
code coverage analysis. If under-cover is left out or not set, |
||||
|
coverage analysis is disabled. The result of the code coverage |
||||
|
is both printed to the erlang shell (the number of covered vs |
||||
|
uncovered functions in a module) and written to a buffer called |
||||
|
*<module> coverage* (which shows the source code for the module |
||||
|
and the number of times each line is covered). |
||||
|
With prefix arg, compiles for debug and runs tests with the verbose flag set." |
||||
|
(erlang-eunit-record-recent-compile under-cover) |
||||
|
(let ((src-filename (erlang-eunit-src-filename buffer-file-name)) |
||||
|
(test-filename (erlang-eunit-test-filename buffer-file-name))) |
||||
|
|
||||
|
;; The purpose of out-maneuvering `save-some-buffers', as is done |
||||
|
;; below, is to ask the question about saving buffers only once, |
||||
|
;; instead of possibly several: one for each file to compile, |
||||
|
;; for instance for both x.erl and x_tests.erl. |
||||
|
(save-some-buffers erlang-eunit-autosave) |
||||
|
(flet ((save-some-buffers (&optional any) nil)) |
||||
|
|
||||
|
;; Compilation of the source file is mandatory (the file must |
||||
|
;; exist, otherwise the procedure is aborted). Compilation of the |
||||
|
;; test file on the other hand, is optional, since eunit tests may |
||||
|
;; be placed in the source file instead. Any compilation error |
||||
|
;; will prevent the subsequent steps to be run (hence the `and') |
||||
|
(and (erlang-eunit-compile-file src-filename under-cover) |
||||
|
(if (file-readable-p test-filename) |
||||
|
(erlang-eunit-compile-file test-filename) |
||||
|
t) |
||||
|
(apply test-fun test-args) |
||||
|
(if under-cover |
||||
|
(save-excursion |
||||
|
(set-buffer (find-file-noselect src-filename)) |
||||
|
(erlang-eunit-analyze-coverage))))))) |
||||
|
|
||||
|
(defun erlang-eunit-compile-and-run-module-tests-under-cover () |
||||
|
"Compile the source and test files and run the EUnit test suite and measure |
||||
|
code coverage. |
||||
|
|
||||
|
With prefix arg, compiles for debug and runs tests with the verbose flag set." |
||||
|
(interactive) |
||||
|
(let ((module-name (erlang-add-quotes-if-needed |
||||
|
(erlang-eunit-source-module-name buffer-file-name)))) |
||||
|
(erlang-eunit-compile-and-test |
||||
|
'erlang-eunit-run-module-tests (list module-name) t))) |
||||
|
|
||||
|
(defun erlang-eunit-compile-file (file-path &optional under-cover) |
||||
|
(if (file-readable-p file-path) |
||||
|
(save-excursion |
||||
|
(set-buffer (find-file-noselect file-path)) |
||||
|
;; In order to run a code coverage analysis on a |
||||
|
;; module, we have two options: |
||||
|
;; |
||||
|
;; * either compile the module with cover:compile instead of the |
||||
|
;; regular compiler |
||||
|
;; |
||||
|
;; * or first compile the module with the regular compiler (but |
||||
|
;; *with* debug_info) and then compile it for coverage |
||||
|
;; analysis using cover:compile_beam. |
||||
|
;; |
||||
|
;; We could accomplish the first by changing the |
||||
|
;; erlang-compile-erlang-function to cover:compile, but there's |
||||
|
;; a risk that that's used for other purposes. Therefore, a |
||||
|
;; safer alternative (although with more steps) is to add |
||||
|
;; debug_info to the list of compiler options and go for the |
||||
|
;; second alternative. |
||||
|
(if under-cover |
||||
|
(erlang-eunit-cover-compile) |
||||
|
(erlang-compile)) |
||||
|
(erlang-eunit-last-compilation-successful-p)) |
||||
|
(let ((msg (format "Could not read %s" file-path))) |
||||
|
(erlang-eunit-inferior-erlang-send-command |
||||
|
(format "%% WARNING: %s" msg)) |
||||
|
(error msg)))) |
||||
|
|
||||
|
(defun erlang-eunit-last-compilation-successful-p () |
||||
|
(save-excursion |
||||
|
(set-buffer inferior-erlang-buffer) |
||||
|
(goto-char compilation-parsing-end) |
||||
|
(erlang-eunit-all-list-elems-fulfill-p |
||||
|
(lambda (re) (let ((continue t) |
||||
|
(result t)) |
||||
|
(while continue ; ignore warnings, stop at errors |
||||
|
(if (re-search-forward re (point-max) t) |
||||
|
(if (erlang-eunit-is-compilation-warning) |
||||
|
t |
||||
|
(setq result nil) |
||||
|
(setq continue nil)) |
||||
|
(setq result t) |
||||
|
(setq continue nil))) |
||||
|
result)) |
||||
|
(mapcar (lambda (e) (car e)) erlang-error-regexp-alist)))) |
||||
|
|
||||
|
(defun erlang-eunit-is-compilation-warning () |
||||
|
(erlang-eunit-string-match-p |
||||
|
"[0-9]+: Warning:" |
||||
|
(buffer-substring (line-beginning-position) (line-end-position)))) |
||||
|
|
||||
|
(defun erlang-eunit-all-list-elems-fulfill-p (pred list) |
||||
|
(let ((matches-p t)) |
||||
|
(while (and list matches-p) |
||||
|
(if (not (funcall pred (car list))) |
||||
|
(setq matches-p nil)) |
||||
|
(setq list (cdr list))) |
||||
|
matches-p)) |
||||
|
|
||||
|
;;; Evaluate a command in an erlang buffer |
||||
|
(defun erlang-eunit-inferior-erlang-send-command (command) |
||||
|
"Evaluate a command in an erlang buffer." |
||||
|
(interactive "P") |
||||
|
(inferior-erlang-prepare-for-input) |
||||
|
(inferior-erlang-send-command command) |
||||
|
(sit-for 0) ;; redisplay |
||||
|
(inferior-erlang-wait-prompt)) |
||||
|
|
||||
|
|
||||
|
;;;==================================================================== |
||||
|
;;; Key bindings |
||||
|
;;;==================================================================== |
||||
|
|
||||
|
(defconst erlang-eunit-key-bindings |
||||
|
'(("\C-c\C-et" erlang-eunit-toggle-src-and-test-file-other-window) |
||||
|
("\C-c\C-ek" erlang-eunit-compile-and-run-module-tests) |
||||
|
("\C-c\C-ej" erlang-eunit-compile-and-run-current-test) |
||||
|
("\C-c\C-el" erlang-eunit-compile-and-run-recent) |
||||
|
("\C-c\C-ec" erlang-eunit-compile-and-run-module-tests-under-cover) |
||||
|
("\C-c\C-ev" erlang-eunit-cover-compile) |
||||
|
("\C-c\C-ea" erlang-eunit-analyze-coverage))) |
||||
|
|
||||
|
(defun erlang-eunit-add-key-bindings () |
||||
|
(dolist (binding erlang-eunit-key-bindings) |
||||
|
(erlang-eunit-bind-key (car binding) (cadr binding)))) |
||||
|
|
||||
|
(defun erlang-eunit-bind-key (key function) |
||||
|
(erlang-eunit-ensure-keymap-for-key key) |
||||
|
(local-set-key key function)) |
||||
|
|
||||
|
(defun erlang-eunit-ensure-keymap-for-key (key-seq) |
||||
|
(let ((prefix-keys (butlast (append key-seq nil))) |
||||
|
(prefix-seq "")) |
||||
|
(while prefix-keys |
||||
|
(setq prefix-seq (concat prefix-seq (make-string 1 (car prefix-keys)))) |
||||
|
(setq prefix-keys (cdr prefix-keys)) |
||||
|
(if (not (keymapp (lookup-key (current-local-map) prefix-seq))) |
||||
|
(local-set-key prefix-seq (make-sparse-keymap)))))) |
||||
|
|
||||
|
(add-hook 'erlang-mode-hook 'erlang-eunit-add-key-bindings) |
||||
|
|
||||
|
|
||||
|
(provide 'erlang-eunit) |
||||
|
;; erlang-eunit ends here |
||||
@ -0,0 +1,103 @@ |
|||||
|
;; erlang-flymake.el |
||||
|
;; |
||||
|
;; Syntax check erlang source code on the fly (integrates with flymake). |
||||
|
;; |
||||
|
;; Start using flymake with erlang by putting the following somewhere |
||||
|
;; in your .emacs file: |
||||
|
;; |
||||
|
;; (require 'erlang-flymake) |
||||
|
;; |
||||
|
;; Flymake is rather eager and does its syntax checks frequently by |
||||
|
;; default and if you are bothered by this, you might want to put the |
||||
|
;; following in your .emacs as well: |
||||
|
;; |
||||
|
;; (erlang-flymake-only-on-save) |
||||
|
;; |
||||
|
;; There are a couple of variables which control the compilation options: |
||||
|
;; * erlang-flymake-get-code-path-dirs-function |
||||
|
;; * erlang-flymake-get-include-dirs-function |
||||
|
;; * erlang-flymake-extra-opts |
||||
|
;; |
||||
|
;; This code is inspired by http://www.emacswiki.org/emacs/FlymakeErlang. |
||||
|
|
||||
|
(require 'flymake) |
||||
|
(eval-when-compile |
||||
|
(require 'cl)) |
||||
|
|
||||
|
(defvar erlang-flymake-command |
||||
|
"erlc" |
||||
|
"The command that will be used to perform the syntax check") |
||||
|
|
||||
|
(defvar erlang-flymake-get-code-path-dirs-function |
||||
|
'erlang-flymake-get-code-path-dirs |
||||
|
"Return a list of ebin directories to add to the code path.") |
||||
|
|
||||
|
(defvar erlang-flymake-get-include-dirs-function |
||||
|
'erlang-flymake-get-include-dirs |
||||
|
"Return a list of include directories to add to the compiler options.") |
||||
|
|
||||
|
(defvar erlang-flymake-extra-opts |
||||
|
(list "+warn_obsolete_guard" |
||||
|
"+warn_unused_import" |
||||
|
"+warn_shadow_vars" |
||||
|
"+warn_export_vars" |
||||
|
"+strong_validation" |
||||
|
"+report") |
||||
|
"A list of options that will be passed to the compiler") |
||||
|
|
||||
|
(defun erlang-flymake-only-on-save () |
||||
|
"Trigger flymake only when the buffer is saved (disables syntax |
||||
|
check on newline and when there are no changes)." |
||||
|
(interactive) |
||||
|
;; There doesn't seem to be a way of disabling this; set to the |
||||
|
;; largest int available as a workaround (most-positive-fixnum |
||||
|
;; equates to 8.5 years on my machine, so it ought to be enough ;-) ) |
||||
|
(setq flymake-no-changes-timeout most-positive-fixnum) |
||||
|
(setq flymake-start-syntax-check-on-newline nil)) |
||||
|
|
||||
|
|
||||
|
(defun erlang-flymake-get-code-path-dirs () |
||||
|
(list (concat (erlang-flymake-get-app-dir) "ebin"))) |
||||
|
|
||||
|
(defun erlang-flymake-get-include-dirs () |
||||
|
(list (concat (erlang-flymake-get-app-dir) "include") |
||||
|
(concat (erlang-flymake-get-app-dir) "deps"))) |
||||
|
|
||||
|
(defun erlang-flymake-get-app-dir () |
||||
|
(let ((src-path (file-name-directory (buffer-file-name)))) |
||||
|
(file-name-directory (directory-file-name src-path)))) |
||||
|
|
||||
|
(defun erlang-flymake-init () |
||||
|
(let* ((temp-file |
||||
|
(flet ((flymake-get-temp-dir () (erlang-flymake-temp-dir))) |
||||
|
(flymake-init-create-temp-buffer-copy |
||||
|
'flymake-create-temp-with-folder-structure))) |
||||
|
(code-dir-opts |
||||
|
(erlang-flymake-flatten |
||||
|
(mapcar (lambda (dir) (list "-pa" dir)) |
||||
|
(funcall erlang-flymake-get-code-path-dirs-function)))) |
||||
|
(inc-dir-opts |
||||
|
(erlang-flymake-flatten |
||||
|
(mapcar (lambda (dir) (list "-I" dir)) |
||||
|
(funcall erlang-flymake-get-include-dirs-function)))) |
||||
|
(compile-opts |
||||
|
(append inc-dir-opts |
||||
|
code-dir-opts |
||||
|
erlang-flymake-extra-opts))) |
||||
|
(list erlang-flymake-command (append compile-opts (list temp-file))))) |
||||
|
|
||||
|
(defun erlang-flymake-temp-dir () |
||||
|
;; Squeeze the user's name in there in order to make sure that files |
||||
|
;; for two users who are working on the same computer (like a linux |
||||
|
;; box) don't collide |
||||
|
(format "%s/flymake-%s" temporary-file-directory user-login-name)) |
||||
|
|
||||
|
(defun erlang-flymake-flatten (list) |
||||
|
(apply #'append list)) |
||||
|
|
||||
|
(add-to-list 'flymake-allowed-file-name-masks |
||||
|
'("\\.erl\\'" erlang-flymake-init)) |
||||
|
(add-hook 'erlang-mode-hook 'flymake-mode) |
||||
|
|
||||
|
(provide 'erlang-flymake) |
||||
|
;; erlang-flymake ends here |
||||
1267
vendor/erlang/erlang-skels-old.el
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1553
vendor/erlang/erlang-skels.el
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,121 @@ |
|||||
|
;; erlang-start.el --- Load this file to initialize the Erlang package. |
||||
|
|
||||
|
;; Copyright (C) 1998 Ericsson Telecom AB |
||||
|
|
||||
|
;; Author: Anders Lindgren |
||||
|
;; Version: 2.3 |
||||
|
;; Keywords: erlang, languages, processes |
||||
|
;; Created: 1996-09-18 |
||||
|
;; Date: 1998-03-16 |
||||
|
|
||||
|
;;; Commentary: |
||||
|
|
||||
|
;; Introduction: |
||||
|
;; ------------ |
||||
|
;; |
||||
|
;; This package provides support for the programming language Erlang. |
||||
|
;; The package provides an editing mode with lots of bells and |
||||
|
;; whistles, compilation support, and it makes it possible for the |
||||
|
;; user to start Erlang shells that run inside Emacs. |
||||
|
;; |
||||
|
;; See the Erlang distribution for full documentation of this package. |
||||
|
|
||||
|
;; Installation: |
||||
|
;; ------------ |
||||
|
;; |
||||
|
;; Place this file in Emacs load path, byte-compile it, and add the |
||||
|
;; following line to the appropriate init file: |
||||
|
;; |
||||
|
;; (require 'erlang-start) |
||||
|
;; |
||||
|
;; The full documentation contains much more extensive description of |
||||
|
;; the installation procedure. |
||||
|
|
||||
|
;; Reporting Bugs: |
||||
|
;; -------------- |
||||
|
;; |
||||
|
;; Please send bug reports to the following email address: |
||||
|
;; support@erlang.ericsson.se |
||||
|
;; |
||||
|
;; Please state as exactly as possible: |
||||
|
;; - Version number of Erlang Mode (see the menu), Emacs, Erlang, |
||||
|
;; and of any other relevant software. |
||||
|
;; - What the expected result was. |
||||
|
;; - What you did, preferably in a repeatable step-by-step form. |
||||
|
;; - A description of the unexpected result. |
||||
|
;; - Relevant pieces of Erlang code causing the problem. |
||||
|
;; - Personal Emacs customisations, if any. |
||||
|
;; |
||||
|
;; Should the Emacs generate an error, please set the emacs variable |
||||
|
;; `debug-on-error' to `t'. Repeat the error and enclose the debug |
||||
|
;; information in your bug-report. |
||||
|
;; |
||||
|
;; To set the variable you can use the following command: |
||||
|
;; M-x set-variable RET debug-on-error RET t RET |
||||
|
|
||||
|
;;; Code: |
||||
|
|
||||
|
;; |
||||
|
;; Declare functions in "erlang.el". |
||||
|
;; |
||||
|
|
||||
|
(autoload 'erlang-mode "erlang" "Major mode for editing Erlang code." t) |
||||
|
(autoload 'erlang-version "erlang" |
||||
|
"Return the current version of Erlang mode." t) |
||||
|
(autoload 'erlang-shell "erlang" "Start a new Erlang shell." t) |
||||
|
(autoload 'run-erlang "erlang" "Start a new Erlang shell." t) |
||||
|
|
||||
|
(autoload 'erlang-compile "erlang" |
||||
|
"Compile Erlang module in current buffer." t) |
||||
|
|
||||
|
(autoload 'erlang-man-module "erlang" |
||||
|
"Find manual page for MODULE." t) |
||||
|
(autoload 'erlang-man-function "erlang" |
||||
|
"Find manual page for NAME, where NAME is module:function." t) |
||||
|
|
||||
|
(autoload 'erlang-find-tag "erlang" |
||||
|
"Like `find-tag'. Capable of retreiving Erlang modules.") |
||||
|
(autoload 'erlang-find-tag-other-window "erlang" |
||||
|
"Like `find-tag-other-window'. Capable of retreiving Erlang modules.") |
||||
|
|
||||
|
|
||||
|
;; |
||||
|
;; Associate files extensions ".erl" and ".hrl" with Erlang mode. |
||||
|
;; |
||||
|
|
||||
|
(let ((a '("\\.erl\\'" . erlang-mode)) |
||||
|
(b '("\\.hrl\\'" . erlang-mode))) |
||||
|
(or (assoc (car a) auto-mode-alist) |
||||
|
(setq auto-mode-alist (cons a auto-mode-alist))) |
||||
|
(or (assoc (car b) auto-mode-alist) |
||||
|
(setq auto-mode-alist (cons b auto-mode-alist)))) |
||||
|
|
||||
|
;; |
||||
|
;; Associate files using interpreter "escript" with Erlang mode. |
||||
|
;; |
||||
|
|
||||
|
(add-to-list 'interpreter-mode-alist (cons "escript" 'erlang-mode)) |
||||
|
|
||||
|
;; |
||||
|
;; Ignore files ending in ".jam", ".vee", and ".beam" when performing |
||||
|
;; file completion. |
||||
|
;; |
||||
|
|
||||
|
(let ((erl-ext '(".jam" ".vee" ".beam"))) |
||||
|
(while erl-ext |
||||
|
(let ((cie completion-ignored-extensions)) |
||||
|
(while (and cie (not (string-equal (car cie) (car erl-ext)))) |
||||
|
(setq cie (cdr cie))) |
||||
|
(if (null cie) |
||||
|
(setq completion-ignored-extensions |
||||
|
(cons (car erl-ext) completion-ignored-extensions)))) |
||||
|
(setq erl-ext (cdr erl-ext)))) |
||||
|
|
||||
|
|
||||
|
;; |
||||
|
;; The end. |
||||
|
;; |
||||
|
|
||||
|
(provide 'erlang-start) |
||||
|
|
||||
|
;; erlang-start.el ends here. |
||||
5585
vendor/erlang/erlang.el
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1345
vendor/erlang/erlang_appwiz.el
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue