Emacs 24 : ELPA를 통해 설치된 패키지로드


12

방금 cmake-mode다음을 사용하여 Emacs 24에 패키지를 설치했습니다 .

M-x package-install cmake-mode

에서 패키지를 볼 ~/.emacs.d/elpa/cmake-mode-20110824수 있으며 Commentary:섹션의 지침을 사용하여 패키지를 로드 할 수 있습니다 ~/.emacs.d/elpa/cmake-mode-20110824/cmake-mode.el.

;; Add this code to your .emacs file to use the mode:
;;
;;  (setq load-path (cons (expand-file-name "/dir/with/cmake-mode") load-path))
;;  (require 'cmake-mode)
;;  (setq auto-mode-alist
;;        (append '(("CMakeLists\\.txt\\'" . cmake-mode)
;;                  ("\\.cmake\\'" . cmake-mode))
;;                auto-mode-alist))

그러나 이것은 ELPA의 EmacsWiki 페이지에 있는 사용법 지침 과 모순 됩니다 :

... init.el이로드 된 후 패키지가 초기화됩니다. 즉, 패키지 특정 초기화를 init.el에 넣지 않아야합니다 ...

~/.gnu-emacs파일에 다음과 같은 줄을 추가하기 때문에이 지침에 동의하는 경향이 있습니다.

