패키지 매니저(package.el)에게 관리를 맡기자

1 minute read

버전 24부터는 패키지 매니저인 package.el 이 디폴트 패키지다. ELPA(Emacs Lisp Package Archive)로 부터 원하는 패키지를 가져오자. 아직 패키지 업그레이드는 좀 불편하다.

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/")
             t)
(package-initialize)

(defconst ohyecloudy/packages '(clojure-mode
                                nrepl
                                undo-tree
                                evil
                                auto-complete
                                ac-nrepl
                                edit-server
                                markdown-mode))

(dolist (pkg ohyecloudy/packages)
  (when (not (package-installed-p pkg))
    (package-install pkg)))

아쉽게도 namespace가 없다. 너도나도 global이다. 그래서 이름 충돌을 막으려고 ohyecloudy/ 를 붙여줬다. emacs guru 아저씨 dotemacs를 참고했다.

패키지 archive를 여러 개 지원한다. MELPA에서 받아야 하는 패키지가 있어서 추가했다.

("gnu" . "http://elpa.gnu.org/packages/")

디폴트로 이거 하나.

require

(require FEATURE &optional FILENAME NOERROR)

require는 한 번 로드를 보장한다. features 라는 전역 변수에 symbol 리스트를 담아두는데, require는 이 리스트를 참조해 로드할 지 안 할지 결정한다. 물론 로드한 후 리스트를 업데이트한다.

C-h v features

로드 목록을 볼 수 있다.

package.el

패키지 매니저는 어떻게 구현했을까? 소스 코드를 어떻게 볼 수 있을까?

M-x find-library package

이걸로 간단하게 소스 코드를 볼 수 있다.

C-h f package-initialize

파일을 열어서 또 함수 찾기. 이런 과정은 귀찮다. 함수를 품고 있는 라이브러리를 알면 저렇게라도 찾으면 되는데, 모르면 어떤 라이브러리에 있는지부터 찾아야 한다. 귀찮다.

C-h f 로 함수 설명을 볼 수 있다. 어떤 파일에서 정의됐는지도 알려준다. 파일 이름을 마우스 클릭하면 바로 함수 코드로 이동한다. 그런데 이거 매번 마우스 잡기도 싫고. 키보드로 하는 방법은 없을까?

C-h b

키바인딩에 있을 것 같다. 찾아봤는데, 뭔가 링크 뭐 이런 건 없어. 이걸 정의 안 했을 리가 없는데… 마우스를 밑줄 그어진 문장으로 옮겼다. 툴팁 나오길 기다리는 중.

mouse-1, RET: find function's definition.

아 그냥 enter 키를 치면 되는구나.

업데이트는 어떻게 하면 좋을까?

;; - Implement M-x package-upgrade, to upgrade any/all existing packages

package.el 에 있는 주석. 아직 upgrade는 구현하지 않았다. 구현하고 구현물을 공헌할 수 있는 단계가 아니니 수동으로 하는 방법을 찾아보자.

M-x list-packages
M-x package-menu-mark-updages

minibuffer에 몇 개가 마크됐는지 나온다. 이 글을 적을 때는 5개

M-x pacakge-menu-execute

mark 된 패키지에 대해 액션을 취한다.

package-archives

(add-to-list ...)
(package-initialize)

이렇게 호출하고 있었는데, 잘못했다. package-initialize 함수 평가 중에 package-archives 값을 읽는다. 그러니 package-archives 를 업데이트하고 호출해야 한다.

참고

Updated <2016-11-20 Sun> 이제는 use-package를 사용해서 관리한다.

C-x C-s C-x C-c