我正在使用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)))
答案 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")))