일반 이맥스와 함께 스페이스 맥 실행 : 별도의 .emacs.d를 유지하는 방법


32

스페이스 맥을 사용하고 싶습니다. 그러나 아직 일반 emacs 구성에서 전환하고 싶지 않으므로 현재 내 구성이 .emacs.d하나의 디렉토리에 있고 spacemacs에 대한 동등한 구성이 다른 디렉토리에 있어야합니다. 어느 디렉토리의 이름이 마음에 들지 않습니다.

chroots / LD_PRELOAD / 다른 그러한 속임수가 부족할 수 있습니까? 어떻게하니?


2
Emacs가 시작될 때 옵션으로 타이머를 설정하는 것과 비슷한 질문에 대한 Dan의 답변도 참조하십시오. emacs.stackexchange.com/questions/3588/… 그 이후로 그 대답의 약간의 변형을 사용하고 있습니다.
lawlist

1
"기타 속임수"범주에서 아마도 spacemacsemacs 실행 파일을 가리키는 심볼릭 링크를 만들고 값을 사용하여 (car command-line-args)실행할 init 파일을 결정할 수 있습니다. 이것은 당신이 OS X에서 이외의 유닉스 시스템에서 실행되고 있는지, 물론, 가정한다 (OS X가 수행 할이 트릭 어렵게에서 방법의 응용 프로그램은 작품을 번들.)
헤럴드 Hanche - 올슨

1
여기에 또 다른 접근 방법을 참조하십시오 emacs.stackexchange.com/q/4253/780이
glucas

2
나는 약 18 개월 후에 다시 스페이스 맥을 배운 적이없는 이유입니다. 나는 받아 들인 대답에 몇 가지 문제가 있었지만 다시 시도했지만 여전히 사실입니다. 조직 계층을 추가 한 후 바로 "Symbol의 함수 정의가 void : loop"입니다. 나는 이것이 원인의 일부라는 것을 알지 못하지만 그것은 정확히 문제입니다 : 세련된 "배터리 포함"프로젝트의 경우, 시작하기 위해 무언가를 함께 모아서 구성이 지원되는지 궁금해하는 것이 이상해 보입니다. 아마도 불공평하지만 그것은 신뢰를 잃게 만듭니다. 아마 18 개월 후에는
고칠 것입니다

답변:


20

한 가지 옵션은 ~/.emacs파일 에로드 할 구성을 지정하는 것 입니다. Emacs가 시작되면, 살펴보기 전에 그러한 파일을 찾습니다 ~/.emacs.d/. 자세한 내용 은 Emacs 매뉴얼에서 Init File 에 대해 읽을 수 있습니다.

예를 들어 a를 만들고 ~/.spacemacs.d기존 상태를 그대로 유지할 수 있습니다 ~/.emacs.d. 그런 다음 사용 ~/.emacs하려는 분위기가 있는 것을로드하려면 a 를 만드십시오 .

