Bagaimana cara mendapatkan lingkungan Emacs yang sama di komputer yang berbeda?

16

Saya seorang pemula di Emacs (menggunakannya selama sekitar 2 minggu sekarang dan menyukainya). Ketika saya memperbarui dan memperluas ~/.emacs.d/init.elfile saya , hal-hal yang saya tulis di sana tergantung pada paket tertentu yang saya instal dari MELPA gunakan M-x package-install, pada .elfile yang saya tulis sendiri, dll.

Pertanyaan saya adalah, haruskah saya di masa depan beralih komputer misalnya, apa cara terbaik untuk mendapatkan lingkungan Emacs yang sama persis pada komputer baru seperti yang saya miliki sekarang?

space_voyager
sumber
3
Selama Anda dapat bergerak init.el(menggunakan git misalnya), pendekatan ini juga berfungsi (berdasarkan use-package): lunaryorn.com/posts/…
VanLaser
Salah satu pendekatan adalah menempatkan direktori .emacs.d Anda di Dropbox. Saya hanya menggunakannya di komputer dengan OS yang sama. Rasa * nix yang berbeda harusnya baik-baik saja, tetapi Anda mungkin memiliki masalah jika mencoba berbagi di mesin yang menjalankan OS yang terlalu berbeda.
Qudit
Pertanyaan ini sangat dekat dengan emacs.stackexchange.com/q/408/2710 . Bisakah Anda menyoroti perbedaannya?
Andrew Swann
Untuk non-programmer seperti saya, sinkronisasi konfigurasi emacs dan paket di tiga mesin (dua jendela, satu OSX) menggunakan Google Drive telah efektif dan dapat diandalkan. Ini berfungsi karena emacs dan sebagian besar paketnya sebagian besar adalah platform agnostik. Reproduksi lintas platform dari pengalaman emacs identik hanya memerlukan beberapa baris dalam file init.el untuk menyelesaikan jalur spesifik OS ke direktori paket emacs yang disinkronkan.
Snelephant
Konfigurasi Anda adalah seluruh ~/.emacs.ddirektori Anda, jadi gunakan metode apa pun yang Anda inginkan untuk menyinkronkannya di antara mesin. (mis. repositori Github, atau folder Dropbox, atau apa pun yang paling cocok untuk Anda).
phils

Jawaban:

9

Solusi yang benar adalah dengan menggunakan straight.el, manajer paket yang saya tulis untuk mengatasi masalah ini. Anda dapat menemukan detail lebih lanjut tentang ini di jawaban lain untuk pertanyaan ini .

Jawaban ini, yang ditulis beberapa bulan sebelum saya mulai bekerja straight.el, sebelumnya menggambarkan cara yang sangat rendah untuk mencapai solusi parsial. Pendekatan ini dijelaskan secara singkat di bawah ini; Saya tidak lagi merekomendasikannya.

Bahkan jika Anda tidak ingin menggunakan straight.el, Anda setidaknya harus mengadopsi use-package. (Bukan karena keduanya saling eksklusif — saya percaya pengaturan terbersih berasal dari penggunaan keduanya.)


Mulailah dengan mendefinisikan daftar paket di file init Anda:

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

Kemudian instal secara otomatis:

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

Jika Anda menyimpan init.elfile Anda di bawah kontrol versi, maka menyinkronkannya ke komputer lain akan menghasilkan paket Anda diinstal secara otomatis. Tentu saja, versi yang diinstal akan sangat berbeda, dan konfigurasi Anda tidak dapat berfungsi di luar kotak sebagai hasilnya. Ini adalah kelemahan mendasar package.el, dan merupakan salah satu alasan mengapa pendekatan ini buruk. Lihat lagi straight.el. Perhatikan juga bahwa kode yang diuraikan di atas memisahkan daftar paket Anda dari konfigurasi Anda untuk paket-paket itu, membuatnya lebih sulit untuk melacak hal-hal dalam file init Anda. Ini adalah kerugian besar lainnya. Lihat lagi use-package.

