다른 컴퓨터에서 동일한 Emacs 환경을 얻는 방법?


16

저는 Emacs의 초보자입니다 (지금 2 주 동안 사용하고 사랑합니다). ~/.emacs.d/init.el파일을 업데이트하고 확장 할 때 여기에 쓰는 내용은을 사용하여 MELPA에서 설치 한 특정 패키지 M-x package-install, .el내가 작성한 파일 등에 따라 다릅니다 .

내 질문은, 예를 들어, 미래에 컴퓨터를 전환해야하는지, 지금과 마찬가지로 새 컴퓨터에서 동일한 Emacs 환경을 완벽하게 얻는 가장 좋은 방법은 무엇입니까?


3
당신이 당신의 이동할 수만큼 init.el주위에 (예를 들어 자식을 사용),이 방법은 또한 (에 따라 작동합니다 use-package:) lunaryorn.com/posts/...
VanLaser

한 가지 방법은 .emacs.d 디렉토리를 Dropbox에 넣는 것입니다. 나는 동일한 OS를 가진 컴퓨터에서만 사용했습니다. 다양한 종류의 * nix는 괜찮을 것이지만 너무 다른 OS를 실행하는 컴퓨터에서 공유하려고하면 문제가 발생할 수 있습니다.
Qudit

이 질문은 emacs.stackexchange.com/q/408/2710에 매우 가깝습니다 . 차이점을 강조 할 수 있습니까?
앤드류 스완

나와 같은 프로그래머가 아닌 경우 Google 드라이브를 사용하여 세 개의 컴퓨터 (두 개의 창, 하나의 OSX)에서 emacs 구성과 패키지를 동기화하는 것이 효과적이고 신뢰할 수 있습니다. emacs와 대부분의 패키지는 대부분 플랫폼에 구애받지 않기 때문에 작동합니다. 동일한 emacs 환경을 교차 플랫폼으로 재생산하려면 init.el 파일에 몇 줄만 있으면 동기화 된 emacs 패키지 디렉토리에 대한 OS 특정 경로를 확인할 수 있습니다.
Snelephant

구성은 전체 ~/.emacs.d디렉토리이므로 시스템 간 동기화를 선호하는 방법을 사용하십시오. (예 : Github 리포지토리 또는 Dropbox 폴더 또는 가장 적합한 것).
phils

답변:


9

올바른 해결책은 straight.el이 문제를 해결하기 위해 작성한 패키지 관리자 인 을 사용 하는 것입니다. 이 질문에 대한 다른 답변에서 이에 대한 자세한 내용을 찾을 수 있습니다 .

에 대한 작업을 시작하기 몇 달 전에 작성된이 답변은 straight.el이전에 부분 솔루션을 얻는 열등한 방법을 설명했습니다. 이 방법은 아래에 간략하게 설명되어 있습니다. 더 이상 권장하지 않습니다.

사용하고 싶지 않더라도 straight.el적어도을 채택해야합니다 use-package. (두 가지가 상호 배타적이라는 것은 아닙니다. 가장 깨끗한 설정은 두 가지를 모두 사용하는 것입니다.)


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접근 방식이 나쁜 이유 중 하나입니다. 다시 참조하십시오 straight.el. 위에서 설명한 코드는 패키지 목록과 해당 패키지의 구성을 분리하여 init 파일의 내용을 추적하기가 더 어려워집니다. 이것은 또 다른 주요 단점입니다. 다시 참조하십시오 use-package.


쓰기 주셔서 감사합니다! MELPA에서 다운로드 한 패키지를 포함하여 Github의 모든 것을 호스팅하기로 선택한 경우 새 컴퓨터에서 패키지를 자동 업데이트하는 MELPA의 기능이 유지됩니까?
space_voyager

1
@space_voyager 예, 모든 것이 여전히 똑같은 방식으로 발생합니다. 그러나 : (1) 새로운 컴퓨터로 복제 할 때, Emacs는 방금 복제 한 저장소에 이미 있기 때문에 MELPA에서 패키지를 다운로드 할 필요 가 없습니다 . (2) package.el패키지를 업데이트 할 때마다 리포지토리에 단계적 변경이 없으며 패키지 업데이트를 포함하기 위해 커밋해야합니다.
Radon Rosborough

감사합니다 한 가지 더 : MELPA는 업데이트를 자동으로 패키지한다고 생각합니다. 그렇지 않습니까?
space_voyager