(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 파일을 수정하지 않고 구성을 전환하는 방법을 생각해 볼 수 있습니다. 예를 들어, .emacs가 쉘 또는 스페이스 맥을 시작하는 데 사용하는 스크립트에서 설정 한 일부 환경 변수를 확인하게하십시오.

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

1
분명히 elisp 내부에서 spacemacs를 실행하고 있는지 알 수있는 방법이 있어야합니까? 예를 들어, fboundpspacemacs에 고유 한 함수 나 명령을 (with ) 로 확인 하여?
Harald Hanche-Olsen

2
물론, 그러나 내가 이해 한 것은 질문이 아닙니다. Spacemacs는 emacs 구성 일 뿐이며 OP는 둘 이상의 독립적 인 emacs 구성 디렉토리를 유지 관리하는 방법을 알고 싶어합니다.
glucas

1
@ HaraldHanche-Olsen은 다운로드 할 때 너무 놀랐지 만 생각했을 때 완전히 이해되었습니다. 우리가 기대하는 이유는 대부분의 시스템에서 스페이스 맥과 같은 세련된 '제품'을 만드는 것이 더 낮은 수준의 시스템 언어를 사용해야 할 필요가 있기 때문입니다. 그것은 필요하지 않습니다.
Croad Langshan

1
나는 이것을 받아 들였지만 실제로 시도하지는 않았다. 있는 그대로 지금은 가지고, 그것은 꽤 작업을 수행 : 파일 오류 : 열린로드 파일, /home/me/.emacs.d/core/core-load-paths.el이 없습니다 - I가 필요 (setq user-emacs-directory "~/.spacemacs.d/")에 대한 작업하십시오 ( progn조건부 spacemacs 분기에서). 답변에 추가하여 다시 수락 할 수 있습니까?
Croad Langshan

2
@glucas 저는 win10에 있습니다. 어떤 이유로 HOME이 c : / users / nate에 할당되었습니다. 환경 변수를 제거하고 모든 것이 잘 작동했습니다.
Nathaniel Saxe

12

파일을로드하는 것보다 init에 더 많은 일이 있고 다른 한편으로는 런타임 환경을 심볼릭 링크 .emacs.d하거나 변경하는 HOME것보다 @glucas가 제안한 변형을 선택했습니다. I은 코드를 사용 startup.el로부터 패치를 추가 # 15539 다른 초기화 DIRS의 전환에 대한 환경 변수를 사용. 아무 것도 지정하지 않으면 기본값이 사용됩니다.

spacemacs에는 한 가지 문제가 있습니다. 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 디렉토리의 이름으로 설정됩니다. 이제 바닐라 스페이스 맥으로 두 번째 emacs 데몬을 시작할 수 있습니다

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

여전히 emacsclient를 사용합니다

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

내 유스 케이스는 매우 간단하고 놀랍습니다. 유일한 것입니다. 항상 emacs 데몬을 실행하고 gui 및 콘솔 (예 : ssh)에서 사용합니다. 이 emacs에서는 모든 문서와 작업 로그를 준비하므로 항상 있어야합니다. 그러나 현재 구성을 중단하거나 영리한 아이디어를 사용할 수있을 때까지 spacemacs 또는 다른 배포 패키지 중 하나를 시도하여 구성하고 싶습니다. 그리고 다른 사람들과 마찬가지로 동료를위한 간단한 기본 구성을 만들고 실행중인 인스턴스에서 org-mode로 문서화하고 싶었습니다.

내가 아는 유일한 문제 async는 변경된 init 디렉토리에 대해 모른다는 async것이므로 기본적으로 주입 해야하는 변수가 있는 구성을 추가하는 가장 좋은 방법에 대해 생각 하므로 모두 패치 할 필요는 없습니다. async-start스페이스 맥 과 마찬가지로 호출 .


이것은 정말 사랑스럽고 아름답게 작동했습니다 ... 사용할 때까지 async. :-( 게시 한 지 몇 달이 지났으므로 해결 방법이 있습니까?
Trey

불행히도 아닙니다-그러나 스페이스 맥의 경우 고정되어 있으며 일반적인 비동기의 경우 아무 변화 async-start없이 emacs를 시작 하기 때문에 어떤 변수를 사용하려면 변수를 전달해야합니다.하지만 확실히 전달해야합니다. async를 변수 목록으로 구성 할 수 있으면의 호출마다 사용되는 멋지고 편리합니다 async-start.
Uwe Koloska

1
이 방법을 사용하면 .emacs가로드되기 전에 기본 user-emacs-directory에서 초기화되는 다른 변수가있을 수 있습니다. 예를 들어 (setq custom-theme-directory user-emacs-directory)여기 에 추가해야 했습니다.
glucas

1
최소 testenv 내에서 검사 할 때이 값이 "~ / .emacs.d /"이므로이 변수가 어디에 설정되어 있는지 알 수 없습니다 . 원래 값은 "~ / .emacsenv.d / init-test /"입니다. 따라서 올바른 값을 갖지만 덮어 씁니다.
Uwe Koloska

1
나는 실제로 질문을 한 후에 오랫동안이 대답을 사용했습니다. 너무 길어서 실제로 구현에 많은 관심을 기울이지 않았기 때문에 허용 된 답변을 변경하지 않았습니다! 이 답변은 나에게 매우 유용했습니다.
Croad Langshan

5

그것은 설명 여기에 , 그리고이 진행 PR 문서에 추가하려면 :

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

6
예, 때로는 다른 설정을 시도하기 위해 HOME을 변경합니다. 단점은 HOME은 영향을 미치지 않는 다른 것들에 사용된다는 것입니다.
glucas

3

이미 답변을 받았지만 받아 들일 수 있지만 (emacs 설정을 넘어서) 뒤집을 수있는 새로운 방법을 시도하고 싶다면 GNU Stow에 익숙해지기 위해 30 분을 보내는 것이 좋습니다. 그것은 ln -s스테로이드에 관한 것이고, 그것을 사용하는 몇 가지 접근법이있을 수 있습니다. 환경 기반 접근 방식 인 하나의 하위 디렉토리 (오프라인 이미지 구성, emacs 구성 등)에 전체 설정을 갖거나 모든 응용 프로그램에 대해 별도의 하위 디렉토리를 가질 수 있습니다. 달콤한 정신 분열증.

예를 들어 ~ / Stow에서 emacs 관련 목록 :

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

사용할 수있는 초기 구성, '기본 설정'구성 및 '내 자신의 롤'구성이 있습니다. 각 항목을 켜고 끌 수 있으며 항상 모두 사용할 수 있습니다. 각 하위 디렉토리는 ~ ~에 상대적인 전체 트리를 가질 수 있으며 혼합하고 일치하는 것이 매우 편리합니다.


나는 이미 일어난 것처럼 보관을 사용합니다. 그러나 이것을 어떻게 사용합니까? stow를 사용하여 사용하려는 심볼을 심볼 인 / 아웃하여``emacs.d ''를 '동적 범위 지정'하고 있습니까? 당신은 동시에 둘 다 실행합니까? 그렇다면 두 이맥이 모두 "자신의".emacs.d라고 생각합니다. 최근의 emacs 사본이 완전히 다른 구성으로 실행될 때 recentf, savehist, autosave 등을 알지 못하는 것처럼 상태를 저장하는 것들에 이상한 점이 있는지 궁금합니다.
Croad Langshan

아니요, 필요에 따라 구성을 전환하면됩니다.
로마 Grazhdan

2

@Uwe Koloska가 사용한 패치를 확인했습니다. 본점에는 포함되어 있지 않습니다. 나는 다소 동의한다. 나는 문제를 쉘을 사용하여 emacs 외부에서 해결해야한다고 생각하고 emacs는 그것에 대해 아무것도 모른다고 생각한다.

이 기능은 사용자 관점에서보다 논리적 일 수 있으며, 일부 사용자에게는 플래그를 사용하는 것이 덜 복잡합니다.

유스 케이스에서 Emacs 설치와 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 "$@"합니다.
Uwe Koloska

예, 팁에 감사드립니다. 방금 수정되었습니다.
Marcs

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.