別のコンピューターで同じEmacs環境を取得する方法は?


16

私はEmacsの初心者です(今では約2週間使用して愛しています)。~/.emacs.d/init.elファイルを更新および展開するとき、そこに書き込む内容はM-x package-install、を使用してMELPAからインストールした特定のパッケージ、および自分で作成したファイルなどによって異なります.el

私の質問は、たとえば将来、コンピューターを切り替える必要がありますか?新しいコンピューターで現在とまったく同じEmacs環境をシームレスに取得する最良の方法は何ですか?


3
限り、あなたはあなたの移動することができますとしてinit.el(例えばgitのを使用して)の周りを、このアプローチはまた、(に基づいて動作しますuse-package):lunaryorn.com/posts/...
VanLaser

1つの方法は、.emacs.dディレクトリをDropboxに配置することです。同じOSを搭載したコンピューターでのみ使用しました。* nixのさまざまなフレーバーで問題ありませんが、異なるOSを実行しているマシン間で共有しようとすると問題が発生する可能性があります。
クディット

この質問はemacs.stackexchange.com/q/408/2710に非常に近いものです。違いを強調できますか?
アンドリュースワン

私のような非プログラマーにとって、Googleドライブを使用して3台のマシン(2つのウィンドウ、1つのOSX)でemacs構成とパッケージを同期することは効果的で信頼性があります。emacsとそのパッケージの大部分はプラットフォームに依存しないため、これは機能します。同一のemacsエクスペリエンスをクロスプラットフォームで再現するには、同期されたemacsパッケージディレクトリへのOS固有のパスを解決するために、init.elファイルに数行しか必要ありません。
スネ象

あなたの設定は~/.emacs.dディレクトリ全体なので、マシン間で同期するために好きな方法を使用してください。(例:Githubリポジトリ、Dropboxフォルダー、またはあなたに最適なもの)。
フィルス

回答:


9

正しい解決策はstraight.el、この問題を解決するために作成したパッケージマネージャーを使用することです。これについての詳細は、この質問に対する別の回答で見つけることができます。

この回答は、作業を開始する数ヶ月前に書かれたものでstraight.el、以前は部分的な解決策を達成するための厳密に劣る方法について説明していました。このアプローチについて以下に簡単に説明します。もうお勧めしません。

使用したくないとしてもstraight.el、少なくとも採用するべきuse-packageです。(2つが相互に排他的であるということではなく、最もクリーンなセットアップは両方を使用することから来ると考えています。)


initファイルでパッケージのリストを定義することから始めます。

(defvar my-packages
        '(
          aggressive-indent
          avy
           .
           .
           .
          projectile
          undo-tree
          )
  "List of packages to be installed at Emacs startup.")

次に、それらを自動的にインストールします。