Radon Rosborough
sumber
Terima kasih untuk artikelnya! Jika saya memilih untuk meng-host semua yang ada di Github, termasuk paket yang saya unduh dari MELPA, apakah ini akan mempertahankan kemampuan MELPA untuk memperbarui paket secara otomatis di komputer baru?
space_voyager
1
@space_voyager Ya, semuanya masih akan terjadi dengan cara yang sama. Namun: (1) ketika Anda mengkloning ke komputer baru, Emacs tidak perlu mengunduh paket dari MELPA, karena mereka sudah ada di repositori yang baru saja Anda kloning; dan (2) setiap kali Anda menggunakan package.eluntuk memperbarui paket, Anda akan memiliki perubahan yang tidak dipentaskan dalam repositori Anda, dan Anda harus membuat komitmen untuk menyertakan pembaruan paket.
Radon Rosborough
Terima kasih banyak. Satu hal lagi: Saya pikir MELPA melakukan pembaruan paket secara otomatis. Bukankah ini masalahnya?
space_voyager
1
@space_voyager: Ya, tentu saja repositori paket jarak jauh akan diperbarui, tetapi versi paket yang diperbarui tidak diunduh dan diinstal pada mesin lokal Anda secara otomatis. Untuk itu kamu perlu M-x list-packages RET U.
Radon Rosborough
1
@Lassi Jawaban singkat: gunakan apa pun yang Anda ingin menginstal Emacs; gunakan straight.elhanya untuk menginstal paket Emacs. Nix adalah ide bagus, tapi itu tidak dioptimalkan dengan baik untuk pengembangan paket Emacs, sejauh yang saya tahu (tolong perbaiki saya jika saya salah) . Jika Anda menggunakan manajer paket sistem untuk menginstal paket Emacs, Anda tidak akan dapat hanya mengedit kode sumbernya dan kemudian komit dan dorong perubahan Anda ke atas. Terakhir kali saya melihat konfigurasi Nix untuk paket Emacs, sepertinya terlalu rumit dan umumnya lebih rendah dari straight.elpengalaman pengembangan. Tapi, apa pun yang mengapungkan perahumu.
Radon Rosborough
11

Jika Anda menggunakan paket-pakai , Anda dapat memindahkan file itu dari komputer ke komputer, dan ketika Emacs dijalankan, selama Anda memiliki akses internet, itu akan menarik paket-paket dan mengkonfigurasinya.

Pertama, atur perpustakaan paket:

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

Dan kemudian bootstrap use-package:

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

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

Sekarang, alih-alih mengkonfigurasi Emacs dan dengan asumsi paket diinstal, gunakan use-packageuntuk menginstal dan mengkonfigurasinya. Misalnya, untuk beberapa pengaturan helm saya:

