修改.emacs时出现emacs启动错误

修改.emacs时出现emacs启动错误,emacs,configuration,melpa,Emacs,Configuration,Melpa,我是emacs的新手。我正在尝试使用Python设置它。它建议的第一步之一是将以下内容添加到init.el: ;; init.el --- Emacs configuration ;; INSTALL PACKAGES ;; -------------------------------------- (require 'package) (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages

我是emacs的新手。我正在尝试使用Python设置它。它建议的第一步之一是将以下内容添加到
init.el

;; init.el --- Emacs configuration

;; INSTALL PACKAGES
;; --------------------------------------

(require 'package)

(add-to-list 'package-archives
       '("melpa" . "http://melpa.org/packages/") t)

(package-initialize)
(when (not package-archive-contents)
  (package-refresh-contents))

(defvar myPackages
  '(better-defaults
    material-theme))

(mapc #'(lambda (package)
    (unless (package-installed-p package)
      (package-install package)))
      myPackages)

;; BASIC CUSTOMIZATION
;; --------------------------------------

(setq inhibit-startup-message t) ;; hide the startup message
(load-theme 'material t) ;; load material theme
(global-linum-mode t) ;; enable line numbers globally

;; init.el ends here
因为我有一个
.emacs
文件,所以我尝试将其附加到该文件中。之后,我的
.emacs
看起来像:

(require 'package)
(setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/")
                         ("marmalade" . "http://marmalade-repo.org/packages/")
                         ("melpa" . "http://melpa.milkbox.net/packages/")))
(package-initialize)
(when (not package-archive-contents) (package-refresh-contents))

(let ((default-directory "~/.emacs.d/elpa/"))
    (normal-top-level-add-to-load-path '("."))
    (normal-top-level-add-subdirs-to-load-path))
(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

;; init.el --- Emacs configuration

;; INSTALL PACKAGES
;; --------------------------------------



(add-to-list 'package-archives
       '("melpa" . "http://melpa.org/packages/") t)

(package-initialize)
(when (not package-archive-contents)
  (package-refresh-contents))

(defvar myPackages
  '(better-defaults
    material-theme))

(mapc #'(lambda (package)
    (unless (package-installed-p package)
      (package-install package)))
      myPackages)

;; BASIC CUSTOMIZATION
;; --------------------------------------

(setq inhibit-startup-message t) ;; hide the startup message
(load-theme 'material t) ;; load material theme
(global-linum-mode t) ;; enable line numbers globally

;; init.el ends here
但是,这会引发错误:

Warning (initialization): An error occurred while loading ‘/Users/adamg/.emacs’:

File error: http://melpa.org/packages/better-defaults-20160601.1219.el, Not found

To ensure normal operation, you should investigate and remove the
cause of the error in your initialization file.  Start Emacs with
the ‘--debug-init’ option to view a complete error backtrace.
运行
emacs--debug init
返回:

Debugger entered--Lisp error: (file-error "http://melpa.org/packages/better-defaults-20160601.1219.el" "Not found")
  signal(file-error ("http://melpa.org/packages/better-defaults-20160601.1219.el" "Not found"))
  package-install-from-archive(#s(package-desc :name better-defaults :version (20160601 1219) :summary "Fixing weird quirks and poor defaults" :reqs nil :kind single :archive "melpa" :dir nil :extras ((:url . "https://github.com/technomancy/better-defaults") (:keywords "convenience")) :signed nil))
  mapc(package-install-from-archive (#s(package-desc :name better-defaults :version (20160601 1219) :summary "Fixing weird quirks and poor defaults" :reqs nil :kind single :archive "melpa" :dir nil :extras ((:url . "https://github.com/technomancy/better-defaults") (:keywords "convenience")) :signed nil)))
  package-download-transaction((#s(package-desc :name better-defaults :version (20160601 1219) :summary "Fixing weird quirks and poor defaults" :reqs nil :kind single :archive "melpa" :dir nil :extras ((:url . "https://github.com/technomancy/better-defaults") (:keywords "convenience")) :signed nil)))
  package-install(better-defaults)
  (if (package-installed-p package) nil (package-install package))
  (lambda (package) (if (package-installed-p package) nil (package-install package)))(better-defaults)
  mapc((lambda (package) (if (package-installed-p package) nil (package-install package))) (better-defaults material-theme))
  eval-buffer(#<buffer  *load*> nil "/Users/adamg/.emacs" nil t)  ; Reading at buffer position 1437
  load-with-code-conversion("/Users/adamg/.emacs" "/Users/adamg/.emacs" t t)
  load("~/.emacs" t t)
  #f(compiled-function () #<bytecode 0x400d3941>)()
  command-line()
  normal-top-level()
调试器已输入--Lisp错误:(文件错误)http://melpa.org/packages/better-defaults-20160601.1219.el“未找到”)
信号(文件错误(“http://melpa.org/packages/better-defaults-20160601.1219.el“”未找到“))
从存档安装软件包(#s)(软件包描述:名称更好默认值:版本(20160601 1219):总结“修复奇怪的怪癖和糟糕的默认值”:reqs nil:kind single:archive“melpa”:dir nil:extras(:url)https://github.com/technomancy/better-defaults(:关键字“便利”):签名为零)
mapc(从存档安装软件包)(软件包描述:名称更好默认值:版本(20160601 1219):总结“修复奇怪的怪癖和糟糕的默认值”:reqs nil:kind single:archive“melpa”:dir nil:extras(:url)https://github.com/technomancy/better-defaults(:关键字“便利”):签名为零)
软件包下载事务(#s)(软件包描述:名称更好默认值:版本(20160601 1219):总结“修复奇怪的怪癖和糟糕的默认值”:reqs nil:kind single:archive“melpa”:dir nil:extras(:url)https://github.com/technomancy/better-defaults(:关键字“便利”):签名为零)
软件包安装(更好的默认设置)
(如果(安装包-p包)无(安装包)
(lambda(包)(如果(包安装-p包)nil(包安装包))(更好的默认值)
mapc((lambda(包)(if(包安装-p包)nil(包安装包))(更好的默认材质主题))
评估缓冲区(#nil)/Users/adamg/.emacs“nil t);缓冲器位置1437处的读数
使用代码转换加载(“/Users/adamg/.emacs”“/Users/adamg/.emacs”t)
荷载(“~/.emacs”t)
#f(编译函数()#)()
命令行()
正常-顶级()

当我将上面的代码放在一个单独的
init.el
文件中时,它不会抛出错误,但也不会更改启动屏幕或主题。有人能指出我做错了什么吗?

您的软件包存储库内容(本地缓存)已经过时,Emacs正在尝试下载旧的、不再存在的
better
软件包版本

据我所见,问题在于这部分:

(when (not package-archive-contents)
  (package-refresh-contents))
基本上,只有在根本没有信息的情况下(所以只有一次),才可以从存储库中刷新包内容。在我看来,让它一直处于最新状态是很好的,即使Emacs需要几秒钟才能启动

建议-删除包刷新的条件,将这两行更改为简单:

(package-refresh-contents)
哦,简要介绍一下配置文件-Emacs尝试按顺序从
~/.Emacs
~/.Emacs.d/init.el
文件加载配置,并且仅从其中一个文件加载配置。因此,如果您有
.emacs
文件,
init.el
将被忽略。这就是为什么对
init.el
的更改没有引发任何错误-Emacs忽略了该文件,只使用了
.Emacs


(顺便说一句,Emacs还记得使用了哪个文件,所以当您使用Emacs内置工具自定义配置时,更改会转到正确的文件)

非常感谢您提供了这个非常详细的答案。您也可以在需要时手动运行
M-x软件包刷新内容
(因为它很慢,所以每次运行它都不是最佳选择)。您有一堆可以删除的冗余代码。在init文件的顶部,您已经(a)添加了MELPA归档文件;(b) 调用
包初始化
;(c) 可能称为
包刷新内容
。然后在新代码中重复所有这些,所以不要这样做——只需删除冗余/重复的代码。