(require 'cl-lib)
(package-initialize)
(unless (cl-every #'package-installed-p my-packages)
  (dolist (package my-packages)
    (unless (package-installed-p package)
      (package-install package))))

あなたが続ける場合はinit.el、バージョン管理下のファイルを、その後、別のマシンにそれを同期することは、あなたのパッケージが自動的にインストールされているになります。もちろん、インストールされるバージョンは完全に異なるため、結果として構成がすぐに機能することは期待できません。これはの根本的な欠陥でありpackage.el、このアプローチが悪い理由の1つです。もう一度見てくださいstraight.el。また、上記のコードでは、パッケージリストとそれらのパッケージの構成が分離されているため、initファイルの内容を追跡するのが難しくなります。これは別の大きな欠点です。もう一度見てくださいuse-package


書いてくれてありがとう!MELPAからダウンロードしたパッケージを含め、Githubですべてをホストすることを選択した場合、これは新しいコンピューターでパッケージを自動更新するMELPAの機能を保持しますか?
space_voyager

1
@space_voyagerはい、すべて同じように起こります。ただし、(1)新しいコンピューターにクローンを作成するとき、EmacsはMELPAからパッケージをダウンロードする必要ありません。それらは既にクローンしたリポジトリに既にあるためです。(2)package.elパッケージの更新に使用するときはいつでも、リポジトリにステージングされていない変更があり、パッケージの更新を含めるためにコミットする必要があります。
ラドンロズバラ

まことにありがとうございます。もう1つ:MELPAはパッケージの更新を自動的に行うと思いました。そうではありませんか?
space_voyager

1
@space_voyager:もちろん、リモートパッケージリポジトリは更新されますが、更新されたパッケージのバージョンはローカルマシンに自動的にダウンロードおよびインストールされません。そのためにあなたがする必要がありM-x list-packages RET Uます。
ラドンロズバラ

1
@Lassi短い答え:Emacsをインストールするものは何でも使用してください。straight.elEmacsパッケージのインストールにのみ使用します。Nixは素晴らしいアイデアですが、私が知っている限りでは、Emacsパッケージの開発には最適化されていません(間違っている場合は修正してください)。システムパッケージマネージャーを使用してEmacsパッケージをインストールする場合、ソースコードを編集して、変更をコミットして上流にプッシュすることはできません。前回、EmacsパッケージのNix構成を見たとき、それは過度に複雑で、一般的にstraight.el開発経験に劣っているように見えました。しかし、あなたのボートに浮かぶものは何でも。
ラドンロズバラ

11

use-packageを使用すると、そのファイルをコンピューター間で移動できます。Emacsが起動すると、インターネットにアクセスできる限り、パッケージを取得して構成します。

まず、パッケージライブラリを設定します。

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

そして、ブートストラップuse-package

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(eval-when-compile (require 'use-package))

これで、Emacsを構成してパッケージがインストールされていると仮定する代わりに、use-packageそれらのインストールと構成の両方に使用できます。たとえば、私のヘルム設定のいくつかについて:

(use-package helm
  :ensure t
  :bind (("M-x" . helm-M-x)
         ("M-y" . helm-show-kill-ring)
         ("C-x C-f" . helm-find-files)
         ("M-s o" . helm-occur))

  :config
  (helm-mode 1)
  (setq helm-echo-input-in-header-line t))

気を付けてください、これは(でinit.el)構成を取得しますが、それだけではありません。たとえば、これはdabbrevファイル、カスタムスニペット、その他の大量のものを移植しません。
Omairマジッド

はい。構成の一部である他のファイルがある場合は、initファイルと一緒にそれらも移動する必要があります。
-zck

その時点で、再度のゲームとなり、「ファイルが実際に私の構成の一部であり、私は私のマシン間で同期して、それをどのように保つか」:(
Omairマジッド

宣言に追加:ensure tするuse-packageか、に設定use-package-always-ensureする必要がありtます。そうしないと、設定をコピーしたときに別のシステムに自動的にインストールされません。
チャクラヴァルシーラグナナンダン

6

次世代のパッケージ管理 straight.el

package.el+ Quelpa を使用してパッケージを管理するための長くてイライラする苦労の後、私は弾丸を噛み、独自のパッケージマネージャー書きました。これはpackage.elほぼすべての点で優れたパッケージ管理エクスペリエンスを提供することにより、完全に置き換えることを目的としいます。

非常に広範なドキュメントを読んで、そのすべての機能について学ぶことができますが、この質問に最も関連するのstraight.elは、完全な再現性に焦点を合わせていることです。つまり、Emacsを正常に起動するのか、新しいマシンで起動するのかは問題ではなく、ローカルの変更はバージョン管理されており、標準状態に戻すことができます。実際には、これは(1)パッケージをGitリポジトリとして複製し、その状態を管理する自動化ツールを提供することで実現されます。(2)initファイルをパッケージ管理状態の唯一の真実のソースとして使用し、他の場所に変更可能なデータを保存しない。(3)オプションのバージョンロックファイルを使用して、すべてのパッケージの正確なGitリビジョンと、レシピリポジトリを指定し、straight.el 自体。

開始するには、ブートストラップスニペットを挿入しstraight.elます。これにより、インストールとアクティブ化が行われます。次に、パッケージがインストールされていることを確認するためstraight-use-packageに、initファイルにを呼び出します。

(straight-use-package 'projectile)

はい、それはとても簡単です。package-refresh-contentsそのゴミを処理したり、ゴミを処理したりすることはありません。initファイルからこのフォームを削除してEmacsを再起動すると、Projectileはロードされなくなります(とは異なりますpackage.el)。これは、誤って宣言されていないパッケージに依存しているため、新しいマシンで設定が何らかの形で機能しないことを心配する必要がないことを意味します。

initファイル全体で、いつでも好きなときにパッケージをインストールできます(単一の場所でパッケージのリストを宣言する必要はありません)。もちろん、あなたもできる

(dolist (package '(ace-jump-mode ... zzz-to-char)) (straight-use-package package))

あなたがリストを好むなら。ただしuse-package、パッケージ構成の管理に使用することをお勧めします。最初にインストールする必要があります:

(straight-use-package 'use-package)

次に、straight.elとの統合が組み込まれているuse-packageため、次の「機能する」だけです。

(use-package projectile
  :straight t
  :init (projectile-mode 1))

init-fileを作成して必要なパッケージをインストールしたら、実行M-x straight-freeze-versionsしてバージョンロックファイルをに保存し~/.emacs.d/straight/versions/default.elます。straight.el新しいマシンで最初にEmacsを起動したときに、すべてのパッケージの正しいバージョンをチェックアウトできるため、このファイルをバージョン管理下に置く必要があります。(を使用して、ロックファイルで指定されたバージョンに手動で戻すことができますM-x straight-thaw-versions。)

私が他の答えで言及したマシンローカルのドットファイルのアイデアをサポートするために、プロファイルシステムをstraight.el提供しています。ドットファイルにシンボリックリンクを使用することをお勧めします(この場合、init.elローカルの初期化ファイル(該当する場合)、バージョンのロックファイルを使用する場合)。

straight.el他のパッケージマネージャーと比較する方法を知りたい場合は、詳細な比較セクションをご覧ください。しかし、にもすべてに関するドキュメントたくさんあります


4

caskを使用してパッケージを管理できます。git / githubを使用して、emacsドットファイルをソース管理および同期します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.