(add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/")

패키지를 업그레이드 할 때 언제 그리고 나빠질 것입니다. 그러나이 줄이 없으면 사용할 수 없습니다 cmake-mode.

여기에 뭔가 빠졌습니까?

노트:

  • 나는 이상한 일을하지 않았으며 package-enable-at-startup그 가치는 t입니다.
  • prelude 사용하고 있습니다.
  • user-emacs-directory가치는 "~/.emacs.d/" (제안을 @lawlist 감사합니다)
  • package-user-dir 가치는 "~/.emacs.d/elpa"

1
당신은의 위치를 변경 한 것이 가능 default-directory하거나 user-emacs-directory있도록, elpa디렉토리가로드되지 않습니다? package-install생성 elpa디렉토리 및 설치시 생성 된 자동으로 적재 파일은 해당 위치를 기반으로합니다.
lawlist

1
질문의 마지막 코드 줄은 패키지를 elpa디렉토리 밖으로 옮겼 음을 제안합니다. 즉, ~/.emacs.d/cmake-mode-20110824/자동로드 파일이 예상하는 위치가 아닙니다.
lawlist

@lawlist : 당신은 매우 관찰합니다. 나는 그 질문에 실수를했다. 이제 (질문)이 올바른 값으로 고정되었습니다 ~/.emacs.d/elpa/cmake-mode-20110824/. 문제는 남아있다.
Chen Levy

답변:


2

marmalade-repo와 함께 cmake-mode를 설치하고 cmake-mode-autoloads.el을 살펴 보았습니다. 저자는 notautoloads 파일 내의 설정에 필요한 모든 것을 포함 하여 의식적인 결정을 한 것으로 보입니다 . 그러나 cmake-mode.el의 25 ~ 30 행에있는 지침은 귀하의 질문에 인용 된 것입니다. 25 ~ 30 행을 사용하고 경로를 올바르게 설정 하면와 같은 추가 코드 행이 필요 하지 않습니다(add-to-list 'load-path "~/.emacs.d/elpa/cmake-mode-20110824/") .

분명히, 당신은 사용하고 싶지 않을 것입니다 /dir/with/cmake-mode- ~/.emacs.d/elpa/cmake-mode-20110824끝에서 슬래시없이 사용하고 싶습니다 .

(setq load-path (cons (expand-file-name "~/.emacs.d/elpa/cmake-mode-20110824") load-path))
(require 'cmake-mode)
(setq auto-mode-alist
      (append '(("CMakeLists\\.txt\\'" . cmake-mode)
                ("\\.cmake\\'" . cmake-mode))
              auto-mode-alist))

c-make-mode ... 디렉토리를 삭제하고 위의 코드가 작동하지 않으면 (자신의 경로를 사용하여) 재설치를 시도해야합니다.


물론, 빠진 것이 없다면 나중에 ELPA를 통해 cmake-mode를 업데이트하면 디렉토리가 init 파일에없는 것으로 이름이 바뀌거나 최신 버전이로드 경로에없는 디렉토리에있게됩니다. 후자의 경우 업데이트가 표시되지 않거나 한 버전을 수동으로로드하고 다른 버전을로드하기 때문에 과도한 이상이 발생 (package-initialize)합니다. 내가 잘못? ELPA를 많이 사용하지 않았고 아직 패키지를 업데이트하지 않았으므로 잘못 될 수 있습니다. 그리고, 그것은 어떤 경우에도 큰 관심사가 아니지만 왜 그것을 완전히 피하지 않습니까?
Aaron Miller

당신이 올바른지. 그러나 패키지는 사용자가 모르는 사이에 스스로 업데이트하는 것이 아니라 업데이트 할 때 하우스 키핑을해야 할 때입니다. 다양한 패키지의 소스 파일을 수정하는 데 상당한 시간을 투자하는 경우가 많았으며, 올바른 패키지를 얻는 데 모든 시간을 소비 한 후에 반드시 업데이트하지 않아도됩니다. 이맥스는 "무 정비"라고 생각할 수있는 것과는 거리가 멀다.
Lawlist

훌륭한 지적입니다.
Aaron Miller

3

절반 코드 저장소, Emacs 해커를위한 절반 보조 메모리 로서 위키의 특성상 다음과 같은 점을 이해할 수 있었습니다 .

시작하는 동안 패키지 초기화를 다른 지점으로 옮기는 것이 더 쉬울 수 있으므로 ELPA 패키지를 (필수) 할 수 있습니다. 이것은 설명 된 많은 문제를 처리합니다.

이것이 제가하는 것입니다; 내 사용자 정의 init 스크립트에 의해로드 된 첫 번째 파일 중 하나입니다 (생성 할 수있는 모든 것에서 생성 할 수있는 것은 심각한 Emacs 의 폰 asinorum 입니다 1 )

(require 'package)
(setq package-enable-at-startup nil)
(package-initialize)

거기에서 나는 단순히 (require)내가 필요한 ELPA 패키지를 제공합니다. 또한 ELPA 설치 패키지의 동작을보다 세밀하게 제어 할 수 있다는 이점이 있습니다. 예를 들어, 현재 지정된 패키지를 비활성화하고 완전히 제거하지 않으려 (require)는 경우 기본 동작이 패키지를 ELPA 디렉토리에서 완전히 이동시켜야 하는 관련 호출 을 주석 처리하는 것은 간단 합니다.

(1. 거의 압도적 인 유혹에도 불구하고, 나는 커스텀 초기화 스크립트의 이름을 밝히기를 거부했습니다 lightsaber.el.)


ELPA 패키지가 기본적으로 상주 할 때 변경된 경우 user-emacs-directory 를 확인하라는 알림 입니다. Dropbox에 물건을 보관하고 배치 스크립트에서 위의 명령으로 효과를 볼 때까지 놀랐습니다.
mlt

1

를 사용하여 패키지를로드 한 후 모든 초기화를 수행 할 수 있습니다 after-init-hook. 에서 EmacsWiki :

;; init.el
(add-hook 'after-init-hook (lambda () (load "<real init file>")))

0

ELPA를 사용하기 시작했을 때 비슷한 문제가있었습니다. 필자의 경우 ELPA에없는 여러 로컬 패키지가 있습니다.

따라서로드 경로를 변경했습니다. 어떤 이유로 load.path가 package.el에 의해 올바르게 업데이트되지 않습니다. 전화를 (setq load-path (cons "~/.emacs.d" load-path)) 한 후에 해야 할 문제를 해결하려면package-initialize

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