Umm… did I mention that I yearn for hacking Erlang code, too? Following Bill Clementson’s lead, I set up Emacs+Erlang on my Ubuntu hardy box.
Step 1: Install erlang and erlang-mode
I used the version of erlang and erlang-mode for emacs in Ubuntu’s repositories. I might come to regret it some day, but for now the following was just too simple to resist:
$ sudo aptitude install erlang # The above will install erlang-mode too; # if it does not just "apt-get install erlang-mode"
Step 2: Configure erlang-mode in Emacs
I just put the following in my .emacs:
;; Erlang-mode
(require 'erlang-start)
(add-to-hook 'erlang-mode-hook
(lambda ()
;; when starting an Erlang shell in Emacs, the node name
;; by default should be "emacs"
(setq inferior-erlang-machine-options '("-sname" "emacs"))
;; add Erlang functions to an imenu menu
(imenu-add-to-menubar "imenu")))
Now I can launch Emacs and open an erlang file, which puts me in Erlang mode. I can start and Erlang shell with “C-c C-z”, compile the Erlang code with “C-c C-k”, and view the compilation result in the Erlang buffer (if the buffer is hidden) with “C-c C-l”. Or, I can just switch to the Erlang shell with “C-c C-z”. The customizations above enable me to get a menu item in the Emacs menubar with a list of functions defined in the file I am visiting, which is a big help. I am used to “ecb-mode” when coding Python; ECB does not grok Erlang yet, so the imenu is a handy substitute when coding Erlang.
Step 3: Install Distel
Distel is to Erlang and erlang-mode what SLIME is to Lisp and lisp-mode.
To get distel:
$ cd ~/.emacs.d/
$ svn co http://distel.googlecode.com/svn/trunk/ distel
$ cd distel
$ make
$ cd doc
$ make postscript && make postscript # must run twice
$ make info && sudo make install # install the Info documentation
$ info distel # read the distel info documentation
Step 4: Configure Emacs to use Distel
I just need to put this in my .emacs:
(push "/home/parijat/.emacs.d/distel/elisp/" load-path) (require 'distel) (distel-setup)
Step 5: Configure Erlang
Distel is designed to work in a distributed Erlang system. It can connect to specified Erlang nodes. My strategy is to use the standard erlang-mode command “C-c C-z” to start an Erlang shell, and connect to it using Distel by “C-c C-d n”. The latter asks for a nodename, which is going to be “emacs@beowulf” (because beowulf is the short hostname of my laptop).
But before we start using remote Erlang nodes, we should create on each physical machine that we will use a ~/.erlang.cookie file with a password, for inter-Erlang node authentication:
$ echo "secret" > ~/.erlang.cookie $ chmod 0400 ~/.erlang.cookie
Step 6: Play with Distel
So, now we can launch an Erlang node, either via Emacs using “C-c C-z”, or on the command line using “erl -sname mynode”. Then, from within Emacs, we can connect Distel to this node using “C-c C-d n” specifiying the nodename on the prompt. Now we can ask Distel to interrogate the Erlang node for various things.
C-c C-d l ; list erlang processes PID/Name Initial Call Reds Msgs init otp_ring0:start/2 3821 0 erl_prim_loader erlang:apply/2 87239 0 error_logger proc_lib:init_p/5 229 0 application_controlle erlang:apply/2 2501 0 <0.7.0> proc_lib:init_p/5 45 0 <0.8.0> application_master:start_it/4 91 0 kernel_sup proc_lib:init_p/5 1498 0 rex proc_lib:init_p/5 493 0 global_name_server proc_lib:init_p/5 69 0 <0.12.0> erlang:apply/2 25 0 <0.13.0> erlang:apply/2 4 0 <0.14.0> erlang:apply/2 3 0 inet_db proc_lib:init_p/5 129 0 net_sup proc_lib:init_p/5 312 0 erl_epmd proc_lib:init_p/5 147 0
jayapari-spain said
I’m going to read distel.info, thanks for making this easy
sean said
thanks for the advice, I was trying to find info on how to get erlang editing working in emacs on ubuntu and you gave exactly the answer.