2016-02-18 21 views
0

當我加載emacs時,在添加cl-lib.el之後,使用--debug-init給出了這個錯誤:(define-error(引用gv-invalid-place)「%S不是一個有效的表達式」)

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

有沒有人有什麼建議? TIA。

UPDATE:

這裏是原來的錯誤,我越來越:

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文件:

(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:

謝謝你的優秀帖子,@Thomas。這是我已經更新了我的.emacs開始文件到:

;; 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")) 

現在,這是錯誤我得到:

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相當新。

+0

這比從任意一個Emacs版本中拋出您最喜歡的'gv.el'稍微複雜一些。選擇您最喜愛的軟件包支持的Emacs的完整版本 - 例如,無論helm支持。 – lawlist

+0

現在我正在使用emacs 24.3。 Helm在我的合同工作中工作了5個月沒有問題,但現在我已經完成了我的合同,我試圖讓它在Windows 10中使用相同的.emacs和site-lisp文件在家中工作,但遇到了麻煩。在Windows 7的合同工作中,emacs從未抱怨過cl-lib。 – Roger

回答

1

你對cl-lib的代碼看起來很奇怪。如果你有Emacs≥24.3,那麼你已經有了cl-lib內置。如果你有更老的東西,那麼你不能使用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中,然後在你的~/.emacs的開頭添加

(package-initialize) 

這將爲這些軟件包正確設置自動加載你通過package.el安裝(比如上面的cl-lib)。

(if (require 'cl-lib ...) ...)開頭的塊看起來像一個醜陋的黑客來解決你誤解的問題。只要刪除它。

此外,從site-lisp刪除flymake.eldesktop.el,Emacs附帶的版本可能更新。

+0

刪除了「if(require'cl-lib')...,flymake.el和desktop.el,但仍然收到相同的錯誤。 – Roger

+0

另外,當我鍵入M-x package -install RET然後鍵入cl-lib時,它會顯示「[No match]」 – Roger

+0

你有沒有碰過'package-archives'?或者在從elpa.gnu.org獲取軟件包列表時遇到了一些問題(今天一直存在問題)? – Stefan

1

錯誤源於Emacs無法加載正確的文件。你正試圖在這裏手動加載一堆單個文件。但是,這不是底層軟件包應該加載的方式。

通常情況下,軟件包中包含有通常需要將某些行添加到您的init文件的安裝說明:修改負載路徑,設立條件加載包,並添加一個命令如何到加載包裝。幾乎沒有任何一件事涉及直接調用load函數,這是相當低級的。

如果你看看你的原始錯誤,堆棧跟蹤會告訴你它被拋出(require cl-lib)require是Emacs在必要時加載文件的機制之一。爲了工作,你不需要直接加載有問題的文件。您所要做的就是設置您的加載路徑,以便Emacs可以找到所引用的文件。

例如,對於您的cl-lib.el文件,你可以這樣做,像這樣:

(add-to-list 'load-path "D:/Tools/Emacs-24.3/cl-lib") 

您此行添加到您的init文件(之前當然在一個點的Emacs的嘗試加載CL- LIB)。

require對應的部分是provide。如果你看一下源代碼gv.el並滾動一路底部,你會發現在最後一行:

(provide 'gv) 

這意味着他的文件提供的「功能」 gv,每當你寫(require 'gv)你告訴Emacs你需要這個功能。如果Emacs已經知道它,一切都很好,很好看;如果不是,Emacs將嘗試加載該功能。因此,加載gv.el文件的內容,所有你需要做的是以下內容添加到您的init文件:

(add-to-list 'load-path "/path/to/directory/containing/gv.el") 
(require 'gv) 

requireprovide更多信息,請參見Emacs Manual

但是讓我重申一下上面的一點:通常,軟件包會附帶特定的安裝說明,通常在源代碼文件頂部的長註釋部分中「隱藏」。所以,當你想手動添加一個包到你的設置時,一定要檢查這樣的說明。


在一個側面說明:

(mapc 'load <something>) 

唯一真正意義,如果<something>擴展到文件的列表。如果像你的情況,<something>只是一個單一的文件,你可能也只是寫:

(load <something>) 

但同樣,load是,你幾乎不需要爲最終用戶提供低級別的功能。

相關問題