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
Comments
I’m going to read distel.info, thanks for making this easy
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.
If you got error like this
can’t find include lib “kernel/include/file.hrl”
then do
sudo apt-get install erlang-dev
Hi,
what is the key-binding to access the menu bar in emacs/distel?
Thanks,
Moahmed