0

这是我在某处网上找到的功能,在 linux 中从未出现过问题,但是当在 emacs 24 的 macbook 上运行时,出现以下错误。任何帮助,将不胜感激。

;; (define-minor-mode sensitive-mode
;;   "For sensitive files like password lists.
;; It disables backup creation and auto saving.

;; With no argument, this command toggles the mode.
;; Non-null prefix argument turns on the mode.
;; Null prefix argument turns off the mode."
;;   ;; The initial value.
;;   -1
;;   ;; The indicator for the mode line.
;;   " Sensitive"
;;   ;; The minor mode bindings.
;;   -1
;;   (if (symbol-value sensitive-mode)
;;       (progn
;;  ;; disable backups
;;  (set (make-local-variable 'backup-inhibited) 1) 
;;  ;; disable auto-save
;;  (if auto-save-default
;;      (auto-save-mode -1)))
;;     ;resort to default value of backup-inhibited
;;     (kill-local-variable 'backup-inhibited)
;;     ;resort to default auto save setting
;;     (if auto-save-default
;;  (auto-save-mode 1))))
;; (setq auto-mode-alist
;;  (append '(("\\.gpg$" . sensitive-mode))
;;                auto-mode-alist))

错误是:

Debugger entered--Lisp error: (error "Invalid keymap -1")
2    signal(error ("Invalid keymap -1"))
3    error("Invalid keymap %S" -1)
4    (cond ((keymapp m) m) ((listp m) (easy-mmode-define-keymap m)) (t (error "Invalid keymap %S" m)))
5    (let ((m -1)) (cond ((keymapp m) m) ((listp m) (easy-mmode-define-keymap m)) (t (error "Invalid keymap %S" m))))
6    (defvar sensitive-mode-map (let ((m -1)) (cond ((keymapp m) m) ((listp m) (easy-mmode-define-keymap m)) (t (error "$
7    (progn (progn :autoload-end (defvar sensitive-mode -1 "Non-nil if Sensitive mode is enabled.\nUse the command `sens$
8    eval-buffer(#<buffer  *load*-983931> nil "/Users/bigtyme/Dropbox/SyncedPrograms/emacs/initFiles/setup.el" nil t)  ;$
9    load-with-code-conversion("/Users/bigtyme/Dropbox/SyncedPrograms/emacs/initFiles/setup.el" "/Users/bigtyme/Dropbox/$
10   load("/Users/bigtyme/Dropbox/SyncedPrograms/emacs/initFiles/setup.el" nil nil t)
11   load-file("~/Dropbox/SyncedPrograms/emacs/initFiles/setup.el")
12   eval-buffer(#<buffer  *load*> nil "/Users/bigtyme/.emacs" nil t)  ; Reading at buffer position 2000
13   load-with-code-conversion("/Users/bigtyme/.emacs" "/Users/bigtyme/.emacs" t t)
14   load("~/.emacs" t t)
15   #[0 "^H\205\262^@     \306=\203^Q^@\307^H\310Q\202;^@ \311=\204^^^@\307^H\312Q\202;^@\313\307\314\315#\203*^@\316\2$
16   command-line()
17   normal-top-level()
4

2 回答 2

1

第 5 个参数 todefine-minor-mode应该是一个键映射,您的示例在其中传递 value -1

nil如果您没有键盘映射,则应将其更改为。

...
;; The minor mode bindings.
nil                                  ;; Not -1
(if (symbol-value sensitive-mode)
...

-1此外,作为 the传递init-value也没有任何意义,通常也应该是nil.

于 2015-12-04T21:54:18.480 回答
0

显示定义次要模式的代码(未注释)。显示在次要模式的键映射中绑定键的任何代码。您显示的错误与您显示的代码没有直接关系。

特别是,显示defvar定义 keymap 的sensitive-mode-map。这defvar似乎是问题所在。

这是使用的代码defvar,显然:

(let ((m -1))
   (cond ((keymapp m) m)
         ((listp m) (easy-mmode-define-keymap m))
         (t (error "Invalid keymap %S" m)))

m很明显, to的绑定-1意味着对第三个cond子句进行了评估。这不可能在任何 Emacs 平台上工作,IMO --- 除非您的 init 文件或其他代码在评估之前实际设置了该键映射的defvar值。在这种情况下,defvar将什么都不做。

于 2015-12-04T16:13:40.773 回答