지연 초기화를 어디에 포함시켜야합니까?


13

라텍스 모드에 특정 키 바인딩을 추가하고 싶습니다.

(define-key latex-mode-map (kbd "<f6>") 'my-latex-defun)

동시에 특정 모드가로드 될 때만 설정하고 싶습니다. 따라서 적절한 후크 ( latex-mode-hook)를 사용하거나 (with-eval-after-load "tex-mode" ...키 바인딩 정의를 래핑하는 절 을 사용하는 것 사이에 환경 설정 (모범 사례)이 있는지 알고 싶습니다 . 나는 두 가지를 모두 테스트했지만 정상적으로 작동하지만 어느 것이 올바른 방법인지 궁금합니다.


2
with-eval-after-load키맵 변경이 한 번 로드 됩니다. 모드 와 관련된 새 파일을 로드 할 때와 같이 모드가 실행될 때마다 후크가로드 되지만 후크가 정의됩니다. 예를 들어 flyspell-mode또는 hl-line-mode후크에 로드 합니다. 내에서 init.el내가 사용 with-eval-after-load약 160 시간과 add-hook110 시간. 게으른 초기화는 좋은 초기화 (IMO)입니다.
rasmus

@rasmus는 시간이 있다면 답처럼 들립니다. :) 코드가 몇 번 실행되는지의 구별은 내 의견으로는 고려해야 할 주요 사항입니다. (내가 생각할 수있는 유일한 사람이다.)
Sean Allred

모드 후크에서 키 바인딩을 변경하는 것이 좋지 않은 이유는 emacs.stackexchange.com/questions/990/…을
tarsius

답변:


18

게으른 초기화는 좋은 초기화입니다.

(IMO)

사용시기 with-eval-after-load

with-eval-after-load로드 되면 특정 때 기능 이나 파일이 되어 처음으로 키맵 변화는 분명 내부 이들 중 하나 간다, 그래서로드. 아니 최소한 키맵이 초기화 시간 [같은 시도 무언가에 알려지지 않을 수 있기 때문 (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)emacs -q]. 후크는 후크가 시작될 때마다 함수를 키에 바인딩하기 때문에 여기서 좋은 해결책 은 아닙니다 . 으로 안경 원숭이 속의 노트, 당신은 할 수 있습니다 더 읽어 이유에 대해를 하지 에 후크한다.local-set-key

마지막으로, 참고 with-eval-after-loadGNU Emacs의 24.4 주위에 2 라인 래퍼의 인용 할 필요는 없다.eval-after-loadbody

후크를 사용하는 경우

후크는 기준이 충족 될 때마다로드되는 기능 목록입니다 (예 : 특정 모드가 시작됨). 후크의 일반적인 용도는 다음과 같은 마이너 모드,로드하는 것입니다 flyspell-mode또는 hl-line-mode. 예 (add-hook 'org-agenda-mode-hook 'hl-line-mode). 로 레미는 지적, add-hooks똑똑하고, 후크 변수가 아직에로드되어있는 경우에도 옳은 일을 할 것입니다. 그럼에도 불구하고, 나는 다음과 같은 많은 조항을 가지고 있는데, 이것은 속도 향상에 대해서는 무시할 수 있지만 조직과 의존성 구조에 대한 감각을줍니다.

(with-eval-after-load 'org-agenda
  (add-hook 'org-agenda-mode-hook 'hl-line-mode))

왜 후크 후 추가 org-agenda합니까? 항상 그렇듯이 C-h v org-agenda-mode-hook C-j제공합니다. 후크는 org-agenda.el그림과 같이 정의 됩니다 *help*.

추가 기능로드 with-eval-after-load

with-eval-after-load추가 기능을로드 할 때도 중요합니다. 아마도 (with-eval-after-load 'org (require 'org-inlinetask))인라인 작업을로드하는 것과 같은 것을 원할 것입니다 . 이유를 보려면 (find-library "org-inlinetask"). 때문에 org-inlinetasks.el직접 (require 'org), 좋은 모든 autoload사용자 친화적 인 이맥스 메인테이너가 제공하는 큰 관심을 걸렸다는 "무시"되고 모두 org.el(c)로드됩니다.

그러나 (개인) defun여러 곳이 필요한 경우 어떻게해야 합니까? 정말로 까다 롭다면 defuns 파일을 다른 파일에 load-path넣고 autoload쿠키를 추가 하거나 Emacs에게 함수를 사용하여 autoload함수 를 찾을 위치를 알려줄 수 있습니다 . 그런 다음 이와 같은 것이 효과가 있습니다.

(autoload 'org-cdlatex-mode "org" "cdlatex mode from org.")
(with-eval-after-load "latex"
  (add-hook 'TeX-mode-hook 'org-cdlatex-mode))

또는 당신은 require org그것을 차례로 당기는 것처럼cdlatex

솔직히 개인의 즐거움은 대부분의 시간에 중요하지 않습니다. 내 1150 라인의 개인 데펀 (84 디펀)은 init.el바닐라 이맥스에 0.02를 더합니다.

초기화 시간 측정

intitialization 시간을 근사하는 쉬운 방법은

time emacs --eval "(kill-emacs)"

(에 대한 벤치 마크 emacs -q.

그러나 초기화 병목 현상이 발생하는 위치에 대한 자세한 근사를 얻으려면 Joe Schafer 's를 확인하십시오 esup.

마지막으로 로딩 시간이 마술처럼 사라지지 않습니다. 각 세션에서 모든 기능을 사용할 수 있도록 앞으로 만 진행하고 있습니다.


1
add-hook은 변수가없는 경우 add-hook이 변수를 바인딩하기 때문에로드 후 평가 후로드에 추가 후크를 넣을 필요가 없습니다.
Rémi

당신이 맞아요! 그래도 여전히 속도 향상이있을 수 있습니까? [나는 이것을 반영하기 위해 나중에 답변을 업데이트하려고 노력할 것입니다]
rasmus

나중에 후크 또는 키 바인딩에 바인딩하려는 디펀은 어떻습니까? with-eval-after-load게으른 초기화 이점을 잃지 않고 외부에서 defun을 정의해야합니까 ?
jrbalderrama

5

eval-after-load후크 에 대한 제안 과 사용 외에도을 제안 하겠습니다 use-package.el. 필요한 것을 할 수 있습니다

(use-package latex
  :ensure auctex
  :bind ("<f6>" . my-latex-defun))

라텍스까지로드되지 않습니다 후에 당신이 그것을 요청합니다.

참고로,주의해서 사용하면 use-package시작 시간이 1 초 미만으로 줄었습니다. (약 4 초가 걸렸습니다.)


제안 해 주셔서 감사합니다. 또한 use-package를 사용하려고 생각했지만 추가 패키지없이 어떻게하는지 알아 내고 싶습니다.
jrbalderrama

1
@jrbalderrama 노트 use-package이맥스 (25)와 함께 제공하도록 설정되어
숀 알 레드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.