Jak uzyskać to samo środowisko Emacsa na innym komputerze?


16

Jestem początkującym w Emacsie (używam go od około 2 tygodni i kocham). Gdy aktualizuję i rozszerzam mój ~/.emacs.d/init.elplik, rzeczy, które tam piszę, zależą od niektórych pakietów, które zainstalowałem z MELPA M-x package-install, od .elplików, które sam napisałem itp.

Moje pytanie brzmi: czy powinienem w przyszłości na przykład przełączać komputery, jaki jest najlepszy sposób, aby bezproblemowo uzyskać takie samo dokładne środowisko Emacs na nowym komputerze, jak teraz?


3
Tak długo, jak możesz się poruszać init.el(używając na przykład git), to podejście działa również (w oparciu o use-package): lunaryorn.com/posts/…
— VanLaser

Jednym z podejść jest umieszczenie katalogu .emacs.d w Dropbox. Użyłem go tylko na komputerach z tym samym systemem operacyjnym. Różne smaki * nix powinny być w porządku, ale możesz mieć problemy, jeśli spróbujesz współdzielić na różnych systemach operacyjnych.
— Qudit

To pytanie jest bardzo zbliżone do emacs.stackexchange.com/q/408/2710 . Czy możesz wyróżnić różnice?
— Andrew Swann,

Dla osób niebędących programistami, takich jak ja, synchronizacja konfiguracji i pakietów emacsa na trzech komputerach (dwa okna, jedno OSX) za pomocą Dysku Google była skuteczna i niezawodna. Działa to, ponieważ emacs i większość jego pakietów jest w dużej mierze niezależna od platformy. Wieloplatformowe odtwarzanie identycznego środowiska emacs wymaga tylko kilku wierszy w pliku init.el, aby rozpoznać ścieżki specyficzne dla systemu operacyjnego do katalogu zsynchronizowanego pakietu emacs.
— Snelephant,

Twoja konfiguracja to cały ~/.emacs.dkatalog, więc użyj dowolnej metody synchronizacji między komputerami. (np. repozytorium Github, folder Dropbox lub cokolwiek, co działa najlepiej dla Ciebie).
— phils

Odpowiedzi:


9

Prawidłowym rozwiązaniem jest użycie straight.elmenedżera pakietów, który napisałem w celu rozwiązania tego problemu. Więcej informacji na ten temat można znaleźć w innej odpowiedzi na to pytanie .

Ta odpowiedź, napisana kilka miesięcy przed rozpoczęciem pracy straight.el, poprzednio opisywała zdecydowanie gorszy sposób osiągnięcia częściowego rozwiązania. Podejście to opisano krótko poniżej; Już go nie polecam.

Nawet jeśli nie chcesz używać straight.el, powinieneś przynajmniej adoptować use-package. (Nie chodzi o to, że te dwa wykluczają się wzajemnie - uważam, że najczystsza konfiguracja pochodzi z użycia obu).


Zacznij od zdefiniowania listy pakietów w pliku inicjującym:

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

Następnie zainstaluj je automatycznie:

(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))))

Jeśli init.elplik będzie pod kontrolą wersji, synchronizacja go z innym komputerem spowoduje automatyczne zainstalowanie pakietów. Oczywiście zainstalowane wersje będą zupełnie inne i nie można oczekiwać, że konfiguracja będzie działać od razu po wyjęciu z pudełka. Jest to podstawowa wada package.eli jeden z powodów, dla których takie podejście jest złe. Zobacz jeszcze raz straight.el. Zauważ też, że powyższy kod oddziela listę pakietów od konfiguracji dla tych pakietów, co utrudnia śledzenie rzeczy w pliku inicjującym. To kolejna poważna wada. Zobacz jeszcze raz use-package.


Dziękuję za napisanie! Jeśli zdecyduję się hostować wszystko na Github, w tym pakiety pobrane z MELPA, czy zachowa to zdolność MELPA do automatycznej aktualizacji pakietów na nowym komputerze?
— space_voyager

1
@ space_voyager Tak, wszystko nadal będzie się działo w ten sam sposób. Jednak: (1) po sklonowaniu na nowy komputer Emacs nie będzie musiał pobierać pakietów z MELPA, ponieważ znajdują się one już w repozytorium, które właśnie sklonowałeś; oraz (2) za każdym razem, gdy użyjesz package.eldo aktualizacji pakietów, będziesz mieć niestabilne zmiany w repozytorium i będziesz musiał dokonać zatwierdzenia, aby uwzględnić aktualizacje pakietów.
— Radon Rosborough,

Wielkie dzięki. Jeszcze jedno: Myślałem, że MELPA automatycznie aktualizuje pakiety. Czy tak nie jest?
— space_voyager

1
@ space_voyager: Oczywiście zdalne repozytorium pakietów zostanie zaktualizowane, ale zaktualizowane wersje pakietów nie zostaną automatycznie pobrane i zainstalowane na komputerze lokalnym. W tym celu musisz M-x list-packages RET U.
— Radon Rosborough,

1
@Lassi Krótka odpowiedź: użyj tego, co chcesz zainstalować Emacsa; używaj straight.eltylko do instalowania pakietów Emacsa. Nix jest świetnym pomysłem, ale o ile wiem, nie jest dobrze zoptymalizowany pod kątem tworzenia pakietów Emacsa (popraw mnie, jeśli się mylę) . Jeśli użyjesz menedżera pakietów systemowych do zainstalowania pakietów Emacsa, nie będziesz mógł po prostu edytować ich kodu źródłowego, a następnie zatwierdzić i pchnąć zmiany w górę. Ostatnim razem, gdy patrzyłem na konfigurację Nix dla pakietów Emacsa, wydawało się to zbyt skomplikowane i ogólnie gorsze od straight.eldoświadczenia programistycznego. Ale cokolwiek płynie twoją łodzią.
— Radon Rosborough,

