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