【问题标题】:Use rebar in emacs?在 emacs 中使用钢筋?
【发布时间】:2013-04-01 01:31:50
【问题描述】:

.emacs 中有一个defun 来获取 erlang 项目路径,我该如何执行 shell-command 来执行以下操作:

cd *~/erlang-project-folder*
make

我正在使用 rebar 来构建我的项目,并且有一个 Makefile 可以完成所有工作。

我可以通过覆盖erlang-compile-function来编译,但是我对Emacs Lisp不熟悉,请帮忙。

这是我的 .emacs:

(defun erlang-project-dir ()
  (let* ((src-path (file-name-directory (buffer-file-name)))
         (pos (string-match "/src/" src-path)))
    (if pos (substring src-path 0 (+ 1 pos)) src-path)))

;; there is an error: wrong type argument: commandp
(defun my-inferior-erlang-compile ()
  (shell-command.
    (concat (concat (concat "cd" erlang-project-dir) "; make"))))

(defvar erlang-compile-function 'my-inferior-erlang-compile)

【问题讨论】:

    标签: emacs erlang


    【解决方案1】:

    与其依赖目录结构,不如尝试找到位于项目根目录中的rebar.config 文件。这可以通过以下代码实现:

    (defun my-find-rebar-root ()
      (let ((dir (locate-dominating-file default-directory "rebar.config")))
        (or dir default-directory)))
    

    之后就可以使用这个函数进行编译了:

    (defun my-inferior-erlang-compile ()
      (interactive)
      (let ((default-directory (my-find-rebar-root)))
        (compile "make")))
    

    虽然,我不确定 make 是否是正确的命令 - 也许改用 rebar compile 更好?

    附:我希望,我能找到一些空闲时间,并完成 EDE 中的钢筋支持 - 在这种情况下,它将是用于处理项目的相同统一界面。

    【讨论】:

    • 嗨,@Alex,谢谢。但是(defvar erlang-compile-function 'my-inferior-erlang-compile) 报告“错误的类型参数:commandp, my-inferior-erlang-compile”
    • 啊,看来inferior-erlang-compile是用来编译erlang环境内部的buffer,而不是执行外部shell命令。我建议绑定一些键来调用编译函数,例如,(defun my-erlang-mode-hook () (local-set-key [f9] 'my-inferior-erlang-compile)) (add-hook 'erlang-mode-hook 'my-erlang-mode-hook)
    • 我编辑了代码,添加了(interactive),所以这个命令将被视为命令...
    • 非常感谢您的完美回答。它运行完美:)
    猜你喜欢
    • 2016-08-05
    • 2011-07-27
    • 2017-05-22
    • 2016-08-28
    • 2012-06-26
    • 2013-07-27
    • 2012-10-15
    • 2012-04-28
    • 2012-05-24
    相关资源
    最近更新 更多