通常のemacsと一緒にspacemacsを実行する:別の.emacs.dを保持する方法


32

spacemacsを試してみたい。しかし、私はまだ通常のemacs設定から切り替えたくないので、現在自分の.emacs.dディレクトリにある設定と、spacemacsの同等の設定を別のディレクトリにしたいです。どちらのディレクトリの名前を気にしません。

chroots / LD_PRELOAD /他のそのような策略がなければ、それは可能ですか?どうすればいいですか?


2
私はEmacsは起動時にオプションでタイマーを設定に関して持っていた同様の質問にも、ダンの回答を参照してください: emacs.stackexchange.com/questions/3588/... 私は以来、その答えのわずかな変化を利用してきました。
法律家

1
「その他の策略」のカテゴリでは、おそらく、spacemacsemacs実行可能ファイルを指すシンボリックリンクを作成し、その値を使用して実行(car command-line-args)する初期化ファイルを決定できます。これはOS Xよりも、他のUNIXシステム上で実行されていることを、もちろん、と仮定すると(OS X上のアプリバンドルの作品の方法は、実行するために、このトリックを困難にする。)される
ハラルドHanche-オルセン

1
ここで別のアプローチを参照してください:emacs.stackexchange.com/q/4253/780
glucas

2
約18か月後、私が宇宙macsを学んだことがない理由がまだあります。受け入れられた答えにいくつかの厄介な問題がありましたが、もう一度試してみましたが、まだ真実です。組織層を追加した後、「シンボルの関数定義はvoid:ループ」になりました。私はこれが原因の一部であることを知りませんが、それはまさに問題です。洗練された「バッテリーを含む」プロジェクトの場合、それを開始するために何かを一緒に畳まなければならないのは奇妙に思えます。おそらく不公平ですが、それによって私は信頼を失います。多分それが固定されます別の18ヶ月で...
Croad Langshan

回答:


20

1つのオプションは、~/.emacsファイルに読み込む構成を指定することです。Emacsが起動すると、を調べる前にそのようなファイルを探します~/.emacs.d/。詳細については、EmacsマニュアルのInit Fileを参照してください。

たとえば、を作成し、~/.spacemacs.d既存のもの~/.emacs.dをそのままにしておくことができます。次に、~/.emacsを作成して、使用する気分になっているものをロードします。

(setq use-spacemacs t)   ; or nil 

(when use-spacemacs
  (setq user-emacs-directory "~/.spacemacs.d/"))   ; defaults to ~/.emacs.d/

(load (expand-file-name "init.el" user-emacs-directory))

必要に応じて、.emacsファイルを変更せずに構成を切り替える方法を考え出すことができます。たとえば、シェルまたはspacemacsを起動するために使用するスクリプトで設定した環境変数を.emacsでチェックします。

(setq use-spacemacs (getenv "USE_SPACEMACS"))

1
確かに、spacemacsを実行しているかどうかを確認するには、elispの内部からの方法が必要です。たとえば、fboundpspacemacsに固有の関数またはコマンドを(withを使用して)チェックしますか?
ハラルドハンシュオルセン

2
確かに、しかしそれは私が理解したように問題ではなかった。Spacemacsは単なるemacs構成であり、OPは複数の独立したemacs構成ディレクトリを維持する方法を知りたいと考えています。
グルカ

1
@ HaraldHanche-Olsenをダウンロードしたときも驚きましたが、考えてみると、それは完全に理にかなっています。私たちがそれを期待する理由は、ほとんどのシステムで、spacemacsのような洗練された「製品」を作るために、低レベルのシステム言語を削除する必要があるからだと思います-しかし、emacsには非常に多くの拡張性があります(elispに感謝)それは必要ありません。
クロードランシャン

1
私はこれを受け入れましたが、実際には試していませんでした。私が持っている今、それはまったく動作しません:ファイルエラー:ロードファイルを開くことができません、/ home / me / .emacs.d / core / core-load-paths.el-私(setq user-emacs-directory "~/.spacemacs.d/")はそれをする必要がありました動作しprognます(条件のspacemacsブランチで)。それをあなたの答えに追加して、もう一度受け入れることができますか?
クロードランシャン

2
@glucas私はwin10にいます。何らかの理由でHOMEがc:/ users / nateに割り当てられました。環境変数を削除し、すべてが正常に機能しました。
ナサニエルサックス

12

