[emacs] 패키지 이름 목록을 지정하여 Emacs 패키지를 자동으로 설치하는 방법은 무엇입니까?

packageEmacs 확장을 관리하기 위해 사용 하고 있습니다. 다른 컴퓨터에서 내 Emacs 설정을 동기화하기 위해 .emacs파일 에 패키지 이름 목록을 지정한 다음 package패키지를 자동으로 검색하고 설치할 수 있는 방법을 원합니다. 그러면 을 호출하여 수동으로 설치할 필요가 없습니다 M-x package-list-packages. 그렇게하는 방법?



답변

; list the packages you want
(setq package-list '(package1 package2))

; list the repositories containing them
(setq package-archives '(("elpa" . "http://tromey.com/elpa/")
                         ("gnu" . "http://elpa.gnu.org/packages/")
                         ("marmalade" . "http://marmalade-repo.org/packages/")))

; activate all the packages (in particular autoloads)
(package-initialize)

; fetch the list of packages available 
(unless package-archive-contents
  (package-refresh-contents))

; install the missing packages
(dolist (package package-list)
  (unless (package-installed-p package)
    (package-install package)))


답변

Profpatsch의 의견과 아래 답변을 바탕으로 :

(defun ensure-package-installed (&rest packages)
  "Assure every package is installed, ask for installation if it’s not.

Return a list of installed packages or nil for every skipped package."
  (mapcar
   (lambda (package)
     ;; (package-installed-p 'evil)
     (if (package-installed-p package)
         nil
       (if (y-or-n-p (format "Package %s is missing. Install it? " package))
           (package-install package)
         package)))
   packages))

;; make sure to have downloaded archive description.
;; Or use package-archive-contents as suggested by Nicolas Dudebout
(or (file-exists-p package-user-dir)
    (package-refresh-contents))

(ensure-package-installed 'iedit 'magit) ;  --> (nil nil) if iedit and magit are already installed

;; activate installed packages
(package-initialize)


답변

Emacs 25.1+는 사용자 정의 가능한 package-selected-packages변수 에서 사용자가 설치 한 패키지를 자동으로 추적 합니다. package-install사용자 정의 변수를 업데이트하고 package-install-selected-packages함수를 사용하여 선택한 모든 패키지를 설치할 수 있습니다 .

이 접근 방식의 또 다른 편리한 이점은에 package-autoremove포함되지 않은 패키지를 자동으로 제거 하는 데 사용할 수 있다는 것 입니다 package-selected-packages(종속성은 유지되지만).

(package-initialize)
(unless package-archive-contents
  (package-refresh-contents))
(package-install-selected-packages)

출처 : http://endlessparentheses.com/new-in-package-el-in-emacs-25-1-user-selected-packages.html


답변

Emacs Prelude에 사용하는 코드는 다음과 같습니다 .

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

(setq url-http-attempt-keepalives nil)

(defvar prelude-packages
  '(ack-and-a-half auctex clojure-mode coffee-mode deft expand-region
                   gist haml-mode haskell-mode helm helm-projectile inf-ruby
                   magit magithub markdown-mode paredit projectile
                   python sass-mode rainbow-mode scss-mode solarized-theme
                   volatile-highlights yaml-mode yari yasnippet zenburn-theme)
  "A list of packages to ensure are installed at launch.")

(defun prelude-packages-installed-p ()
  (loop for p in prelude-packages
        when (not (package-installed-p p)) do (return nil)
        finally (return t)))

(unless (prelude-packages-installed-p)
  ;; check for new packages (package versions)
  (message "%s" "Emacs Prelude is now refreshing its package database...")
  (package-refresh-contents)
  (message "%s" " done.")
  ;; install the missing packages
  (dolist (p prelude-packages)
    (when (not (package-installed-p p))
      (package-install p))))

(provide 'prelude-packages)

당신이 MELPA을 사용하지 않는 경우 당신이 그것을 필요로 할 필요가 없습니다 (그리고 당신이 경우에 melpa.el가지고에있을 당신 load-path(또는) MELPA를 통해 설치되어 있어야합니다.이 크게 시작 속도를 느리게하는 것처럼 패키지 데시벨은 (마다 새로 고쳐지지 않습니다 )-제거 된 패키지가있는 경우에만.


답변

아직 Cask에 대해 언급 한 사람은 없지만이 작업에 매우 적합합니다.

기본적으로 ~/.emacs.d/Cask설치하려는 패키지 목록 을 작성 합니다. 예를 들면 :

(source melpa)
(depends-on "expand-region")
(depends-on "goto-last-change")
; ... etc

cask명령 줄에서 실행 하면 이러한 패키지와 필요한 종속성이 설치됩니다.

또한를 사용하여 설치된 패키지를 자동으로 업데이트 할 수 있습니다 cask update.


답변

package-install패키지 이름을 기호로 호출 하십시오. package-install대화식 으로 호출 하고 이름을 입력하여 패키지의 패키지 이름을 찾을 수 있습니다 . 이 기능 package-installed-p은 이미 설치되어 있는지 알려줍니다.

예를 들면 :

(mapc
 (lambda (package)
   (or (package-installed-p package)
       (package-install package)))
 '(package1 package2 package3))


답변

(require 'cl)
(require 'package)

(setq cfg-var:packages '(
       emmet-mode
       ergoemacs-mode
       flycheck
       flycheck-pyflakes
       monokai-theme
       py-autopep8
       py-isort
       rainbow-mode
       yafolding
       yasnippet))

(defun cfg:install-packages ()
    (let ((pkgs (remove-if #'package-installed-p cfg-var:packages)))
        (when pkgs
            (message "%s" "Emacs refresh packages database...")
            (package-refresh-contents)
            (message "%s" " done.")
            (dolist (p cfg-var:packages)
                (package-install p)))))

(add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/") t)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t)
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
(package-initialize)

(cfg:install-packages)