사용자 정의 user-emacs-directory로 emacs를 시작하는 방법


58

나는 친구들과 미래의 구성의 기준으로 사용하기 위해 자식 저장소와 공유하기를 원하는 사용자 정의 및 작은 Emacs 구성을 작업 중입니다.

이를 위해 구성을 테스트 할 수있는 방법이 필요하며 가장 간단한 해결책은 다음과 같습니다.

$ emacs --eval "(setq user-emacs-directory \"~/Code/my_custom_emacs.d/\")"

그러나 나는 그것이 효과가있는 것처럼 보이지 않습니다.

도움을 주시면 감사하겠습니다.


3
부록 C Emacs 호출에 대한 명령 행 인수를 읽었 지만 .emacs.dHOME을 변경하지 않으면 Emacs를 사용자 정의 디렉토리 로 시작하는 간단한 명령 행 옵션을 찾지 못했습니다 . 사람들은 아래에 해결 방법을 제공했지만 나에게 이것은 Emacs 자체에 대한 매우 합리적인 기능 요청처럼 들립니다.
David J.

49.4 Emacs가 초기화 파일찾는 방법 을 가리키는 Emacs 초기화 파일 도 참조하십시오 .
David J.

5
@DavidJames 당신이 맞습니다 : 실제로 Emacs의 버그 추적기에는 이것에 관한 위시리스트 아이템 이 있습니다.
ffevotte

2
업데이트 :이 기능은 Emacs 개발자에게별로 관심이없는 것처럼 보입니다 . 버그 태그 에서 요청 이 태그 wontfix되고 닫혔습니다.
ffevotte

@Francesco : 사용자 Emacs 디렉토리를 "~"외부에 둘 수있는 동적 접근 방식을 시도합니다. 시도해 볼 수 있습니다.
안토니오

답변:


39

내가 사용하는 기본 접근 방식은 다음을 $HOME실행 하여 수정 하는 것입니다.

env HOME=/path/to/dir emacs

그런 다음 사용 /path/to/dir/.emacs.d

이 가짜 홈 디렉토리에서 중요한 파일이나 디렉토리를 실제 디렉토리로 다시 연결하여 Emacs가 볼 수 있도록 할 수도 있습니다.


2
이것은 완벽하게 작동합니다!
Mattias Bengtsson

8
에 따르면 EMAC 매뉴얼 - 이맥스 호출 부록 C 명령 줄 인수 - 환경 변수 - 일반 변수 , 홈페이지 세트 "디렉토리 트리에서 파일의 위치;. 파일 이름의 확장 물결표 (~)로 시작하는 사용을" HOME을 변경하면 나중에 실제 홈 폴더 에서 파일을 빠르게 탐색하거나 찾으려 할 때 문제를 일으키는 레시피처럼 들립니다 .
David J.

2
David James : 그렇습니다.이 접근 방식에는 약간의 성가심이 있습니다. 언급 한 바와 같이, 당신은 당신이 일을 복사하거나 심볼릭 링크 할 수 있습니다 필요가 홈페이지에서 볼 수 이맥스, 당신은 당신의 진짜 홈 디렉토리를 방문 할 경우, 당신은 절대 경로를 사용해야합니다 (또는 당신은뿐만 아니라 그에 심볼릭 링크를 추가 할 수 있습니다 ).
phils

3
초기화하는 동안 Emacs 내에서 원래 HOME을 복원하는 실험을 할 수도 있습니다. 나는 그것을 시도하지 않았지만 조사해 볼 가치가있는 것으로 보인다.
phils

1
@ 필 : 당신이 제안한 것을 시도했습니다 .
안토니오

39

여러 .emacs.d디렉토리를 병렬 로 유지 관리하는 데 사용하는 방법 은 다음과 같습니다.

  1. emacs는 다음과 같이 시작됩니다 :

    alias emacs='emacs -q --load "/path/to/init.el"'
    
  2. init.el파일은 다음과 같이 시작하여 user-init-fileuser-emacs-directory변수 를 올바르게 설정합니다 .

    (setq user-init-file (or load-file-name (buffer-file-name)))
    (setq user-emacs-directory (file-name-directory user-init-file))
    

