Emacs 시작을 빠르게 하기
Emacs의 시작시간을 빠르게 하는 것은 doom emacs의 작성자인 Henrik Lissner씨가 이곳에 잘 정리해 놓았다. 그중 나의 config에 적용한 방법들을 설명해 본다.
gc 줄이기
init.el을 읽어 들이는 동안 가비지 콜렉션을 하지 않게 early-init.el에서 gc-cons-threshold를 큰 숫자(256M)로 바꾸어 놓는다
;; early-init.el
(setq gc-cons-threshold 268435456
gc-cons-percentage 0.6)
시작이 완료된 후에는 다시 적당한 수치(16M)로 바꿔 놓는다. use-package로 hook을 쉽게 하기 위해 startup이라는 emacs 내장 패키지를 사용한다.
(use-package startup
:ensure nil
:no-require
:hook (window-setup . my-setup)
:preface
(defun my-setup ()
"Set up window."
(setq file-name-handler-alist orig-file-name-handler-alist)
(setq-default gc-cons-threshold 16777216
gc-cons-percentage 0.1)))
file-name-handler-alist를 바꿔 놓기
file-name-handler-alist는 모든 파일을 열 때마다 참조하는 리스트인데, 시작 시간 동안에는 그럴 필요가 없으므로 nil로 바꾸어 놓는다.
;; early-init.el
(defvar orig-file-name-handler-alist file-name-handler-alist)
(setq file-name-handler-alist nil)
마찬가지로 시작 시간이 끝나면 원래대로 회복해 놓는다. 위의 my-setup 함수 참조.
모든 패키지를 나중에 로딩하기
모든 패키지는 필요할 때 로딩하게 use-package를 활용한다. use-package에서 :bind, :mode, :hook, :commands를 쓰면 자동으로 나중에 로딩하기가 된다. 예로 다음과 같이 쓰면
(use-package eshell
:ensure nil ; emacs 내장 패키지이므로 다운로드 받지 않는다는 뜻
:bind
("s-e" . eshell)) ; s-는 super키랑 같이 누르라는 건데 나는 ⌘를 super에 매핑함
⌘e를 누를 때까지 eshell 패키지는 로딩이 안되다가 ⌘e를 누르면 로딩이 된다.
적당한 hook이나 bind를 못찾겠으면 :defer 1을 사용한다. 이러면 emacs 시작 후 1초후에 로딩하게 된다. 예로 exec-path-from-shell은 시간을 꽤 잡아먹는 패키지인데, :hook을 걸기에 좀 애매하므로 1초후에 로딩하게 한다. window-setup-hook에 걸수도 있지만 그러면 emacs가 시작하는 동안 window가 다 초기화 되지 않은 상태에서 상당 시간 멈처 서 있게 된다.
(use-package exec-path-from-shell
:defer 1
:config
(exec-path-from-shell-initialize))
lexcial-binding 사용
init.el 맨 처음 줄에 다음과 같이 적으면 lexical-binding이 적용되고 emacs lisp 실행이 조금 빨라진다.
;; init.el -- tangled from config.org -*- lexical-binding: t; -*-
실제로는 잘 체감되지 않으나, lexical-binding이 좀 더 직관적이므로 이렇게 사용한다.
결과
그럼 실제로 얼마나 빠르게 뜨는지 보자. 아직 doom emacs 보다는 느리지만 쓸만하다.
댓글
Comments powered by Disqus