Làm thế nào để có được môi trường Emacs giống nhau trên một máy tính khác?


16

Tôi là người mới bắt đầu sử dụng Emacs (sử dụng khoảng 2 tuần nay và yêu thích nó). Khi tôi cập nhật và mở rộng ~/.emacs.d/init.eltệp của mình , những thứ tôi viết trong đó phụ thuộc vào các gói nhất định mà tôi đã cài đặt từ MELPA sử dụng M-x package-install, trên .elcác tệp mà tôi đã tự viết, v.v.

Câu hỏi của tôi là, liệu tôi có nên chuyển đổi máy tính trong tương lai không, cách tốt nhất để có được môi trường Emacs chính xác tương tự trên máy tính mới như bây giờ là gì?


3
Miễn là bạn có thể di chuyển init.elxung quanh (ví dụ như sử dụng git), phương pháp này cũng hoạt động (dựa trên use-package): lunaryorn.com/posts/iêu
VanLaser

Một cách tiếp cận là đặt thư mục .emacs.d của bạn trong Dropbox. Tôi chỉ sử dụng nó trên các máy tính có cùng hệ điều hành. Các hương vị khác nhau của * nix sẽ ổn, nhưng bạn có thể gặp vấn đề nếu bạn cố gắng chia sẻ trên các máy chạy HĐH quá khác nhau.
Qudit

Câu hỏi này rất gần với emacs.stackexchange.com/q/408/2710 . Bạn có thể làm nổi bật sự khác biệt?
Andrew Swann

Đối với những người không lập trình như tôi, việc đồng bộ hóa cấu hình và gói emacs trên ba máy (hai cửa sổ, một OSX) bằng Google Drive là hiệu quả và đáng tin cậy. Điều này hoạt động vì emacs và hầu hết các gói của nó phần lớn là bất khả tri. Tái tạo nền tảng chéo của trải nghiệm emacs giống hệt nhau chỉ cần một vài dòng trong tệp init.el để giải quyết các đường dẫn cụ thể của hệ điều hành đến thư mục gói emacs được đồng bộ hóa.
Snelephant

Cấu hình của bạn là toàn bộ ~/.emacs.dthư mục của bạn , vì vậy hãy sử dụng bất kỳ phương pháp nào bạn muốn để đồng bộ hóa giữa các máy. (ví dụ: kho lưu trữ Github hoặc thư mục Dropbox hoặc bất cứ thứ gì phù hợp nhất với bạn).
phils

Câu trả lời:


9

Giải pháp chính xác là sử dụng straight.el, một trình quản lý gói mà tôi đã viết để giải quyết vấn đề này. Bạn có thể tìm thêm chi tiết về điều này trong một câu trả lời khác cho câu hỏi này .

Câu trả lời này, được viết nhiều tháng trước khi tôi bắt đầu làm việc straight.el, trước đây đã mô tả một cách kém hoàn toàn để đạt được một giải pháp một phần. Cách tiếp cận này được mô tả ngắn gọn dưới đây; Tôi không còn giới thiệu nó.

Ngay cả khi bạn không muốn sử dụng straight.el, ít nhất bạn nên chấp nhận use-package. (Không phải cả hai đều loại trừ lẫn nhau. Tôi tin rằng thiết lập sạch nhất đến từ việc sử dụng cả hai.)


Bắt đầu bằng cách xác định danh sách các gói trong tệp init của bạn:

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

Sau đó cài đặt chúng tự động:

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

Nếu bạn giữ init.eltệp của mình dưới sự kiểm soát phiên bản, thì việc đồng bộ hóa nó với máy khác sẽ dẫn đến các gói của bạn được cài đặt tự động. Tất nhiên, các phiên bản được cài đặt sẽ hoàn toàn khác nhau và kết quả là cấu hình của bạn không thể hoạt động được. Đây là một lỗ hổng cơ bản của package.el, và là một trong những lý do tại sao phương pháp này là xấu. Xem lại straight.el. Cũng lưu ý rằng mã được nêu ở trên tách biệt danh sách gói của bạn khỏi cấu hình của bạn cho các gói đó, khiến việc theo dõi mọi thứ trong tệp init của bạn trở nên khó khăn hơn. Đây là một bất lợi lớn khác. Xem lại use-package.


