【问题标题】:"malformed function" warning and require "Cannot open load file:" error“格式错误的函数”警告并要求“无法打开加载文件:”错误
【发布时间】:2014-04-08 21:13:51
【问题描述】:

我遇到了这两个问题:

在顶级形式中: init.el:28:1:Warning: `(add-path (p) (add-to-list (quote load-path) (concat emacs-root p)))' 是一个格式错误的函数 init.el:42:1:错误:无法打开加载文件:exec-path-from-shell

在编译以下 elisp 期间:

(eval-when-compile (require 'cl))
;; root of all emacs-related stuff
(eval-when-compile
  (defvar emacs-root
    (if (or (eq system-type 'cygwin)
          (eq system-type 'gnu/linux)
          (eq system-type 'linux)
          (eq system-type 'darwin))
      "~/.emacs.d/"    "z:/.emacs.d/")
  "Path to where EMACS configuration root is."))

 (eval-when-compile
   (defvar emacs-root "~/.emacs.d"
    "Path to where EMACS configuration root is."))

;; path to where plugins are kept
(defvar plugin-path (concat emacs-root "el-get")
   "*Path to el-get plugins.")

;; for portability with < 24.3 EMACS
(unless (fboundp 'cl-labels) (fset 'cl-labels 'labels))

;; add paths to various configuration modes
(cl-labels
  ((add-path (p)
            (add-to-list 'load-path
                         (concat emacs-root p))))
 (add-path  ".")
 (add-path  "settings")
 (add-path  "site-lisp")
 (add-path  "erlang")
 (add-path  "exec-path-from-shell"))
;; set PATH, because we don't load .bashrc
(require 'exec-path-from-shell) ;; <- Error: Cannot open load file: exec-path-from-shell

这两个问题都让我很困惑。

  1. 我不明白为什么这个基金被认为是“畸形” `(add-path (p) (add-to-list (quote load-path) (concat emacs-root p)))'

  2. 其次为什么“require”无法加载文件。

这些问题只发生在编译期间,未编译的代码可以正常工作

非常感谢任何指点

问候,罗曼

【问题讨论】:

  • 如果您想使用cl-labels,那么您可能需要确保变量lexical-binding 不是nil。请参阅文档字符串。

标签: emacs elisp


【解决方案1】:

cl-labelscl-lib 提供,而不是由cl 提供。所以你需要(require 'cl-lib)(你也可以用eval-when-compile包装)。

【讨论】:

    【解决方案2】:

    您需要在编译时加载“cl-lib”:

    (eval-when-compile (require 'cl-lib))
    

    此外,正如 Stefan 在 your other question 的 cmets 中所解释的那样,您不应该在 eval-when-compile 中定义变量。只需使用defvar

    【讨论】:

    • 但我确实加载了 (eval-when-compile (require 'cl)) - 我的 lisp 列表中的第一行。在没有 eval-when-compile 的情况下使用 defvar 似乎不会产生差异。第一个(require 语句总是导致无法打开加载文件:
    • 此 emacs 设置的存储库位于此处:github.com/RomanShestakov/.emacs.d
    猜你喜欢
    • 2012-12-02
    • 2019-02-10
    • 2020-02-02
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多