(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))
kawan
sumber
Pikiran Anda, yang mendapat konfigurasi (dalam init.el), tetapi ada banyak lagi untuk itu. Misalnya, ini tidak akan mem-port file dabbrev, atau cuplikan khusus Anda atau hal lainnya.
Omair Majid
Iya. Jika Anda memiliki file lain yang merupakan bagian dari konfigurasi Anda, Anda harus memindahkannya juga, di samping file init Anda.
zck
pada saat itu, itu kembali menjadi permainan "file mana yang sebenarnya merupakan bagian dari konfigurasi saya dan bagaimana cara menyimpannya di sinkronisasi di mesin saya" :(
Omair Majid
Anda harus menambahkan :ensure tke use-packagedeklarasi atau set use-package-always-ensureke t. Kalau tidak, ia tidak akan menginstal secara otomatis pada sistem lain ketika menyalin konfigurasi.
Chakravarthy Raghunandan
6

Manajemen paket generasi selanjutnya dengan straight.el

Setelah perjuangan panjang dan frustasi untuk menggunakan package.el+ Quelpa untuk mengelola paket saya, saya menggigit peluru dan menulis manajer paket saya sendiri . Ini dimaksudkan untuk sepenuhnya menggantikan package.eldengan memberikan pengalaman manajemen paket yang unggul dalam hampir setiap cara.

Anda dapat membaca dokumentasi yang sangat luas untuk mempelajari semua fitur-fiturnya, tetapi yang paling relevan untuk pertanyaan ini adalah yang straight.elberfokus pada reproduksibilitas sempurna . Ini berarti tidak masalah apakah Anda memulai Emacs secara normal, atau memulainya dengan mesin baru, dan bahwa setiap perubahan lokal dikendalikan oleh versi dan dapat dikembalikan ke status kanonik. Secara praktis, ini dicapai dengan (1) mengkloning paket sebagai repositori Git, dan menyediakan alat otomatis untuk mengelola negara mereka; (2) menggunakan init-file sebagai satu - satunya sumber kebenaran untuk status manajemen paket, tanpa data yang dapat diubah disimpan di tempat lain; dan (3) menggunakan versi penguncian versi opsional untuk menentukan revisi Git yang tepat dari setiap paket, ditambah repositori resep danstraight.el diri.

Untuk memulai, masukkan potongan bootstrap , yang akan menginstal dan mengaktifkan straight.el. Kemudian, untuk memastikan bahwa suatu paket diinstal, cukup lakukan panggilan ke straight-use-packagedalam file init Anda:

(straight-use-package 'projectile)

Ya, sesederhana itu. Tidak berurusan dengan package-refresh-contentsatau semua sampah itu. Jika Anda menghapus formulir ini dari file init Anda dan memulai kembali Emacs, Proyektil tidak akan lagi dimuat (tidak seperti di package.el). Ini berarti Anda tidak perlu khawatir tentang konfigurasi Anda yang entah bagaimana tidak bekerja pada mesin baru karena Anda secara tidak sengaja bergantung pada paket yang tidak dideklarasikan.

Anda dapat menginstal paket di mana pun dan kapan pun Anda mau, di seluruh file init Anda (tidak perlu mendeklarasikan daftar mereka pada satu titik). Tentu saja Anda juga bisa melakukannya

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

jika Anda lebih suka daftar. Namun saya sarankan Anda gunakan use-packageuntuk mengelola konfigurasi paket Anda. Pertama Anda harus menginstalnya:

(straight-use-package 'use-package)

Kemudian, karena straight.eltelah terintegrasi dengan use-package, "just works" berikut:

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

Setelah Anda menulis file init Anda untuk menginstal paket yang dibutuhkan, jalankan M-x straight-freeze-versionsuntuk menyimpan versi lockfile ~/.emacs.d/straight/versions/default.el. Anda harus menyimpan file ini di bawah kontrol versi, karena itu akan memungkinkan straight.eluntuk memeriksa versi yang benar dari semua paket Anda, ketika Anda pertama kali meluncurkan Emacs pada mesin baru. (Anda dapat secara manual kembali ke versi yang ditentukan dalam penguncian menggunakan M-x straight-thaw-versions.)

Untuk mendukung gagasan dotfiles mesin-lokal yang saya sebutkan di jawaban saya yang lain , straight.elmenawarkan sistem profil . Saya masih merekomendasikan penggunaan symlink untuk dotfiles Anda (dalam hal ini,, init.elinit-file lokal Anda jika berlaku, dan versi lockfile jika Anda ingin menggunakannya).

Jika Anda bertanya-tanya bagaimana straight.elmembandingkan dengan manajer paket lain, lihat bagian perbandingan yang luas . Tetapi ada lebih banyak dokumentasi tentang hal-hal lain juga.

Radon Rosborough
sumber
4

Anda dapat menggunakan tong untuk mengelola paket Anda. Gunakan git / github untuk kontrol sumber dan sinkronisasi emfs dotfile Anda.

goromlagche
sumber