ファイルをロードするだけでなく、実行時環境をシンボリックリンク.emacs.dまたは変更HOMEするだけでなくinitで行うこともあるため、@ glucasが提案したもののバリアントを選択しました。異なる初期化ディレクトリ間の切り替えに環境変数を使用するために、#15539のコードを使用し、#15539startup.elのパッチを追加しました。何も指定しない場合、デフォルトが使用されます。

spacemacsには1つの問題がありましasyncた。変更されたinitディレクトリを知らないため、必要なファイルが見つかりません。しかし、これは最近spacemacsで解決されました:.emacs.d 以外の設定ディレクトリを使用するときのエラー・問題#3390

だから、ここに~/.emacs元のinitコードのように動作するはずですが、設定可能なinitディレクトリがあります:

;;; .emacs --- let the user choose the emacs environment to use

;;; Commentary:
;;; This code mimics the behaviour of `startup.el' to let the
;;; usage of the custom init directory behave just like the
;;; one and only "~/.emacs.d".
;;;
;;; By setting the environment variable `EMACS_USER_DIRECTORY'
;;; the user-emacs-directory can be chosen and if there is an
;;; `init.el' the configuration from that directory will be used.
;;; If the environment variable is not set or there is no `init.el'
;;; the default configuration directory `~/.emacs.d/' will be used.
;;;
;;; The variable `server-name' will be set to the name of the directory
;;; chosen as start path.  So if the server will be started, it can be
;;; reached with 'emacsclient -s servername'.
;;;
;;; This now works with a current version of spacemacs but does not
;;; work with `async-start' in general, if the code executed with `async'
;;; uses `user-init-dir' or makes other assumptions about the emacs
;;; start-directory.

;;; Code:
(let* ((user-init-dir-default
    (file-name-as-directory (concat "~" init-file-user "/.emacs.d")))
       (user-init-dir
    (file-name-as-directory (or (getenv "EMACS_USER_DIRECTORY")
                    user-init-dir-default)))
       (user-init-file-1
    (expand-file-name "init" user-init-dir)))
  (setq user-emacs-directory user-init-dir)
  (with-eval-after-load "server"
    (setq server-name
      (let ((server--name (file-name-nondirectory
                   (directory-file-name user-emacs-directory))))
        (if (equal server--name ".emacs.d")
        "server"
          server--name))))
  (setq user-init-file t)
  (load user-init-file-1 t t)
  (when (eq user-init-file t)
    (setq user-emacs-directory user-init-dir-default)
    (load (expand-file-name "init" user-init-dir-default) t t)))

(provide '.emacs)
;;; .emacs ends here

追加の努力なしにデーモンとして動作する素晴らしい追加もあります:server-nameはinitディレクトリの名前に設定されます。だから今、あなたはバニラspacemacsで2番目のemacsデーモンを起動することができます

EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon

まだemacsclientを使用します

emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'

私のユースケースは非常にシンプルで、私は唯一のものであることに驚いています:私は常に実行中のemacsデーモンを持ち、それをguiやコンソールから(たとえばsshで)使用しています。このemacsでは、すべてのドキュメントと作業ログを準備するため、常にそこにある必要があります。しかし、その後、現在の構成を廃止するか、いくつかの巧妙なアイデアを使用できるようになるまで、spacemacsまたは他の配布パッケージのいずれかを試して、構成します。また、他の人と同様に、同僚用のシンプルな基本構成を作成し、実行中のインスタンスで組織モードで文書化したいと考えました。

私が知っている唯一の問題はasync、変更されたinit dirを知らないことなasyncので、デフォルトでインジェクトされるべき変数を持つ設定を追加する最良の方法を考えます。async-startspacemacsが行ったのと同じように呼び出します。


これは本当に素敵で、私が使う必要があるまで美しく働きましたasync。:-(それはあなたが投稿以来、数ヶ月をされているので、あなたは回避策がありますか?
トレイ・

残念ながらそうではありません-しかし、spacemacsでは修正されており、一般的な非同期では変更が必要であるかどうかは本当にわかりませんasync-start。変数のリストを使用してasyncを構成できれば、便利で便利ですasync-start。これは、のすべての呼び出しで使用されます。
ウーヴェKoloska

1
このアプローチでは、.emacsがロードされる前に、デフォルトのuser-emacs-directoryから初期化される他の変数が存在する場合があります。たとえば、(setq custom-theme-directory user-emacs-directory)ここに追加する必要がありました。
グルカ

1
この変数がどこに設定されているかはわかりません。なぜなら、最小のtestenv内で変数を調べると、「〜/ .emacs.d /」という値が得られるからです元の値は「〜/ .emacsenv.d / init-test /」でした。したがって、正しい値を持ちますが、これは上書きされました。
ウーヴェKoloska

1
私は質問をしてからずっと後に、実際にこの答えを使用することになりました。受け入れられた答えはあまりにも長く、実際には実装にあまり注意を払っていないため、変更していません!しかし、この答えは私にとって非常に役立ちました。
クロードランシャン

5

これは、説明され、ここで、そこでの継続的なPRドキュメントに追加するには:

mkdir ~/spacemacs
git clone git@github.com:syl20bnr/spacemacs.git ~/spacemacs/.emacs.d
HOME=~/spacemacs emacs```

