use-package에서 init와 config의 차이점


16

다음과 같은 구성이 있습니다.

(use-package html-mode
  :mode "\\.html\\'"
  :config
  (progn
    (add-hook 'html-mode-hook 'turn-off-auto-fill)))

이제 HTML 파일을 방문 할 때 해당 파일 auto-fill이 꺼져 있지 않은 것을 관찰했습니다 . 내가 사용하지만 :init대신에 :config, auto-fill꺼집니다. 내 질문은 언제 명령이 :config실행됩니까?

답변:


16

패키지가 연기되는 경우에는 다릅니다. 즉, 필요할 때까지로드되지 않습니다. 이 경우 :initemacs 파일을 처음 읽을 :config때 실행 되지만 패키지가 실제로로드 될 때 실행됩니다.

귀하의 예에서 mode묵시적으로 사용 하면 패키지로드가 지연됩니다. html 파일을 처음 방문 할 때 패키지가로드되도록 구성했습니다.

:demand시작할 때 패키지가 항상로드되도록하는 데 사용할 수 있지만 여기서 할 일은 후크를 넣는 것입니다 :init.

docstring에서 :

:init Code to run when `use-package' form evals.

이것을 user-init 파일에 넣었으므로 기본적으로 시작시 실행됩니다.

:config Runs if and when package loads.

따라서 패키지가 실제로로드 될 때까지 실행하지 마십시오.

:defer Defer loading of package -- automatic if :commands, :bind, :bind*,  :mode or :interpreter are used.

패키지를 자동으로 연기하는 항목 목록을 참고하십시오. 기본적 use-package으로이 패키지가 필요한 조건을 알려 주면 해당 조건이 발생할 때까지 패키지를로드하지 않는다고 가정합니다.

:demand Prevent deferred loading in all cases.

지정한 다른 옵션에 관계없이 시작시 패키지가로드되어 있는지 확인하십시오.

최신 정보

최근 의견을 바탕으로 이것을 다시 방문하면 ... 위에서 말한 내용이 모두 사실이지만 질문에 올바르게 대답하지 못한다고 생각합니다. 여기서 근본적인 문제는 실제로 html-mode패키지가 아니라 패키지에 의해 정의 된 모드 sgml-mode입니다. 이것은 나에게 예상대로 작동합니다.

(use-package sgml-mode
  :mode ("\\.html\\'" . html-mode)
  :config (add-hook 'html-mode-hook 'turn-off-auto-fill))

원래 예제에서 :config이름이 패키지 html-mode가로드되지 않기 때문에식이 평가 되지 않습니다. :init패키지가로드되는지 여부에 관계없이 init 코드가 항상 평가되므로 동일한 표현식을 작동 하도록 이동하십시오 .



@npostavs 감사합니다. 아직 use-package 2.0으로 옮기지 않았습니다. 우선, 나는 :idle꽤 광범위하게 사용 하고 ": idle is removed"의 영향을 조사하지 않았습니다.
glucas

1
HTML 파일을 방문하고 패키지가로드되도록 트리거 할 auto-fill때 구성 코드가 실행되지 않은 이유를 이해 하지 못합니다. 나는 같은 문제를 가지고있다.
Ken Williams

@KenWilliams 문제는 HTML 모드에서도 발생합니까? 실제 문제 html-mode는 패키지가 아니라고 생각합니다 . 적어도 내 현재 Emacs 버전 html-mode에서 패키지에 정의되어 sgml-mode있습니다. 따라서 use-package명명 html-mode된 패키지 가로드 될 때 무언가를하도록 지시하면 해당 패키지 가로드되지 않기 때문에 해당 코드가 실행되지 않습니다. 에 html 모드 설정을 넣어야합니다 (use-package sgml-mode ....).
glucas

죄송합니다. 내 문제는 org-mode아닙니다 html-mode. 비슷한 문제는 패키지가 호출 org-mode되지만 ELPA 패키지가 호출 된다는 것입니다 org. 어쩌면 그것은 혼란 스럽습니까?
Ken Williams

7

이 예제를 통해 :init와 의 차이점을 이해하기가 훨씬 쉬워졌습니다 :config. ace-window패키지 의 예를 보자 (그러나 이것은 모든 패키지 일 수 있음). 이것을 init.el파일에 넣으십시오 .

(use-package ace-window
  :ensure t
  :defer t
  :config
  (progn
    (message "ace window: hello world")))

이제 이맥스를 열고 *Messages*버퍼에서 hello world메시지 가 있는지 확인하십시오. 패키지가 지연되어 찾을 수 없습니다. 이제에서 config로 변경하십시오 init.

(use-package ace-window
  :ensure t
  :defer t
  :init
  (progn
    (message "ace window: hello world")))

이제 emacs를 닫았다가 다시 열고 *Messages*버퍼를 검사하십시오 . ace window: hello world언제 어떤 코드를 제공하든 코드가 실행되므로 메시지 :init가 표시됩니다. 이 config경우 해당 패키지가로드 될 때만 실행됩니다.


키워드 :init와 키워드의 차이점은 무엇 :preface입니까?
Doctorate

@doctorate : :preface문제의 패키지가 비활성화 된 경우에도 실행 되지만 :init패키지가 활성화 된 경우에만 실행됩니다.
bbenne10
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.