注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

游戏记忆...

竹石 Blog

 
 
 

日志

 
 

Emacs和Erlang配置使用  

2012-01-01 15:48:25|  分类: erlang |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
cedet  ecb
 
    cedet-1.0 和 ecb-2.40只能在emacs23.2中使用,不支持23.3,这个问题浪费了一下午Emacs/Erlang配置使用(更新中) - 竹石 - 游戏记忆...
     M-x  ecb-activate  开启ecb
     C-c . l w 显示隐藏ecb窗口

auto-complete
     解压, 打开auto-complete.el,修改(defcustom ac-modes段,增加一个erlang-mode,这一步一定要在下一步的安装前做(为这个搞了好几点Emacs/Erlang配置使用(更新中) - 竹石 - 游戏记忆...)。如果不增加此项,在进入erlang mode后不会自动打开auto-complete-mode,每次都需要手动开启。
     在emacs中,M-x load-file RET   ~/auto-complete-1.2/etc/install.el RET, 并按提示修改.emacs文件。

flymake
       
emacs23.2自带flymake,erlang安装目录下的\lib\tools-2.6.6.5\emacs\erlang-flymake.el已经配置好erlang的语法检查,只需在.emacs文件中添加配置。 
         F3           下一个错误/警告
         C-c F3     上一个错误/警告
         F4            显示当前行的错误消息

(require 'erlang-flymake)

;;仅在存盘时进行检查
(erlang-flymake-only-on-save)

;;键盘映射
(defvar flymake-mode-map (make-sparse-keymap))
(define-key flymake-mode-map (kbd "<f3>") 'flymake-goto-next-error)
(define-key flymake-mode-map (kbd "C-c <f3>") 'flymake-goto-prev-error)
(define-key flymake-mode-map (kbd "<f4>") 'flymake-display-err-menu-for-current-line)
(or (assoc 'flymake-mode minor-mode-map-alist)
(setq minor-mode-map-alist
(cons (cons 'flymake-mode flymake-mode-map)
minor-mode-map-alist)))


cvs

     在cmd下设置cvs root和登录权限
             cd d:/erlang/code                                                          到工作目录下
             set CVSROOT=:pserver:blc@localhost:/cvsdir/game        设置环境变量
             cvs login                                                                        登录
     之后即可在emacs下使用
             M-x  cvs-examine   开启pcl-cvs
      在cvs模式下
              n, p 移动光标。
              f, o, RET 打开当前文件。
              M-s 列出所有文件的当前状态。
              x 在缓冲中去掉所有是 Up-To-Date 的状态的文件,这样比较干净。
              M-u 更新本地拷贝。
              U 放弃所做的改动,小心别把你没有提交的工作弄没了。
              m 标记文件,用于对多个文件同时操作。u 去掉标记并下移;Backspace 去掉标记并上移;M-Backspace 同时去掉 buffer 中所有标记。% 用正 则表达式标记文件。
              c 准备提交所做的改动,会弹出一个 *cvs-commit* 缓冲,用来写修改的 日志,写完完按 C-c C-c,执行提交。如果有标记,同时对所标记的所 有文件相库提交。
              C 和 c 类似,但是清除上次提交时留在 *cvs-commit* 缓冲中的内容,不 过如果当前目录里的 ChangeLog 文件中有相关内容,会自动插入。
             d 有一个提示,询问用哪种方式 diff。此时常用的可能是:
                       d d 或 d =,比较文件,本地拷贝和最后一次提交时的修订版;
                       d h 比较本地拷贝和当前源码库中最新版;
                       d b 比较本地拷贝和该文件的备份;
                       d e 用 ediff 比较文件,本地拷贝和最后一次提交时的修订版。
                       d y 和前一天的比较 r 删除文件,从当前拷贝的工作目录中删除,需要提交。
             a 添加文件,添加到当前拷贝的工作目录中,需要提交。
              i 把某个文件的名字添加到 .cvsignore 文件,这样在运行 cvs 命令时, cvs 不再理会此文件。编辑 .cvsignore 文件,每一行一个或一类文件。 下面是一个 .cvsignore 文件的例子。有些类型的文件 cvs 缺省就是忽 略的,比如 .o 文件。
              t 设置 tag,提示输入 tag 名字。
              l 查看一个文件,所标记的多个文件,或目录文件的 log 信息。
              s 通过 cvs status 命令查看文件或目录的状态,会弹出一个漂亮的 *cvs-info* 缓冲,列出文件的状态信息。
              z, q 关闭 *cvs* 缓冲。

Erlang的makefile

          下载个window下用的gunmake,添加到path里,在src目录下直接运行make。
           emacs中使用M-x compile 回车后输入 :
                             make     编译
                             make debug    编译带debug info的
                             make clean      清除编译结果
############ makefile  放在src目录下####################
## all(默认) 编译
## debug 编译debug版,可以在erlang的debugger使用
## clean 清除编译结果
########################################################

EBIN_DIR=../ebin
INCLUDE_DIR=../include

# 所有erl文件,wildcard关键字会让通配符在变量中展开,即为所有erl文件列表
ERLS=${wildcard *.erl}

# 每个erl文件的编译命令,o输出文件目录,I包含文件目录
all: ERLC=erlc -o $(EBIN_DIR) -I $(INCLUDE_DIR)
debug: ERLC=erlc -o $(EBIN_DIR) -I $(INCLUDE_DIR) +debug_info

# 生成多个目标集,每个erl文件使用对应的beam文件替换,对于每个目标,将使用$(ERLC)进行编译(在下面定义)
BEAMS=$(ERLS:%.erl=$(EBIN_DIR)/%.beam)

.SUFFIXES: .erl .beam

.erl.beam:
$(ERLC) -W $<

ERL = erl -boot start_clean

all: compile
# ${ERL} -pa 'd:/erlang/code/ls/ebin' -s tcp_server start

# debug
debug: compile

$(EBIN_DIR)/%.beam: %.erl
@echo ---- compiling: $<
@$(ERLC) $<

compile: ${BEAMS}

clean:
-del "$(EBIN_DIR)/*.beam" erl_crash.dump
编译输出的文件在ebin下,而在emacs中直接C-c C-z开启的erlang shell的工作目录在src,因此这时在shell中运行函数会提示找不到。在user目录下建个.erlang文件(c:/User/blc/.erlang),加入以下代码解决。

io:format("The init code is in \"c:/User/blc/.erlang\" file.~n").
%% Edit to the directory where you store your code
%% c:cd("D:/erlang/code").
CurPath = element(2, file:get_cwd()).
AddPath = CurPath++"/"++"../ebin".

%% 增加code path
code:add_patha(AddPath).
io:format("add_patha ~p~n", [AddPath]).
io:format("Now work dir is:~p~n" , [element(2,file:get_cwd())]).



全部.emacs配置

;; Erlang mode
(setq load-path (cons "C:/Program Files/erl5.8.5/lib/tools-2.6.6.5/emacs" load-path))
(setq erlang-root-dir "C:/Program Files/erl5.8.5")
(setq exec-path (cons "C:/Program Files/erl5.8.5/bin" exec-path))
(require 'erlang-start)

(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(ecb-options-version "2.40")
'(ecb-source-path (quote ("d:/erlang/code"))))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(default ((t (:inherit nil :stipple nil :background "SystemWindow" :foreground "SystemWindowText" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :height 102 :width normal :foundry "outline" :family "YaHei Consolas Hybrid")))))

;;ido的配置,这个可以使你在用C-x C-f打开文件的时候在后面有提示;
;;这里是直接打开了ido的支持,在emacs23中这个是自带的.
(ido-mode t)

;;关闭烦人的出错时的提示声
(setq visible-bell t)

;;关闭emacs启动时的画面
(setq inhibit-startup-message t)
;;关闭gnus启动时的画面
(setq gnus-inhibit-startup-message t)
;; 改变 Emacs 固执的要你回答 yes 的行为。按 y 或空格键表示 yes,n 表示 no
(fset 'yes-or-no-p 'y-or-n-p)

;;显示行列号
(setq column-number-mode t)
(setq line-number-mode t)
(global-linum-mode 'linum-mode);;在左边显示行号

;;防止页面滚动时跳动, scroll-margin 3 可以在靠近屏幕边沿3行时就开始滚动,可以很好的看到上下文
(setq scroll-margin 3 scroll-conservatively 10000)

;;(setq show-paren-mode t) ;;打开括号匹配显示模式
;;括号匹配时可以高亮显示另外一边的括号,但光标不会烦人的跳到另一个括号处... blc:对erlang无效
;; (setq show-paren-style 'parenthesis)

;;在标题栏显示buffer的名字,而不是 emacs@wangyin.com 这样没用的提示; %b:buffer名; %f:文件名
(setq frame-title-format "emacs@%f")

;; Emacs 中,改变文件时,默认都会产生备份文件(以 ~ 结尾的文件)。可以完全去掉
;; (并不可取),也可以制定备份的方式。这里采用的是,把所有的文件备份都放在一
;; 个固定的地方("~/backups")。对于每个备份文件,保留最原始的两个版本和最新的
;; 1个版本。并且备份的时候,备份文件是复本,而不是原件。
;;(setq version-control t);;启用版本控制,即可以备份多次
;;(setq kept-old-versions 2);;备份最原始的版本两次,及第一次编辑前的文档,和第二次编辑前的文档
;; (setq kept-new-versions 1);;备份最新的版本1次,理解同上
;;(setq delete-old-versions t);;删掉不属于以上3中版本的版本
;;(setq backup-directory-alist '(("." . "~/backups")));;设置备份文件的路径
;;(setq backup-by-copying t);;备份设置方法,直接拷贝

;;不产生备份
(setq backup-inhibited t)

;;自动保存模式
;;(setq auto-save-mode nil)
(setq auto-save-default nil)

;;设置有用的个人信息,这在很多地方有用
(setq user-full-name "白连忱")
(setq user-mail-address "blianchen@163.com")

;; 用M-x执行某个命令的时候,在输入的同时给出可选的命令名提示
(icomplete-mode 1)
(define-key minibuffer-local-completion-map (kbd "SPC") 'minibuffer-complete-word)

(tool-bar-mode nil);去掉那个大大的工具栏

;;emacs的默认compile命令是调用make -k,我把它改成了make
(setq compile-command "make")
(global-set-key [f5] 'compile) ;F5编译文件

;; Distel
(let ((distel-dir "~/distel/elisp"))
(unless (member distel-dir load-path)
(setq load-path (append load-path (list distel-dir)))))
(require 'distel)
(distel-setup)

;; Some Erlang customizations
(add-hook 'erlang-mode-hook
(lambda ()
;; when starting an Erlang shell in Emacs, default in the node name
(setq inferior-erlang-machine-options '("-sname" "emacs"))
;; add Erlang functions to an imenu menu
(imenu-add-to-menubar "imenu")))
;; A number of the erlang-extended-mode key bindings are useful in the shell too
(defconst distel-shell-keys
'(("\C-\M-i" erl-complete)
("\M-?" erl-complete)
("\M-." erl-find-source-under-point)
("\M-," erl-find-source-unwind)
("\M-*" erl-find-source-unwind)
)
"Additional keys to bind when in Erlang shell.")
(add-hook 'erlang-shell-mode-hook
(lambda ()
;; add some Distel bindings to the Erlang shell
(dolist (spec distel-shell-keys)
(define-key erlang-shell-mode-map (car spec) (cadr spec)))))

;; Load CEDET.
;; See cedet/common/cedet.info for configuration details.
(load-file "~/cedet-1.0/common/cedet.el")

;; Enable EDE (Project Management) features
(global-ede-mode 1)

;; * This enables some tools useful for coding, such as summary mode
;; imenu support, and the semantic navigator
(semantic-load-enable-code-helpers)

(add-to-list 'load-path "~/ecb-2.40")
;;(require 'ecb)
(require 'ecb-autoloads)
;;(ecb-activate)
(when (require 'ecb nil 'noerror)
(setq ecb-tip-of-the-day nil)
(setq ecb-auto-compatibility-check nil)
(setq ecb-primary-secondary-mouse-buttons 'mouse-1--C-mouse-1))

;; auto-complete
(add-to-list 'load-path "~/.emacs.d/")
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d//ac-dict")
(ac-config-default)

(require 'erlang-flymake)
;;仅在存盘时进行检查
(erlang-flymake-only-on-save)
;;键盘映射
(defvar flymake-mode-map (make-sparse-keymap))
(define-key flymake-mode-map (kbd "<f3>") 'flymake-goto-next-error)
(define-key flymake-mode-map (kbd "C-c <f3>") 'flymake-goto-prev-error)
(define-key flymake-mode-map (kbd "<f4>") 'flymake-display-err-menu-for-current-line)
(or (assoc 'flymake-mode minor-mode-map-alist)
(setq minor-mode-map-alist
(cons (cons 'flymake-mode flymake-mode-map)
minor-mode-map-alist)))


;;打开上次的文件记录,必须放到最后,否则会有一些状态恢复不了
(load "desktop")
(desktop-load-default)
(desktop-read)
;;当emacs退出时保存文件打开状态
(add-hook 'kill-emacs-hook '(lambda () (desktop-save "~/")))

;; scroll one line at a time (less "jumpy" than defaults)
(setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) ;; one line at a time
(setq mouse-wheel-progressive-speed nil) ;; don't accelerate scrolling
(setq mouse-wheel-follow-mouse 't) ;; scroll window under mouse
(setq scroll-step 1) ;; keyboard scroll one line at a time

  评论这张
 
阅读(2719)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018