Cảm ơn đã viết lên! Nếu tôi chọn lưu trữ mọi thứ trên Github, bao gồm các gói tôi đã tải xuống từ MELPA, điều này có giữ được khả năng tự động cập nhật các gói trên máy tính mới của MELPA không?
Space_voyager

1
@space_voyager Vâng, mọi thứ vẫn sẽ diễn ra theo cùng một cách. Tuy nhiên: (1) khi bạn sao chép vào một máy tính mới, Emacs sẽ không cần tải xuống các gói từ MELPA, vì chúng đã có trong kho lưu trữ mà bạn vừa nhân bản; và (2) bất cứ khi nào bạn sử dụng package.elđể cập nhật các gói, bạn sẽ có những thay đổi chưa được thực hiện trong kho lưu trữ của mình và bạn sẽ phải cam kết bao gồm các bản cập nhật gói.
Radon Rosborough

Cảm ơn rất nhiều. Một điều nữa: Tôi nghĩ MELPA tự động cập nhật gói. đây không phải là trường hợp?
Space_voyager

1
@space_voyager: Tất nhiên, kho lưu trữ gói từ xa sẽ được cập nhật, nhưng các phiên bản cập nhật của các gói không được tự động tải xuống và cài đặt trên máy cục bộ của bạn. Cho rằng bạn cần phải M-x list-packages RET U.
Radon Rosborough

1
@Lassi Câu trả lời ngắn: sử dụng bất cứ thứ gì bạn muốn để cài đặt Emacs; straight.elchỉ sử dụng để cài đặt các gói Emacs. Nix là một ý tưởng tuyệt vời, nhưng nó không được tối ưu hóa tốt cho phát triển gói Emacs, theo như tôi biết (xin vui lòng sửa cho tôi nếu tôi sai) . Nếu bạn sử dụng trình quản lý gói hệ thống để cài đặt các gói Emacs, bạn sẽ không thể chỉnh sửa mã nguồn của chúng, sau đó cam kết và đẩy các thay đổi của bạn lên trên. Lần trước tôi đã xem xét một cấu hình Nix cho các gói Emacs, nó có vẻ quá phức tạp và thường kém hơn straight.eltrải nghiệm phát triển. Nhưng, bất cứ điều gì nổi thuyền của bạn.
Radon Rosborough

11

Nếu bạn sử dụng gói sử dụng , bạn có thể di chuyển tệp đó từ máy tính này sang máy tính khác và khi Emacs khởi động, miễn là bạn có quyền truy cập internet, nó sẽ lấy các gói và định cấu hình chúng.

Đầu tiên, thiết lập thư viện gói:

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

Và sau đó bootstrap use-package:

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

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

Bây giờ, thay vì cấu hình Emacs và các gói giả định đã được cài đặt, hãy sử dụng use-packageđể cài đặt và định cấu hình chúng. Ví dụ: đối với một số cài đặt trợ giúp của tôi:

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

Nhắc bạn, điều đó có cấu hình (trong init.el), nhưng có nhiều hơn thế. Ví dụ: điều này sẽ không chuyển các tệp dabenamev hoặc đoạn mã tùy chỉnh của bạn hoặc bất kỳ tấn nào khác.
Omair Majid

Đúng. Nếu bạn có các tệp khác là một phần trong cấu hình của mình, bạn cũng sẽ phải di chuyển chúng cùng với tệp init của mình.
zck

