각 패키지를로드 경로에 추가해야하는 이유는 무엇입니까? (또는 init 파일에 'package'필요) 문제


17

패키지 메뉴에서 패키지를 설치할 때마다 requireinit 파일에서 패키지를 시도 하면로드 경로에 수동으로 추가하지 않으면 오류가 발생합니다.

(add-to-list 'load-path "/home/nick/.emacs.d/elpa/use-package-20141220.1645")

(require 'use-package-autoloads)
(require 'use-package)

지루하다. 그리고 일반적으로 패키지 경로에는 버전 번호가 포함됩니다. 패키지가 업데이트 된 경우로드 경로를 수동으로 편집해야합니다.

이것을 자동화하는 방법이 있습니까?

답변:


23

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합니다nilinit 파일을 처리 한 후 패키지를 다시로드하지 않도록합니다. 또는 시작할 때 패키지로드를 완전히 금지하고`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에 입력하기 전까지는 발생하지 않았을 수도 있습니다.



(require 'use-package)전에 사용해도 (package-initialize)되나요?
陳 力

3

이 스택 오버플로 답변에after-init-hook 언급 된 솔루션을 언급 해야 한다고 생각합니다 .

(defun my-packages-init ()
  (require 'some-great-package))

(add-hook 'after-init-hook 'my-packages-init)

나는 이것이 그것이 이루어져야한다고 생각했지만 다른 대답은 그것을하는 다른 방법에 대한 정보를 제공합니다.


0

다음은 모든 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))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.