安装elgantt时报错

问题描述(emacs-26.3, win10):

  1. 安装一个甘特图插件(elgantt)时,需要依赖org-ql,该包安装后在.emacs启动文件中添加如下代码: (add-to-list 'load-path “D:/emacs/.emacs.d/elpa/elgantt/”) (require 'elgantt)
  2. require时报错:Debugger entered–Lisp error: (void-function -on)
  3. 在org-ql.el中包含"-on"的代码如下:
(defun org-ql--def-query-string-to-sexp-fn (predicates)
  "Define function `org-ql--query-string-to-sexp' according to PREDICATES.
Builds the PEG expression using PREDICATES (which should be the
value of `org-ql-predicates')."
  (let* ((names (--map (symbol-name (plist-get (cdr it) :name))
                       predicates))
         (aliases (->> predicates
                       (--map (plist-get (cdr it) :aliases))
                       -non-nil
                       -flatten
                       (-map #'symbol-name)))
         (predicate-names (->> (append names aliases)
                               -uniq
                               ;; Sort the keywords longest-first to work around what seems to be an
                               ;; obscure bug in `peg': when one keyword is a substring of another,
                               ;; and the shorter one is listed first, the shorter one fails to match.
                               (-sort (-on #'> #'length))))
         (pexs `((query (+ (and term (* [blank]))))
                 (term (or (and negation (list positive-term)
                                ;; This is a bit confusing, but it seems to work.  There's probably a better way.
                                `(pred -- (list 'not (car pred))))
                           positive-term))
                 (positive-term (or (and predicate-with-args `(pred args -- (cons (intern pred) args)))
                                    (and predicate-without-args `(pred -- (list (intern pred))))
                                    (and plain-string `(s -- (list org-ql-default-predicate s)))))
                 (plain-string (or quoted-arg unquoted-arg))
                 (predicate-with-args (substring predicate) ":" args)
                 (predicate-without-args (substring predicate) ":")
                 (predicate (or ,@predicate-names))
                 (args (list (+ (and (or keyword-arg quoted-arg unquoted-arg) (opt separator)))))
                 (keyword-arg (and keyword "=" `(kw -- (intern (concat ":" kw)))))
                 (keyword (substring (+ (not (or separator "=" "\"" (syntax-class whitespace))) (any))))
                 (quoted-arg "\"" (substring (+ (not (or separator "\"")) (any))) "\"")
                 (unquoted-arg (substring (+ (not (or separator "\"" (syntax-class whitespace))) (any))))
                 (negation "!")
                 (separator "," )))
         (closure (lambda (input &optional boolean)
                    "Return query parsed from plain query string INPUT.
  Multiple predicate-names are combined with BOOLEAN (default: `and')."
                    ;; HACK: Silence unused lexical variable warnings.
                    (ignore predicates predicate-names names aliases)
                    (unless (s-blank-str? input)
                      (let* ((boolean (or boolean 'and))
                             (parsed-sexp
                              (with-temp-buffer
                                (insert input)
                                (goto-char (point-min))
                                ;; Copied from `peg-parse'.  There is no function in `peg' that
                                ;; returns a matcher function--every entry point is a macro,
                                ;; which means that, since we define our PEG rules at runtime when
                                ;; predicate-names are defined, we either have to use `eval', or we
                                ;; have to borrow some code.  It ends up that we only have to
                                ;; borrow this `with-peg-rules' call, which isn't too bad.
                                (eval `(with-peg-rules ,pexs
                                         (peg-run (peg ,(caar pexs)) #'peg-signal-failure))))))
                        (pcase parsed-sexp
                          (`(,one-predicate) one-predicate)
                          (`(,_ . ,_) (cons boolean (reverse parsed-sexp)))
                          (_ nil)))))))
    (fset 'org-ql--query-string-to-sexp closure)))

本人小白,看不懂lisp代码,请问该代码有bug吗?还是其它原因导致的报错。

甘特图elgantt:

没有安装和引用dash包

(require 'dash)
1 个赞