패키지 메뉴에서 패키지를 설치할 때마다 require
init 파일에서 패키지를 시도 하면로드 경로에 수동으로 추가하지 않으면 오류가 발생합니다.
(add-to-list 'load-path "/home/nick/.emacs.d/elpa/use-package-20141220.1645")
(require 'use-package-autoloads)
(require 'use-package)
지루하다. 그리고 일반적으로 패키지 경로에는 버전 번호가 포함됩니다. 패키지가 업데이트 된 경우로드 경로를 수동으로 편집해야합니다.
이것을 자동화하는 방법이 있습니까?
답변
TL; DR :
init 파일 맨 위에 다음 줄을 추가하십시오 ( .emacs.d/init.el
또는 .emacs
) :
(package-initialize)
설명
Emacs가 사용할 수있는 더 많은 파일을 만드는 user-init-file
것은 올바른 방법이 아닙니다. 매뉴얼은 말한 부분이 아닌 충돌이있는 경우 선호되는 것을 말하지 않기 때문에 혼란 을 추가 하는 것입니다. 이제 실제로 어떤 user-init-file
값이 원하는지 알 수 없습니다 확인하기 위해 검사).
따라서 ~/.emacs.d/init.el
사용자가 선호하는 것을 제외하고 모든 후보를 제거하는 것으로 시작하십시오. 이는 부정한 혼란에 기여하지 않기 때문에 $HOME
가장 중요한 것을 포함하여 모든 Emacs 구성 파일을 저장소를 사용하여 버전 제어하에 유지할 수 있습니다. 이맥스.
기본적으로 Emacs 는 사용자의 init 파일이로드 된 package-initialize
후 호출합니다 . 그것은 그렇게 전혀 요즘 때문에, 대부분의 사용자가 사용하여 패키지를 설치할 package.el
가 이러한 패키지가 제공 될 때까지 아무것도 할 필요가해서는 안 -.
반면에 모든 사람 이하는 것은 아니므로 전화를 걸 수 없습니다package-initialize
. 해당 함수가 호출되는 것을 방지 (setq package-enable-at-startup nil)
하려면 사용자의 init 파일 에 추가 하십시오 (다른 곳에 넣을 수 있습니까?).
package-initialize
사용자가 Emacs에게하지 말라고 변경하기 전에는 호출 할 수 없으므로 init 파일 을 로드 한 후에 수행해야 합니다. 사용자가 패키지 만 설치 한 다음 그대로 사용하거나 제대로 작동하는 사용자 정의 인터페이스를 사용하여 패키지를 사용자 정의하는 한. 그러나 elisp를 사용하여 패키지를 사용자 정의하려면 load-path
정의한 함수를 사용하기 전에 패키지가 실제로 켜져 있는지 확인해야 합니다.
그것은 매우 쉽고 올바르게 문서화되었습니다 (먼저 그것을 보았을 경우, 위의 대부분을 쓰지 않아도됩니다 :-/
init 파일을로드 한 후 자동 패키지로드가 발생하는 이유는 사용자 옵션이 패키지 시스템에 영향을주는 사용자 옵션을 포함하여 init 파일을로드 한 후 사용자 정의 된 값만 수신하기 때문입니다. 경우에 따라 init 파일에 패키지를 명시 적으로로드 할 수도 있습니다 (보통 init 파일의 다른 코드는 패키지에 의존하기 때문에). 이 경우, init 파일은 함수를 호출해야합니다
package-initialize
. 통화package-load-list
전에 (아래 참조) 와 같은 관련 사용자 옵션 이 설정 되어 있는지 확인하는 것은 귀하 의package-initialize
책임입니다. 또한로 설정해야
package-enable-at-startup
합니다nil
init 파일을 처리 한 후 패키지를 다시로드하지 않도록합니다. 또는 시작할 때 패키지로드를 완전히 금지하고`Mx package-initialize ‘명령을 호출하여 패키지를 수동으로로드 할 수도 있습니다.
그래서:
;;; .emacs.d/init.el -- the `user-init-file'
(package-initialize)
(setq package-enable-at-startup nil)
(require 'use-package)
(use-package some-package
:init (setq some-package-variable "foobar")
...
;;; .emacs.d/init.el ends here
물론 문제 (또는 추가 문제)는 오타 Symbol's function definition is void: use-packge
가 init 파일에 있고 emacs.se에 입력하기 전까지는 발생하지 않았을 수도 있습니다.
답변
이 스택 오버플로 답변에after-init-hook
언급 된 솔루션을 언급 해야 한다고 생각합니다 .
(defun my-packages-init ()
(require 'some-great-package))
(add-hook 'after-init-hook 'my-packages-init)
나는 이것이 그것이 이루어져야한다고 생각했지만 다른 대답은 그것을하는 다른 방법에 대한 정보를 제공합니다.
답변
다음은 모든 dirs ~/.emacs.d/site-lisp
를로드 경로에 추가하므로 require
패키지 만 수행하면됩니다.
(let* ((my-lisp-dir "~/.emacs.d/site-lisp/")
(default-directory my-lisp-dir)
(orig-load-path load-path))
(setq load-path (cons my-lisp-dir nil))
(normal-top-level-add-subdirs-to-load-path)
(nconc load-path orig-load-path))