如何在erlang.el中覆盖次级erlang-compile-outdir

时间:2013-07-17 07:03:27

标签: emacs erlang

我正在使用erlang-mode。光束与源文件在同一文件夹中生成,该文件位于嵌套文件夹中,而不是仅存储在文件夹 src 中。

我想我应该覆盖erlang.el中的 inferior-erlang-compile-outdir ,但我失败了。

以下是我的功能:

(defun inferior-erlang-compile-outdir ()
  (let* (format "%s/ebin" (get-project-path))))

PS: get-project-path 是一个获取项目根路径的函数。

===========更新=================

(require-package 'erlang)

;; add include directory to default compile path.
(defvar erlang-compile-extra-opts
  '(bin_opt_info 
    debug_info
    (i . "../include")
    (i . "../../include")))

;; define where put beam files.
(defun inferior-erlang-compile-outdir ()
  (concat (get-closest-pathname) "/ebin" ))

(require 'erlang-start)


;;----------------------------------------------------------------------------
;; Get closest pathname of file
;;----------------------------------------------------------------------------
(defun* get-closest-pathname (&optional (file "Makefile"))
  (let ((dir (locate-dominating-file default-directory file)))
    (or dir default-directory)))

1 个答案:

答案 0 :(得分:3)

这是正确的,inferior-erlang-compile-outdir定义了编译文件的放置位置。 虽然您使用let*是错误的。 let允许您定义范围变量,在您的情况下根本不需要它。只需连接两个字符串:

(defun inferior-erlang-compile-outdir ()
    (concat (get-project-path) "/ebin" ))

如果您想使用let,请参阅doc here

但是当你定义erlang-mode时,它还没有被加载。因此,一旦加载了erlang模式,您的函数就会被原始函数覆盖。您必须先定义 。这应该这样做:

(eval-after-load "erlang"
  '(defun inferior-erlang-compile-outdir ()
     (concat (expand-file-name (get-closest-pathname)) "ebin")))