web-dev-qa-db-ja.com

MELPAを使用したemacsパッケージの自動インストール

Emacsで使用するすべてのパッケージをinit.elファイルで宣言します。不足しているパッケージを例えばでロードすることは可能ですか? MELPAがリストを介さずにemacsを起動し、インストールするものにマークを付けるとどうなりますか?

29
Objective

新しい答え:

私の元の答えはまだ有効ですが、現在はメソッド Jordonの提案 を使用しています。 use-package は、整頓されたEmacs構成用の素晴らしいツールです。実際、元の回答を書いたとき、私はそれをクリーンなパッケージのロードにすでに使用していました。

当時、私は そのREADMEの最下部 まですべて読むことを怠っていたため、パッケージのインストールも処理できることを理解していませんでした。

package.elユーザー向け

use-packageを使用して、package.elでELPAからパッケージをロードできます。これは、複数のマシン間で.emacsを共有する場合に特に役立ちます。 .emacsに配置すると、関連するパッケージが自動的にダウンロードされます。 :ensureキーは、パッケージがまだ存在しない場合は、自動的にインストールします。

(use-package tex-site
  :ensure auctex)

package.elをロードしてパッケージリポジトリを初期化すると、設定に

(if (not (package-installed-p 'use-package))
    (progn
      (package-refresh-contents)
      (package-install 'use-package)))

(require 'use-package)

その後、このような多くのスニペット:

;;; Expand-region
(use-package expand-region
  :ensure expand-region
  :bind ("C-=" . er/expand-region))

この情報がお役に立てば、ジョードンに賛成票を投じてください。

元の答え:

この問題を解決するために連携する CaskPallet を見てください。

Caskウェブサイトから:

Emacs用のCaskは、BundlerがRubyにとって何であるかです。 EmacsでのELPA依存関係管理を無痛(できる限り無痛)にすることを目的としています。これには、ローカルのEmacsインストールとEmacsパッケージ開発の両方が含まれます。

Caskのインストール の後、Emacs構成に次のようなものを追加する必要があります。

(require 'cask)
(cask-initialize)

Caskは、elisp依存関係のためのDoman固有の言語を定義します。パッケージをインストールするには、何かが必要です ここで概説されているような

(source melpa)

(depends-on "auto-complete")
(depends-on "dash")
(depends-on "f")
(depends-on "flycheck")
(depends-on "helm")
(depends-on "magit")
(depends-on "popup")
(depends-on "projectile")
(depends-on "s")
(depends-on "smartparens")
(depends-on "yasnippet")

これはEmacs設定ファイルではなく、~/.emacs.d/Caskに入ることに注意してください。

パレットは、インタラクティブにインストールされたパッケージでCaskファイルを更新します。 M-x package-list-packagesを使用するため、上記のファイルを手動で管理する必要はありません。

41
Chris

これらの答えはすべて機能しますが、use-packageの使用を強くお勧めします

ここにあります: https://github.com/jwiegley/use-package

use-packageは不足しているパッケージを自動的にインストールするだけでなく、init.elを大幅に簡素化します。

これが私のinit.elの例です

;; initial package setup
(Push "path/to/use-package" load-path)
(require 'use-package)
(require 'package)
(mapc (lambda(p) (Push p package-archives))
      '(("marmalade" . "http://marmalade-repo.org/packages/")
        ("melpa" . "http://melpa.milkbox.net/packages/")))
(package-refresh-contents)
(package-initialize)

;; this will install undo-tree if it's not there
;; and it will set it up how I want
(use-package undo-tree
  :init (global-undo-tree-mode 1)
  :bind (("C-c j" . undo-tree-undo)
         ("C-c k" . undo-tree-redo)
         ("C-c l" . undo-tree-switch-branch)
         ("C-c ;" . undo-tree-visualize))
  :ensure t)

ここで私のinit.elを見てください: https://github.com/jordonbiondo/.emacs.d/blob/master/init.el

各use-packageブロックは、指定されたパッケージが存在しない場合はそれをインストールし、キーバインディング、フック、その他のカスタマイズなどのパッケージの追加セットアップをすべてカプセル化します。

34
Jordon Biondo

Initファイルの少しのコードはそれを非常に簡単に行うことができます:

(setq my-onlinep nil)
(unless
    (condition-case nil
        (delete-process
         (make-network-process
          :name "my-check-internet"
          :Host "elpa.gnu.org"
          :service 80))
      (error t))
  (setq my-onlinep t))

(setq my-packages
      '(ack-and-a-half
        ac-nrepl
        ... more packages here ...
        web-mode
        yaml-mode
        yari
        yasnippet))

(when my-onlinep
  (package-refresh-contents)
  (cl-loop for p in my-packages
           unless (package-installed-p p)
           do (package-install p)))

オンラインチェックは実際には必要ありませんが、インターネット接続がないときにEmacsの起動が滞ることを防ぐのに役立ちます。

私の完全な設定については、ここを参照してください: http://steckerhalter.co.vu/steckemacs.html#sec-2-5

6
steckerhalter

上記で提案された優れたオプションに加えて、 el-get もご覧ください。私は自分のemacsセットアップにそれを使用しており、非常に満足しています。

どう違うのですか?

El-getの2つの主な利点は

1)さまざまなソースからパッケージを取得できます。Webサイトには、次の可能なソースがリストされています。

github、emacswiki、GNU ELPAまたはマーマレード、非公開でホストされているページ、git、bzr、CVSなど

2)パッケージのインストール中に必要に応じて、makeなどのOSコマンドを実行するために使用できます。これにより、elisp以外のパーツを含むパッケージのインストールが容易になります。 emacs-jedi 、ropemacsなど

el-getのインストール

インストールは非常に簡単で、次のbootstrapコードをWebサイトでinitファイルに追加する必要があります。

(add-to-list 'load-path "~/.emacs.d/el-get/el-get")

(unless (require 'el-get nil 'noerror)
  (with-current-buffer
      (url-retrieve-synchronously
       "https://raw.github.com/dimitri/el-get/master/el-get-install.el")
    (goto-char (point-max))
    (eval-print-last-sexp)))

(el-get 'sync)

まだインストールされていない場合は、el-getがインストールされます。

パッケージのインストール

次に、インストールするパッケージを宣言し、el-getにインストールさせます。

;; List of packages you want to install
(defvar my-packages '(auto-complete flycheck smart-parens...))
;; This will install any package from my-packages which is not already installed
(el-get 'sync my-packages)

OR

el-get-install <package-name> RETを実行することで、いつでも手動でパッケージをインストールできます。この方法で数十の異なるパッケージをインストールしたいとは思いませんが、それは可能です。

パッケージの更新

パッケージの更新は、el-get-updateを実行して特定のパッケージを更新するか、el-get-update-allを実行してインストール済みのすべてのパッケージを更新するだけです。

5
user2053036

これが同様の質問に対する私の答えです: https://stackoverflow.com/a/14838150/24517 。コードは不足しているパッケージを自動的にインストールしますが、既存のパッケージを更新しないため、最初の起動だけが遅くなります。

2
jpkotta