1
@space_voyager : 물론 원격 패키지 저장소는 업데이트되지만 업데이트 된 버전의 패키지는 로컬 컴퓨터에 자동으로 다운로드되어 설치되지 않습니다. 이를 위해 당신은 필요합니다 M-x list-packages RET U.
Radon Rosborough

1
@Lassi 짧은 답변 : Emacs를 설치하려는 모든 것을 사용하십시오. straight.elEmacs 패키지 설치에만 사용 하십시오. Nix는 훌륭한 아이디어이지만, 내가 아는 한 Emacs 패키지 개발에 최적화되어 있지 않습니다 (잘못되면 수정하십시오) . 시스템 패키지 관리자를 사용하여 Emacs 패키지를 설치하면 소스 코드를 편집 한 다음 변경 사항을 커밋하고 푸시 할 수 없습니다. 마지막으로 Emacs 패키지의 Nix 구성을 살펴보면 지나치게 복잡하고 일반적으로 straight.el개발 경험 보다 열등했습니다 . 그러나 보트에 떠 다니는 것은 무엇이든.
Radon Rosborough

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 Majid

예. 구성의 일부인 다른 파일이 있으면 init 파일과 함께 이동해야합니다.
zck

이 시점에서 다시 한 번 "어떤 파일이 실제로 구성의 일부이며 내 컴퓨터에서 동기화 상태를 유지하는 방법"의 게임이됩니다. :(
Omair Majid

당신은 추가해야 :ensure t받는 use-package선언이나 세트 use-package-always-ensuret. 그렇지 않으면 구성을 복사 할 때 다른 시스템에 자동으로 설치되지 않습니다.
Chakravarthy Raghunandan

6

다음을 통한 차세대 패키지 관리 straight.el

package.el패키지를 관리 하기 위해 + Quelpa 를 사용하는 데 오랜 시간이 걸렸지 만, 나는 총알을 깨고 내 자신의 패키지 관리자를 작성했습니다 . 거의 모든면 package.el에서 우수한 패키지 관리 환경을 제공 하여 완전히 교체하기위한 것입니다.

매우 광범위한 문서 를 읽고 모든 기능에 대해 배울 수 있지만이 질문과 관련이있는 것은 완벽한 재현성에straight.el 중점 을 두는 것입니다 . 즉, Emacs를 정상적으로 시작하든 새 컴퓨터에서 시작하든 상관없이 로컬 변경 사항은 버전으로 제어되며 정식 상태로 되돌릴 수 있습니다. 실제로 이것은 (1) 패키지를 Git 리포지토리로 복제하고 상태를 관리하기위한 자동화 된 도구를 제공합니다. (2) init-file을 다른 곳에 저장된 변경 가능한 데이터없이 패키지 관리 상태 의 유일한 진실 소스로 사용 ; (3) 옵션 버전 잠금 파일을 사용하여 모든 패키지의 정확한 Git 개정판과 레시피 저장소 및straight.el 그 자체.

시작하려면 부트 스트랩 스 니펫을 삽입 하면 설치 및 활성화됩니다 straight.el. 그런 다음 패키지가 설치되었는지 확인하려면 straight-use-packageinit 파일에 전화 하십시오.

(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 파일을 작성한 후에 M-x straight-freeze-versions는 버전 잠금 파일을에 저장하십시오 ~/.emacs.d/straight/versions/default.el. 이 파일 straight.el은 새 컴퓨터에서 Emacs를 처음 시작할 때 모든 패키지의 올바른 버전을 체크 아웃 할 수 있도록 버전 제어 상태로 유지해야 합니다. (를 사용하여 잠금 파일에 지정된 버전으로 수동으로 되돌릴 수 있습니다 M-x straight-thaw-versions.)

내가에서 언급 한 기계 지역 dotfiles의 아이디어를 지원하기 위해 내 다른 대답을 , straight.el제공 프로파일 시스템 . 그래도 도트 init.el파일에 심볼릭 링크를 사용하는 것이 좋습니다 (이 경우 로컬 init 파일 (해당되는 경우), 버전 잠금 파일을 사용하려는 경우).

straight.el다른 패키지 관리자와 비교 하는 방법이 궁금하다면 광범위한 비교 섹션을 확인 하십시오 . 그러나 다른 모든 것에 대한 더 많은 문서가 있습니다.


4

cask 를 사용하여 패키지를 관리 할 수 있습니다 . git / github를 사용하여 emacs 도트 파일을 소스 제어하고 동기화하십시오.

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