tại thời điểm đó, nó lại trở thành một trò chơi "tập tin nào thực sự là một phần trong cấu hình của tôi và làm cách nào để giữ nó đồng bộ trên các máy của tôi" :(
Omair Majid

bạn nên thêm :ensure tvào use-packagekhai báo hoặc đặt use-package-always-ensurethành t. Nếu không, nó sẽ không tự động cài đặt trên hệ thống khác khi sao chép cấu hình qua.
Chakravarthy Raghunandan

6

Quản lý gói thế hệ tiếp theo với straight.el

Sau một thời gian dài và bực bội khi sử dụng package.el+ Quelpa để quản lý các gói của mình, tôi cắn viên đạn và viết trình quản lý gói của riêng mình . Nó được thiết kế để thay thế hoàn toàn package.elbằng cách cung cấp một kinh nghiệm quản lý gói đó là cấp trên trong hầu hết mọi phương diện.

Bạn có thể đọc tài liệu rất rộng để tìm hiểu về tất cả các tính năng của nó, nhưng tài liệu phù hợp nhất với câu hỏi này là straight.eltập trung vào khả năng tái tạo hoàn hảo . Điều này có nghĩa là không quan trọng bạn đang khởi động Emacs bình thường hay khởi động nó trên máy mới và mọi thay đổi cục bộ đều được kiểm soát phiên bản và có thể được hoàn nguyên về trạng thái chính tắc. Thực tế, điều này đạt được bằng cách (1) các gói nhân bản dưới dạng kho Git và cung cấp các công cụ tự động để quản lý trạng thái của chúng; (2) sử dụng tệp init làm nguồn sự thật duy nhất cho trạng thái quản lý gói, không có dữ liệu có thể thay đổi được lưu trữ ở nơi khác; và (3) sử dụng các tệp khóa phiên bản tùy chọn để chỉ định các bản sửa đổi Git chính xác của mỗi gói, cộng với mọi kho công thức vàstraight.el chinh no.

Để bắt đầu, hãy chèn đoạn trích bootstrap , đoạn này sẽ cài đặt và kích hoạt straight.el. Sau đó, để đảm bảo rằng gói được cài đặt, chỉ cần thực hiện cuộc gọi đến straight-use-packagetệp init của bạn:

(straight-use-package 'projectile)

Vâng, nó đơn giản. Không xử lý package-refresh-contentshoặc bất kỳ rác thải đó. Nếu bạn xóa biểu mẫu này khỏi tệp init và khởi động lại Emacs, Projectile sẽ không còn được tải (không giống như trong package.el). Điều này có nghĩa là bạn không phải lo lắng về cấu hình của mình bằng cách nào đó không hoạt động trên máy mới vì bạn vô tình phụ thuộc vào các gói không được khai báo.

Bạn có thể cài đặt các gói bất cứ nơi nào và bất cứ khi nào bạn muốn, trong toàn bộ tệp init của bạn (không cần phải khai báo danh sách của chúng tại một điểm). Tất nhiên bạn cũng có thể làm

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

nếu bạn thích danh sách Tuy nhiên tôi khuyên bạn nên sử dụng use-packageđể quản lý cấu hình gói của mình. Đầu tiên bạn phải cài đặt nó:

(straight-use-package 'use-package)

Sau đó, vì straight.elđã tích hợp sẵn với use-package, "chỉ hoạt động" sau đây:

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

Khi bạn đã viết tệp init của mình để cài đặt các gói cần thiết, hãy chạy M-x straight-freeze-versionsđể lưu tệp khóa phiên bản ~/.emacs.d/straight/versions/default.el. Bạn nên giữ tệp này dưới sự kiểm soát phiên bản, vì nó sẽ cho phép straight.elkiểm tra các phiên bản chính xác của tất cả các gói của bạn, khi bạn lần đầu tiên khởi chạy Emacs trên một máy mới. (Bạn có thể hoàn nguyên thủ công các phiên bản được chỉ định trong tệp khóa bằng cách sử dụng M-x straight-thaw-versions.)

Để hỗ trợ ý tưởng về các dotfiles cục bộ mà tôi đã đề cập trong câu trả lời khác của mình , hãy straight.elcung cấp một hệ thống hồ sơ . Tôi vẫn khuyên bạn nên sử dụng symlink cho dotfiles của bạn (trong trường hợp này init.ellà tệp init cục bộ của bạn nếu có và phiên bản lockfile nếu bạn muốn sử dụng một).

Nếu bạn đang tự hỏi làm thế nào straight.elso sánh với các trình quản lý gói khác, hãy xem phần so sánh mở rộng . Nhưng có rất nhiều tài liệu về mọi thứ khác , quá.


4

Bạn có thể sử dụng thùng để quản lý các gói của bạn. Sử dụng git / github để kiểm soát nguồn và đồng bộ hóa các dotfiles emacs của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.