각 패키지를로드 경로에 추가해야하는 이유는 무엇입니까? (또는 init 파일에 ‘package’필요) 문제 메뉴에서 패키지를 설치할 때마다 requireinit 파일에서

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

(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합니다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에 입력하기 전까지는 발생하지 않았을 수도 있습니다.


답변

이 스택 오버플로 답변에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))