11

Jeśli używasz pakietu use , możesz przenosić ten plik z komputera na komputer, a gdy Emacs się uruchomi, dopóki masz dostęp do Internetu, pobierze pakiety i je skonfiguruje.

Najpierw skonfiguruj bibliotekę pakietów:

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

A następnie bootstrap use-package:

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

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

Teraz zamiast konfigurować Emacsa i zakładać, że pakiety są instalowane, użyj use-packagezarówno do ich instalacji, jak i konfiguracji. Na przykład dla niektórych ustawień mojego steru:

(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))

Pamiętaj, że konfiguracja jest dostępna init.el, ale jest o wiele więcej. Na przykład nie spowoduje to przeniesienia plików dabbrev, niestandardowych fragmentów ani żadnej innej tony.
— Omair Majid

Tak. Jeśli masz inne pliki, które są częścią konfiguracji, będziesz musiał je również przenieść obok pliku init.
— zck

w tym momencie ponownie staje się grą „który plik jest faktycznie częścią mojej konfiguracji i jak mam go zsynchronizować na moich komputerach” :(
— Omair Majid,

należy dodać :ensure tdo use-packagedeklaracji lub ustawić use-package-always-ensurena t. W przeciwnym razie nie byłoby automatycznie instalowane w innym systemie po skopiowaniu konfiguracji.
— Chakravarthy Raghunandan

6

Zarządzanie pakietami nowej generacji za pomocą straight.el

Po długiej i frustrującej walce o użycie package.el+ Quelpa do zarządzania moimi pakietami, ugryzłem kulę i napisałem własnego menedżera pakietów . Jest on przeznaczony do całkowitego zastąpienia package.elzapewniając doświadczenie zarządzania pakietami, który jest lepszy w prawie każdym względem.

Możesz przeczytać bardzo obszerną dokumentację, aby dowiedzieć się o wszystkich jej funkcjach, ale najbardziej odpowiednia dla tego pytania jest straight.elkoncentracja na doskonałej odtwarzalności . Oznacza to, że nie powinno mieć znaczenia, czy uruchamiasz Emacsa normalnie, czy uruchamiasz go na nowej maszynie, a wszelkie lokalne zmiany są kontrolowane przez wersję i można je przywrócić do stanu kanonicznego. W praktyce osiąga się to poprzez (1) klonowanie pakietów jako repozytoria Git oraz zapewnienie automatycznych narzędzi do zarządzania ich stanem; (2) wykorzystanie pliku init jako jedynego źródła prawdy dla stanu zarządzania pakietami, bez żadnych zmiennych danych przechowywanych gdzie indziej; oraz (3) użycie opcjonalnych plików blokujących wersji w celu określenia dokładnych wersji Git każdego pakietu, a także repozytoriów receptur istraight.el samo.

Aby rozpocząć, włóż fragment kodu ładującego , który zostanie zainstalowany i aktywowany straight.el. Następnie, aby upewnić się, że pakiet jest zainstalowany, po prostu umieść wywołanie straight-use-packagew pliku init:

(straight-use-package 'projectile)

Tak, to takie proste. Żadnego zajmowania się package-refresh-contentsżadnym z tych śmieci. Jeśli usuniesz ten formularz ze swojego pliku inicjującego i zrestartujesz Emacsa, pocisk nie będzie już ładowany (w przeciwieństwie do in package.el). Oznacza to, że nie musisz się martwić, że Twoja konfiguracja w jakiś sposób nie działa na nowym komputerze, ponieważ przypadkowo polegałeś na niezadeklarowanych pakietach.

Możesz instalować pakiety gdziekolwiek i kiedykolwiek chcesz, w całym pliku init (nie musisz deklarować ich listy w jednym punkcie). Oczywiście, że możesz po prostu zrobić

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

jeśli wolisz listę. Polecam jednak użyć use-packagedo zarządzania konfiguracją pakietu. Najpierw musisz go zainstalować:

(straight-use-package 'use-package)

Następnie, ponieważ straight.elma wbudowaną integrację z use-package, następujące „po prostu działa”:

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

Po napisaniu pliku init do zainstalowania potrzebnych pakietów, uruchom, M-x straight-freeze-versionsaby zapisać plik blokady wersji ~/.emacs.d/straight/versions/default.el. Powinieneś zachować ten plik pod kontrolą wersji, ponieważ pozwoli straight.elon sprawdzić poprawne wersje wszystkich twoich pakietów, kiedy po raz pierwszy uruchomisz Emacsa na nowej maszynie. (Można ręcznie przywrócić wersje określone w pliku blokującym za pomocą M-x straight-thaw-versions.)

Aby wesprzeć ideę lokalnych plików dotfile, o których wspomniałem w mojej innej odpowiedzi , straight.eloferuje system profili . Nadal zalecam używanie dowiązań symbolicznych do plików dot (w tym przypadku, init.ellokalnego pliku init, jeśli dotyczy, i pliku blokady wersji, jeśli chcesz go użyć).

Jeśli zastanawiasz się, jak straight.elwypada w porównaniu z innymi menedżerami pakietów, sprawdź obszerną sekcję porównań . Ale jest też o wiele więcej dokumentacji na wszystko inne .


4

Możesz użyć beczki do zarządzania swoimi paczkami. Użyj git / github do kontroli źródła i zsynchronizuj pliki dot emacsa.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.