6
はい、時々ホームを変更して別の設定を試してみます。欠点は、影響を受けたくない他のことのためにHOMEが使用されることです。
グルーカス

3

すでに回答され受け入れられていますが、可逆的な方法で新しい方法を試したい(emacsの設定を超えて)と感じた場合は、GNU Stowに慣れるのに30分を費やすことをお勧めします。それは一種のln -sステロイドであり、それを使用するいくつかのアプローチがあるかもしれません。1つのサブディレクトリ(offlineimap構成、emacs構成などを含む)でセットアップ全体を行うことができます。これは環境ベースのアプローチとなるか、使用するアプリケーションごとに個別のサブディレクトリを持つことができます。甘い統合失調症。

例えば、私の〜/ Stowからのemacs関連のリスト:

-> % ls ~/Stow | grep emacs
emacs 
emacs_from_scratch
spacemacs
hoodoo@T450s 2:46 [~]

使用できるようになった初期設定が1つあり、「デフォルトに固執する」設定と「自分でロールバックする」設定があります。これらのそれぞれをオン/オフにして、常にすべてを使用可能にすることができます。各サブディレクトリには、〜/に関連するツリー全体を含めることができます。また、組み合わせて一致させることは非常に便利です。


私はそれが起こるときすでにストウを使用しています。しかし、これをどのように使用しますか?使用したいものをシンボリックリンクすることにより、.emacs.dを「動的にスコープ」しているだけです。両方を同時に実行したことはありますか?もしそうなら、私は両方のemacsが.emacs.dを「所有」していると思うと思います。特に、recentf、savehist、autosaveなどとは知らないように、特にemacsの2つのコピーが根本的に異なる構成で実行されている場合、状態を保存することで奇妙なことが起こるのではないかと思いますか?
クロードランシャン

いいえ、必要に応じて構成を切り替えるだけです。
ローマングラジダン

2

@Uwe Koloskaが使用したパッチをチェックアウトしました。メインブランチには含まれていませんでした。私はやや同意します。シェルを使用してemacsの外で問題を解決し、emacsがそれについて何も知らないようにする必要があると思います。

おそらく、この機能はユーザーの観点からより論理的であり、フラグを使用することは一部のユーザーにとって複雑ではありません。

私のユースケースでは、上記の2つのソリューションのバリエーションがこのように機能するように、EmacsのインストールとSpacemacsを保持します。

シェルスクリプト

まず、spacemacsを起動するためのスクリプト:

#!/bin/sh

export EMACS_USER_DIR=~/spacemacs/emacs.d

exec emacs "$@"

このスクリプトが呼び出さspacemacsれ、/usr/local/binフォルダーにインストールされます。

.emacsファイル

次に.emacs、環境変数を適切に処理するファイルがホームフォルダーに必要ですEMACS_USER_DIR

(defvar user-custom-dir (getenv "EMACS_USER_DIR"))

(when (/= (length user-custom-dir) 0)
  (setq user-emacs-directory (file-name-as-directory user-custom-dir)))

(load (expand-file-name "init.el" user-emacs-directory))

私はelispの経験がまったくないので、これを思いつきました。経験豊富な人ならもっと良いものを思いつくかもしれません。しかし、ちょっと、それは動作します。

目の保養

次に、アイコンを追加しないのはなぜですか。

アイコン

[Desktop Entry]
Name=Spacemacs
GenericName=Text Editor
Comment=Edit text
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
Exec=spacemacs %F
Icon=/home/marcs/.icons/spacemacs.svg
Type=Application
Terminal=false
Categories=Development;TextEditor;
StartupWMClass=Emacs
Keywords=Text;Editor;

3
シェルスクリプトではを使用する必要がありますexec emacs "$@"
ウーヴェKoloska

はい、修正しました。
マルクス

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