나는 지난 몇 개월 동안 이것이 매우 안정적으로 작동한다는 것을 알았습니다. 몇 가지주의 사항이 있습니다.

  • 그것은 나누기 emacs-init-time에만 기본 시스템 구성을로드하는 데 필요한 시간을보고있는,하지만 자신의 init 파일. 초기화 시간 벤치마킹에 관심이 있다면 다른 방법으로 수행해야합니다 (예 : elisp 코드의 성능을 측정하는 방법은 무엇입니까? 참조 ).

  • 정상적인 시작과 같지 않으며 몇 가지 특정 사항을 처리해야합니다. 특히:

    • after-init-hookinit 파일이로드 되기 전에 실행 됩니다.
    • *scratch*버퍼를 생성 하기 전에 초기화 파일이로드됩니다. 를 사용하는 대신 모드를 명시 적으로 변경해야합니다 initial-major-mode.
    • 명시 적으로 전화해야합니다 package-initialize. 자동으로 수행되지 않습니다
  • 경로 init.el는 임의로 선택할 수 있습니다. 특히 init.el상주 하는 디렉토리의 이름을 지정할 필요는 없습니다 .emacs.d. 나는 다른 버전의 이맥스 사이를 전환하기 위해 예를 들어 .emacs.d.23.emacs.d.24에 가지고 있습니다.

  • 이 워크 플로우는 환경 (특히 HOMEenvvar)을 수정할 필요가 없으며 , emacs 내에서 프로그램을 실행하는 경우 바람직 할 수 있습니다 (수정 된 환경의 영향을받을 수 있음).


1
--loaded 파일을 init 파일로 간주하는 경우 이는 사실상 실행 순서를 변경 합니다. 우선, 일반 (기본) 패키지 초기화가 발생하지 않는 것처럼 보이고 (가짜) init 파일이 평가 되기 전에after-init-hook 실행 됩니다. 이것들은 확실히 해결할 수는 있지만 지정된 경로를 init 파일로 사용하는 것은 Emacs와 정확히 동일하지는 않습니다.
phils

2
@ phils 네, 맞습니다. 이것은 실제로 정상적인 실행 순서를 변경하며 일반 init 파일을 사용하는 것과 다릅니다. 귀하의 요점을 반영하도록 답변을 수정했습니다 after-init-hook. 그러나이 기술을 항상 사용 after-init-hook하지만 문제가 발생 하지는 않았지만 (명시 적으로 사용하지 않고 사용하는 패키지가 의존하지 않는 것이 운이 좋을 수도 있습니다) . "일반 (기본) 패키지 초기화가 수행되지 않음"은 무엇을 의미합니까?
ffevotte 2014

1
나는 그 상황에서 command-line전화하지 않을 것을 의미합니다 package-initialize. 가짜 init 파일에서 수동으로 호출해야합니다.
phils

1
@ Phils 감사합니다. 초기 주요 모드도 구체적으로 처리해야한다는 언급과 함께 이것을 대답에 추가했습니다.
ffevotte

이것은 완벽하게 작동했습니다. 감사합니다 !!!
Stryker

15

symlink 할 수 있습니다. ~/.emacs.d이것이 내가하는 일입니다.

  1. 내 emacs 구성 ~/.emacs.d지향 을 유지하십시오. 즉, 모든 emacs 관련 구성 파일이 해당 폴더에 있어야합니다.

  2. 그런 다음 ~/.emacs_configs모든 구성 폴더 (기본적으로 init.el구성 및 나머지 구성이있는 폴더)가있는 폴더가 있으므로 개인 구성 폴더는 ~/emacs_configs/iqbal이고 전주 배포는~/emacs_configs/prelude

  3. 내 개인 emacs 구성 초기에 user-emacs-directory다음을 사용하여 구성의 전체 경로로 설정했습니다.

    (setq user-emacs-directory (file-truename "~/.emacs.d/"))
    
  4. 그런 다음 마지막으로 ~/.emacs.d실제로 사용하려는 구성으로 심볼릭 링크 합니다. 내 구성을 사용하려면 내가 할 것 ln -s ~/emacs_configs/iqbal .emacs.d입니다. 일부 구성을 시도하려면 구성 폴더를 복사 ~/emacs_configs/whatever_name하여 symlink로 변경하십시오.

세 번째 단계의 장점은 .emacs.demacs가 실행되는 동안 symlink를 변경하더라도 내 개인 구성으로 시작한 emacs가 영향을받지 않고 실행될 수 있다는 것입니다.

또 다른 장점은 HOMEemacs와 상호 작용해야 할 외부 프로그램이 영향을받지 않기 때문에 변경되지 않기 때문입니다.


1
이것은 별도의 모든 emacs 설정을 조정하여 (setq user-emacs-directory (file-truename "~/.emacs.d/"))영향을받지 않고 동시에 실행할 수 있다는 것을 의미합니까 ?
user1011471

1
이론적으로는 그렇습니다. 그러나 실제로 ~/.emacs.d사용하지 않고 경로를 하드 코딩하는 라이브러리가있을 수 있습니다 user-emacs-directory. 나는 그런 도서관 중 적어도 하나를 발견했지만 불행히도 그 이름을 기억할 수 없습니다.
Iqbal Ansari 2016 년

7

변경되지 않거나 HOMEsymlink와 작동 하는 구성 은 내 대답 https://emacs.stackexchange.com/a/20508/934 에서 찾을 수 있습니다 . 이 구성을 user-emacs-directory사용하면 환경 변수를 설정하여를 변경할 수 있습니다 .

EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs

그리고 이것은 데몬에서도 작동합니다.


5

EmacsWiki 에서이 깔끔한 솔루션을 찾았습니다 .

emacs -q -l ~/my-init-file.el

(정확하게 사용자 정의 디렉토리를 사용하지는 않지만 어쨌든 단일 항목 파일이 있기 때문에 잘 작동합니다)


참고로, 이는 2 년 전 @Francesco의 의견과 중복됩니다.
브라이스


3

init 파일을로드 하기 전에 var 설정하십시오 .

emacs -q --eval '(setq alt-conf t)' --load ~/.emacs

그런 다음 init 파일에서 (이 경우 ~/.emacs) :

(defvar alt-conf nil)

(if alt-conf
    (let ((default-directory "~/src/elisp-test/"))
      (normal-top-level-add-subdirs-to-load-path)
      (various-alt-config-stuff)
      (message "Alternate conf"))
  (message "Regular conf"))

모든 것이 Emacs의 도메인에 남아 있기 때문에 내가 가장 좋아하는 시스템은 매우 우아합니다. 감사합니다.
gsl

1

@phils의 답변을 확장하여 testrun.sh새로운 emacs 구성을 테스트하기 위해이 작은 쉘 스크립트 ( )를 만들었습니다 . 다른 경우에도 마찬가지입니다 (예 : emacs를 손상시킬 수있는 init.el의 변경 사항을 테스트 할 때).

#!/bin/bash

cd $(dirname "${BASH_SOURCE[0]}")
[ -d .testrun ] || mkdir .testrun
cd .testrun
[ -h .emacs.d ] || ln -s .. .emacs.d

env HOME=`pwd` emacs

rm .emacs.d
cd ..
rm -rf .testrun

1

다음은 HOME환경 변수를 변경 한 다음 Emacs 내에서 복원하는 방법 에 대한 @Phil의 답변과 의견을 기반으로 한 작은 스크립트 입니다.

#!/bin/bash

# Use it like this:
#   /path/to/this/script  EMACS_USER_DIRECTORY  [OTHER EMACS ARGS]

# You can never be too careful
set -e

# First arg = emacs user directory
#   (get a canonical, absolute path)
EMACS_USER_DIRECTORY=$(readlink -f "$1")
shift
if [ ! -d "${EMACS_USER_DIRECTORY}" ]; then
    echo "Non-existent directory: '${EMACS_USER_DIRECTORY}'"
    exit 1
fi

# Bootstrap directory
BOOTSTRAP=$(mktemp --directory --tmpdir .emacs-bootstrap.XXXXXX)
mkdir "${BOOTSTRAP}/.emacs.d"

# Bootstrap init file
cat >"${BOOTSTRAP}/.emacs.d/init.el" <<EOF
  ;; # Correctly set-up emacs-user-directory
  (setq user-emacs-directory "${EMACS_USER_DIRECTORY}/")
  (setq user-init-file (concat user-emacs-directory "init.el"))

  ;; # Reset the HOME environment variable
  (setenv "HOME" "${HOME}")

  ;; # Load the real init file and clean-up afterwards
  (unwind-protect (load user-init-file)
    (delete-directory "${BOOTSTRAP}" :recursive))
EOF

# Forward remaining arguments to emacs
exec env HOME="${BOOTSTRAP}" emacs "$@"

1

유스 케이스가 Linux 시스템의 모든 사용자간에 단일 emacs 구성 ".emacs.d"디렉토리를 공유하는 경우이 솔루션 https://emacs.stackexchange.com/a/4258/5488 이 대부분의 경우 작동하지만 일부 경우에는 cases emacs는 임시 파일을 user-emacs-directory (예 : .ido.last 파일)에 쓰려고합니다. 이러한 경우 공유 구성 디렉토리에 모든 사용자에게 쓰기 권한이 있으면 작동하지만 각 시스템 사용자가 동일한 디렉토리를 공유하여 임시 파일을 저장하지 않기 때문에 원하는 솔루션이 아닐 수 있습니다. 이러한 경우 다음 솔루션이 더 좋습니다.

공통 공유 구성 파일 .emacs.d / init.el은

;; should come before calling package-initialize as it will populate
;; everything under common config "~/.emacs.d/elpa"
(setq user-init-file (or load-file-name (buffer-file-name)))
(setq package-user-dir (concat (file-name-directory user-init-file) "elpa"))

(package-initialize)

공유 구성 .emacs.d가 모든 사용자에게 읽기 권한을 갖도록하십시오 (쓰기 권한이 필요하지 않음)

another_user $ emacs -q --load /path/to/shared/config/.emacs.d/init.el

모든 사용자는 자신의 "~ / .emacs.d /"디렉토리를 가지지 만 임시 파일을 저장하는 데만 사용되지만 패키지 및 기타 구성은 공유 구성 디렉토리에서로드됩니다.

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