use-package-: init 또는 : config


14

사용자가 패키지 구성이 필요한지 여부를 확인 할 수있는 어떤 규칙이 있습니까 :init또는 :config?

답변:


13

사용자가 패키지 구성이 필요한지 여부를 확인 할 수있는 어떤 규칙이 있습니까 :init또는 :config?

모든 설정 및 패키지에 적용되는 일반적인 규칙은 없습니다. 의 README 파일 을 읽으면 이러한 키워드의 의미에 익숙해 져야 합니다use-package .

요약하면, :init당신은 최고 수준의 구성 형태를 배치 것처럼 블록은 시작시 (일반 전화의 예를 외부로 실행 use-package하여의를) user-init-file. 이는 해당 패키지의로드 여부에 관계없이 항상 실행됨을 의미합니다.

반면에 :config블록은 eval-after-load메커니즘 을 통해 해당 패키지가로드 된 후 실행 됩니다.

따라서 적용 가능한 장기 실행 설정을에서 (으) :init로 이동하여 시작 시간을 향상시킬 수 있습니다 :config. 특정 패키지를로드 한 후에 만 ​​정의 된 변수를 수정해야하는 경우 이와 유사하게 :config블록 에 배치해야합니다 . 와 같은 일부 변수 gnus-home-directory는 해당 패키지를로드하기 전에 설정해야하므로에 배치해야합니다 :init. 언 바운드 상태에서도 후크를 수정할 수 있으므로 모든 적용 가능한 add-hook/ remove-hook호출을 :init블록 에 넣는 것이 좋습니다. 이는 설정에 더 많은 모듈성을 제공합니다.

:custom키워드를 사용하거나 쉬운 사용자 정의 인터페이스를 직접 사용 하여 특정 설정을 배치 할 위치를 파악하지 않아도되는 경우가 종종 있습니다.


2

일반적인 규칙이 있는지 확실하지 않습니다 ( " :init실제 패키지를로드하기 전에 사전 :config구성에 사용 하고 다른 구성에 사용").

그러나 :init예를 들어 "this"패키지의 함수를 사용하기 위해 다른 모드 맵 키 바인딩을 추가하고 싶을 때 본인이 사용 합니다. 그리고 여전히 "this"패키지가 게으르게로드되기를 원합니다.

다음은 지연 로딩의 예입니다 dired-ranger.

(use-package dired-ranger
  :commands (dired-ranger-copy dired-ranger-paste dired-ranger-move)
  :init
  (add-hook 'dired-mode-hook
            (lambda ()
              (define-key dired-mode-map (kbd "M-w") 'dired-ranger-copy)
              (define-key dired-mode-map (kbd "C-y") 'dired-ranger-paste)
              (define-key dired-mode-map (kbd "C-c C-y") 'dired-ranger-move))))

추신 : 존재하지 아니하는 경우 :defer, :commands, :mode등 다음, 패키지 로딩이 게으른 만드는 :init하고 :config(하지만 더 많거나 적은 동일해야합니다 :init:) 이전에 평가됩니다)


4
모드 후크에서 키 바인딩을 수정 하면 해당 모드에서 버퍼를 열 때마다 키 바인딩이 실행 됩니다. 패키지가로드 된 후 키 바인딩을 한 번만 수정하면됩니다. 이를 위해 :bind키워드를 사용 하거나 :config블록 에서 키 바인딩을 수정할 수 있습니다 .
Basil

실제로, 그것에 대해 생각하지 마십시오. 그러나 :config너무 늦었습니다. 게으른 로딩은 바인딩을 적용하지 않습니다. 그리고 :bind와는 :map실제로 바인딩하지 않습니다.
Maxim Kim

3
:config너무 늦지 않았습니다-정확히 dired-mode-map처음 정의 된 시점 입니다. 당신은 아마 잘못에 넣어있는 use-package형태 dired-ranger가 아닌 dired경우, dired-mode-map정의된다. 또한 왜 :bind작동하지 않는지 설명 할 수 있습니다 . 기본적으로, 당신이 잘못하고 있거나 use-package버그가 있습니다. 로컬 키 바인딩과 eval-after-load자동로드 된 명령 / 키맵의 글로벌 키 바인딩을 혼동하지 마십시오 .
바질

@Basil, thx, 네 말이 맞아. 내 문제는 내가 설정 use-package-always-ensure했고 패키지를 사용하려고 할 때 elpa에서 가져 오는 데 실패했습니다. 그러나 :ensure nil거기에 문제 가 있으면 체인 패키지 로딩 dired-> dired-rangerusing을 설정할 수 있습니다 :after.
Maxim Kim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.