Emacs는 많은 el-files로 어떻게 즉시 시작할 수 있습니까?


11

모든 Emacs'er가 알고 있듯이, 나는 현재 광범위한 dot-Emacs 구성으로 고통 받고 있습니다. 내 모든 패키지는의 컨테이너 내에 있으며 모든 내 파일을 use-package바이트 컴파일했습니다 .el. 그럼에도 불구하고 Emacs는 6.4 초 안에 시작된 후 나머지 패키지 (약 40 개 정도)를로드합니다.

긴 시작 시간을 해결하는 다른 방법에 대해 생각하고 있었고 무언가를 발견했습니다. 기본 Emacs (사용자 구성없이)는 .el모든 Emacs에 포함 된 많은 라이브러리를 사용합니다 . 에 있습니다 \shares\emacs\version number\lisp\.

많은 lisp 파일이 있어도 1 초 안에 시작할 수 있습니다. 기본 Emacs에 포함 된 많은 패키지의 파일을 검사 할 때 Emacs가 1 초 이내에 시작되는 이유를 설명 할 수있는 특별한 발견은 없었습니다. 누구든지 Emacs가 수천 개의 파일을 가지고 어떻게 그것을 관리하는지 말해 줄 수 .el있습니까?


1
당신이 사용하십니까 :defer t당신에 use-package가능한 선언?
lunaryorn

7
Emacs를 빌드 할 때 사용되는 덤프 메커니즘을 통해 Emacs의 수많은 핵심 라이브러리가 실행 파일에 사전로드 되어 있으며 , 이로 인해 많은 것들을 엄청나게 빠르게로드한다는 착각을줍니다. 보기 당신이 그것에 대해 학습에 관심이 있다면. C-h i g (elisp) Building Emacs
phils

2
@ phils : 귀하의 의견을 답변으로 확장 할 수 있다면 좋을 것입니다. 덤프 메커니즘은 아직 Emacs-SE에 언급되지 않은 것 같습니다.
파프리카

및 광산 76S입니다 ..
Leu_Grady

파프리카 : 완료 ..
필 9/11/2012

답변:


9

누구든지 Emacs가 수천 개의 .el 파일로 어떻게 Emacs를 관리하는지 말해 줄 수 있습니까?

Emacs는 시작할 때로드하지 않음으로써 코어 애플리케이션의로드를 유지하지 않는 "관리"합니다. 이것은 키보드 컨트롤을 사용자에게 더 빨리 돌려주는 효과입니다.

그러나 언제로드됩니까? 해당 기능, 모드 또는 기능을 처음 사용할 때

속도가 느려지지 않습니까? 네, 처음 사용할 때. 이것이 절충점입니다. emacs 시작 시간이나 처음 사용할 때 속도를 늦추고 싶습니까?

눈에 띄는가? 다른 코어 라이브러리도로드되므로 시작시로드하는 데 시간이 더 오래 걸립니다. 그러나 처음 사용할 때는 해당 서브 세트 기능 만로드되므로 속도가 더 빠릅니다.

그렇다면 왜 스타트 업에 부하를 줍니까? 일부는 시작할 때 자주 사용하는 모든 라이브러리를로드하기를 기다리지 않으므로 일단로드되면 모든 작업이 그 후 빠르게 수행됩니다.

어떻게 선택할 수 있습니까? Drew와 다른 사람들이이 질문에 대한 답변에서 지적했듯이 자동로드 및 유사한 트릭을 사용하여 제어 할 수 있습니다. 그러나 가장 중요한 고려 사항은 사용 패턴입니다. vi와 같은 emacs를 계속 사용하고 열고 닫는다면, 시작 시간이 고통 스럽습니다. 그러나 다른 한편으로, 당신은 항상 실행 emacs를 사용하는 경우, 1 초 또는 1 분의 시작 시간은 눈에 띄거나 관심을 가질만큼 중요하지 않습니다.

테스트, 실행 또는 vi와 같은 emacs를 사용하는 동안 즉시 시작하기 위해 배치 모드 또는 Zile 을 사용할 수 있습니다 .

내가 선호하는 것은 시작시로드되어 모든 오류가 사전에 잡히는 것입니다. TRAMP가 관리하는 여러 원격 위치와 함께 수많은 버퍼, 모드 및 컴파일 상태가 활성화되어있는 근무일 중에로드 오류를 처리하지 않아도됩니다. 이러한 조건에서 자동로드 오류를 디버깅하는 것은 그리 유쾌하지 않습니다.


10

포함 된 많은 라이브러리는 시작할 때로드되지 않습니다.

일부 명령 등은 자동으로로드 되므로 Emacs가이를 인식하고로드하는 방법을 알고 있습니다. 자동로드 된 명령을 사용하려고하면 Emacs는 아직로드되지 않은 경우이를 정의하는 라이브러리를로드합니다.

자체 명령 또는 작성하지 않은 라이브러리의 명령에 상관없이 자체 자동로드를 작성할 수 있습니다. Elisp 매뉴얼 노드 자동로드를 참조하십시오 .


게으른 로딩으로 알려진, 나는 추정? 게으른 로딩이 달성되는 방법에 대한 예가 있습니까, 그것이 호출 될 때만로드됩니까?
ReneFroger

무엇을 요구하는지 잘 모르겠습니다. 예, 게으른 로딩이라고 부를 수 있습니다. Elisp 매뉴얼에는 예제와 설명이 있습니다. ;;;###autoload라이브러리에서 명령 정의 바로 앞에 자동로드 쿠키 ( )를 추가하면 자동로드 정의를 제공하여 누군가 호출 할 때 라이브러리를로드 할 수 있습니다.
Drew

...하지만 자동로드 쿠키가 처리되는 방법 / 경우를 이해하려면 해당 수동 링크를 읽으십시오. 패키지 관리자는 모든 ELPA 패키지에 대해 패키지 관리자를 처리합니다. 그렇지 않으면 (autoload...)init 파일에서 직접 호출 하여 등록합니다.
phils

두 가지 답변에 감사드립니다. 더 많은 것을 발견하는 데 많은 도움이되었습니다!
ReneFroger

9

다른 답변 (대부분의 라이브러리가 실제로 요청시에만로드되는 방법을 설명하는 것) 외에도 실행 파일 자체 에 많은 핵심 elisp 라이브러리를 사전로드 하는 문제가 있습니다 emacs. 엄청나게 빨리 많은 것들.

이는 소위 "맨손"버전의 Emacs (실제로 컴파일 된 기능 이며 완전히 작동하지만 elisp 인터프리터 및 C로 작성된 기타 핵심 기능 만 포함)를 실행하고로드하도록 지시함으로써 달성됩니다. emacs라이브러리가 내장 된 실제 바이너리를 "덤프"하기 전에 미리로드해야하는 모든 elisp 라이브러리

이 메커니즘은 elisp 매뉴얼에 자세히 설명되어 있습니다.
C-hig (elisp) Building Emacs RET

Emacs를 직접 컴파일했다면이 프로세스를 실험 해보고 원하는 경우 최종 실행 파일의 대체 버전을 덤프 할 수도 있습니다 (일반적으로 권장되지는 않지만 시설이 있음).

컴파일 된 temacs바이너리는 src디렉토리 에서 찾을 수 있으며 다음과 같이 각 버전을 실행하여 시작 시간의 차이를 비교할 수 있습니다.

$ time ./temacs -l loadup --batch
$ time ./emacs --batch

내 시스템에서 전자는 ~ 4 초가 걸리고 (111 elisp 라이브러리가로드되는 동안) 후자는 ~ 0.02 초가 걸립니다.


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