首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(定义-错误(引用gv-无效位置) "%S不是有效的位置表达式“)

(定义-错误(引用gv-无效位置) "%S不是有效的位置表达式“)
EN

Stack Overflow用户
提问于 2016-02-18 20:18:44
回答 2查看 360关注 0票数 0

当我加载emacs时,在添加cl-lib.el之后,它使用--调试-init给出了这个错误:

代码语言:javascript
复制
Debugger entered--Lisp error: (void-function gv-define-simple-setter)
  (gv-define-simple-setter buffer-file-name set-visited-file-name t)
  eval-buffer(#<buffer  *load*<2>> nil "d:/Tools/Emacs-24.3/cl-lib/cl-lib.el" nil t)  ; Reading at buffer position 23391
  load-with-code-conversion("d:/Tools/Emacs-24.3/cl-lib/cl-lib.el" "d:/Tools/Emacs-24.3/cl-lib/cl-lib.el" nil nil)
  load("d:/Tools/Emacs-24.3/cl-lib/cl-lib.el")
  mapc(load ("d:/Tools/Emacs-24.3/cl-lib/cl-lib.el"))
  eval-buffer(#<buffer  *load*> nil "c:/Users/Psalm3_3/.emacs" nil t)  ; Reading at buffer position 76
  load-with-code-conversion("c:/Users/Psalm3_3/.emacs" "c:/Users/Psalm3_3/.emacs" t t)
  load("~/.emacs" t t)
  #[0 "\205\262

这是我正在使用的gv.el文件:

https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/gv.el

有人有什么建议吗?蒂娅。

更新:

下面是我得到的原始错误:

代码语言:javascript
复制
Debugger entered--Lisp error: (file-error "Cannot open load file" "cl-lib")
  require(cl-lib)
  eval-buffer(#<buffer  *load*<2>> nil "d:/Tools/emacs-24.3/site-lisp/desktop.el" nil t)  ; Reading at buffer position 5870
  load-with-code-conversion("d:/Tools/emacs-24.3/site-lisp/desktop.el" "d:/Tools/emacs-24.3/site-lisp/desktop.el" nil nil)
  load("d:/Tools/emacs-24.3/site-lisp/desktop.el")
  mapc(load ("d:/Tools/emacs-24.3/site-lisp/desktop.el"))
  eval-buffer(#<buffer  *load*> nil "c:/Users/Psalm3_3/.emacs" nil t)  ; Reading at buffer position 549
  load-with-code-conversion("c:/Users/Psalm3_3/.emacs" "c:/Users/Psalm3_3/.emacs" t t)
  load("~/.emacs" t t)
  #[0 "\205\262

这是我的.emacs文件:

代码语言:javascript
复制
(mapc 'load (file-expand-wildcards "D:/Tools/Emacs-24.3/cl-lib/cl-lib.el"))

;; Require Common Lisp. (cl in <=24.2, cl-lib in >=24.3.)
(if (require 'cl-lib nil t)
  (progn
    (defalias 'cl-block-wrapper 'identity)
    (defalias 'member* 'cl-member)
    (defalias 'adjoin 'cl-adjoin))
  ;; Else we're on an older version so require cl.
  (require 'cl))

;; Load lisp files on start
(mapc 'load (file-expand-wildcards "D:/Tools/emacs-24.3/site-lisp/flymake.el"))
(mapc 'load (file-expand-wildcards "D:/Tools/emacs-24.3/site-lisp/csharp-mode.el"))
(mapc 'load (file-expand-wildcards "D:/Tools/emacs-24.3/site-lisp/desktop.el"))
(mapc 'load (file-expand-wildcards "D:/Tools/emacs-24.3/site-lisp/session.el"))

;; setup load-path
(add-to-list 'load-path "D:/Tools/emacs-24.3/site-lisp")

;; TABS for C
(setq-default c-indent-tabs-mode t     ; Pressing TAB should cause indentation
                c-indent-level 4         ; A TAB is equivilent to four spaces
                c-argdecl-indent 0       ; Do not indent argument decl's extra
                c-tab-always-indent t
                backward-delete-function nil) ; DO NOT expand tabs when deleting
  (c-add-style "my-c-style" '((c-continued-statement-offset 4))) ; If a statement continues on the next line, indent the continuation by 4
  (defun my-c-mode-hook ()
    (c-set-style "my-c-style")
    (c-set-offset 'substatement-open '0) ; brackets should be at same indentation level as the statements they open
    (c-set-offset 'inline-open '+)
    (c-set-offset 'block-open '+)
    (c-set-offset 'brace-list-open '+)   ; all "opens" should be indented by the c-indent-level
    (c-set-offset 'case-label '+))       ; indent case labels by c-indent-level, too
(require 'csharp-mode)
(setq auto-mode-alist
      (append '(("\\.cs$" . csharp-mode)) auto-mode-alist))
(defun my-csharp-mode-fn ()
  "function that runs when csharp-mode is initialized for a buffer."
  (setq default-tab-width 4)
  ; Set indentation level to 4 spaces (instead of 2)
  (setq c-basic-offset 4)
  ; Set the extra indentation before a substatement (e.g. the opening brace in
  ; the consequent block of an if statement) to 0 (instead of '+)
  (c-set-offset 'substatement-open 0)
  (setq-default c-basic-offset 4)
)
(add-hook  'csharp-mode-hook 'my-csharp-mode-fn t)
(add-hook 'c-mode-hook 'my-c-mode-hook)
(add-hook 'c++-mode-hook 'my-c-mode-hook)

(global-set-key "\C-cg" 'goto-line)
(global-set-key "\C-cy" '(lambda ()
                         (interactive)
                         (popup-menu 'yank-menu)))
(put 'upcase-region 'disabled nil)
;; Always use spaces instead of tabs
(setq-default indent-tabs-mode nil)

(defun FindNextDbl ()
  "move to next doubled word, ignoring <...> tags" (interactive)
  (re-search-forward "\\<\\([z-z]+\\)\\([\\n \\t]\\|<[^>]+>\\)+\\1\\?"))

(define-key global-map "\C-x\C-d" 'FindNextDbl)

;; Search all open buffers
(defun my-multi-occur-in-matching-buffers (regexp &optional allbufs)
  "Show all lines matching REGEXP in all buffers."
  (interactive (occur-read-primary-args))
  (multi-occur-in-matching-buffers ".*" regexp))
(global-set-key (kbd "M-s /") 'my-multi-occur-in-matching-buffers)

(setq x-select-enable-clipboard t)

;; Copy list of all open buffers to clipboard: see http://stackoverflow.com/questions/10537265/emacs-save-current-buffer-list-to-a-text-file
(defun copy-open-files ()
  "Add paths to all open files to kill ring"
  (interactive)
  (kill-new (mapconcat 'identity
                       (delq nil (mapcar 'buffer-file-name (buffer-list)))
                       "\n"))
  (message "List of files copied to kill ring"))

;; save my desktop
(desktop-save-mode 1)

;; auto-reload modified files
(global-auto-revert-mode t)

;; put save files in back dir (see http://www.emacswiki.org/emacs/BackupDirectory)
(setq
   backup-by-copying t      ; don't clobber symlinks
   backup-directory-alist
    '(("." . "~/.saves"))    ; don't litter my fs tree
   delete-old-versions t
   kept-new-versions 6
   kept-old-versions 2
   version-control t)       ; use versioned backups

;; move to window based on arrow keys
(global-set-key (kbd "C-x <up>") 'windmove-up)
(global-set-key (kbd "C-x <down>") 'windmove-down)
(global-set-key (kbd "C-x <right>") 'windmove-right)
(global-set-key (kbd "C-x <left>") 'windmove-left)

;; incremental completion
(require 'helm-config)
(helm-mode 1)

;; http://stackoverflow.com/questions/275842/is-there-a-repeat-last-command-in-emacs
(defun describe-last-function()
  (interactive)
  (describe-function last-command))

;; get path of present buffer, see http://stackoverflow.com/questions/3669511/the-function-to-show-current-files-full-path-in-mini-buffer
(defun show-file-name ()
  "Show the full path file name in the minibuffer."
  (interactive)
  (message (buffer-file-name)))

(global-set-key [C-f1] 'show-file-name) ; Or any other key you want

;; generate guids
(require 'guid)

更新2:

托马斯:“谢谢你这篇精彩的文章。”以下是我更新了我的.emacs文件的开头的内容:

代码语言:javascript
复制
;; setup load-path
(add-to-list 'load-path "C:/Tools/emacs-24.3/site-lisp/gv.el")
(require 'gv)
(add-to-list 'load-path "D:/Tools/Emacs-24.3/cl-lib")
(add-to-list 'load-path "C:/Tools/emacs-24.3/site-lisp")

;; Load lisp files on start
(mapc 'load (file-expand-wildcards "C:/Tools/emacs-24.3/site-lisp/flymake.el"))
(mapc 'load (file-expand-wildcards "C:/Tools/emacs-24.3/site-lisp/csharp-mode.el"))
(mapc 'load (file-expand-wildcards "C:/Tools/emacs-24.3/site-lisp/desktop.el"))
(mapc 'load (file-expand-wildcards "C:/Tools/emacs-24.3/site-lisp/session.el"))

这就是我遇到的错误:

代码语言:javascript
复制
Debugger entered--Lisp error: (void-variable defun-declarations-alist)
  (assq (quote gv-expander) defun-declarations-alist)
  (or (assq (quote gv-expander) defun-declarations-alist) (let ((x (\` (gv-expander (\, (apply-partially ... ...)))))) (push x macro-declarations-alist) (push x defun-declarations-alist)))
  eval-buffer(#<buffer  *load*<2>> nil "d:/Tools/Emacs-24.3/site-lisp/gv.el" nil t)  ; Reading at buffer position 8332
  load-with-code-conversion("d:/Tools/Emacs-24.3/site-lisp/gv.el" "d:/Tools/Emacs-24.3/site-lisp/gv.el" nil t)
  require(gv)
  eval-buffer(#<buffer  *load*> nil "c:/Users/Psalm3_3/.emacs" nil t)  ; Reading at buffer position 96
  load-with-code-conversion("c:/Users/Psalm3_3/.emacs" "c:/Users/Psalm3_3/.emacs" t t)
  load("~/.emacs" t t)
  #[0 "\205\262

抱歉,我刚开始学LISP。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-19 21:12:28

用于cl-lib的代码看起来非常奇怪。如果您有Emacs≥24.3,那么您已经有cl内置了。如果您有更老的东西,那么就不能使用Emacs-24.3的cl-lib (您必须使用GNU ELPA的cl-lib,但是如果它足够老了,您也不会有GNU ELPA支持内置,所以总的来说,您最好将Emacs升级到24.3或更近期)。

如果Emacs是24,1或24.2,那么我建议您通过M-x package-install RET安装cl-lib,然后添加

代码语言:javascript
复制
(package-initialize)

在您的~/.emacs开始时,它将正确地为您通过package.el安装的软件包设置自动加载程序(如上面的cl)。

(if (require 'cl-lib ...) ...)开头的块看起来就像一个丑陋的黑客,可以解决您错误理解的问题。只要把它移开。

另外,将flymake.eldesktop.el从您的site-lisp中删除,Emacs附带的版本可能是最新的。

票数 1
EN

Stack Overflow用户

发布于 2016-02-19 07:45:31

此错误源于Emacs无法加载正确的文件。你在这里试着手动加载一堆文件。然而,这并不是加载底层包的方式。

通常,包附带安装说明,通常要求您向init文件中添加一些行:修改加载路径,设置何时加载包的条件,以及添加如何加载包的命令。几乎从来不涉及load函数的直接调用,这是非常低级别的。

如果查看原始错误,堆栈跟踪会告诉您它是由(require cl-lib)抛出的。require是Emacs在必要时加载文件的机制之一。要使其工作,您不需要直接加载所讨论的文件。您所要做的就是设置加载路径,以便Emacs能够找到所引用的文件。

例如,对于您的cl-lib.el文件,您可以这样做:

代码语言:javascript
复制
(add-to-list 'load-path "D:/Tools/Emacs-24.3/cl-lib")

将这一行添加到init文件中(当然,在Emacs尝试加载cl-lib之前)。

require的反部分是provide。如果您查看gv.el的源代码并一直滚动到底部,您会发现最后一行是:

代码语言:javascript
复制
(provide 'gv)

这意味着他的文件提供了“特性”gv,每当您编写(require 'gv)时,您都会告诉Emacs您需要该特性。如果Emacs已经知道了这一点,那么一切都很好;如果不是,Emacs将尝试加载该功能。因此,要加载gv.el文件的内容,只需向init文件添加以下内容:

代码语言:javascript
复制
(add-to-list 'load-path "/path/to/directory/containing/gv.el")
(require 'gv)

有关requireprovide的更多信息,请参见require

但是,让我从上面重申一点:通常,软件包附带特定的安装说明,通常在源代码文件顶部的一个长注释部分中“隐藏”一些。因此,当您想要手动向安装程序中添加包时,请确保检查此类说明。

附带说明:

代码语言:javascript
复制
(mapc 'load <something>)

只有当<something>扩展为文件列表时,才真正有意义。如果像在您的示例中一样,<something>只是一个文件,那么您最好只编写:

代码语言:javascript
复制
(load <something>)

但是,load是一个低级别的函数,作为最终用户您几乎不需要它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35491612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档