Apa yang harus / tidak saya lakukan ketika menjaga kontrol .emacs dan .emacs.d?

66

Seperti banyak orang, saya mengelola banyak dotfile saya melalui repositori kontrol versi (Mercurial on Bitbucket, pribadi, dalam kasus saya). Ini berguna saat menyiapkan mesin baru atau menyebarkan konfigurasi di antara mesin yang berbeda.

Jadi secara alami saya menambahkan saya .emacsdan .emacs.dke pengaturan ini.

Kemudian saya menginstal beberapa paket, dan akhirnya menambahkan *.elcke saya .hgignore, sama seperti saya menghilangkan *.pycfile dari repositori Python saya.

Apakah ada hal lain yang tidak boleh saya lacak, misalnya file yang dibuat yang khusus untuk lingkungan dan tidak akan berguna / benar ketika dikloning ke platform lain? (Saya menggunakan Linux dan OS X di desktop, dan FreeBSD di server.)

Apakah ada trik pengaturan yang biasa digunakan untuk membuat berbagi jenis ini lebih berharga? Dengan setup file shell saya, saya masih mencari cara yang baik untuk memilih file individu di cabang misalnya.

Paul Bissex
sumber
Hanya FYI, Terlepas dari apa yang dikatakan di bawah ini, jika Anda menggunakan versi emacs yang sama di semua komputer Anda, menyinkronkan direktori Elpa baik-baik saja.
Malabarba
Jangan dikecualikan *.elc. stackoverflow.com/a/24539894/324105
phils

Jawaban:

37

Saya menyimpan konfigurasi Emacs saya di Github karena saya menggunakan dua komputer yang berbeda, satu di tempat kerja, satu di rumah.

Berikut adalah daftar tentang hal-hal yang tidak saya masukkan ke dalam kendali sumber:

Pengaturan yang ditentukan lingkungan.

Sebagai contoh, Emacs saya membuka file org yang berbeda saat start-up di mesin yang berbeda. Anda tidak ingin mengkomit pengaturan ini ke dalam kontrol sumber.

Saya gunakan (require 'local nil t)untuk memuat pengaturan ini, tetapi tidak pernah melakukan local.el.

Paket yang dikelola oleh manajer paket

Ketika paket dikelola oleh manajer paket, saya sarankan untuk tidak menempatkan paket-paket itu ke dalam kontrol sumber. Karena:

  1. Anda harus berkomitmen setelah setiap pembaruan.
  2. Anda dapat kehilangan file penting yang menyimpan di tempat lain, yang membuat Anda tidak dapat melakukan sinkronisasi di komputer yang berbeda dengan benar.

Alih-alih melakukan paket, saya sarankan Anda melakukan mekanisme yang diakui oleh manajer paket Anda.

Sebagai contoh, saya menggunakan Tong untuk mengelola paket ke-3 saya, jadi saya hanya mengkomit file tong, yang berisi paket-paket tertentu yang saya inginkan.

Ketika saya gunakan package.elsebelumnya, konfigurasi saya akan memeriksa apakah paket diinstal / perlu diperbarui, jadi tidak ada paket yang dilakukan.

Namun , ada beberapa paket yang tidak ada di repositori paket mana pun, dalam hal ini, saya akan mengkomitnya ke kontrol sumber, seperti di site-lisp.

Semua file yang dihasilkan oleh paket

Sebagai contoh, semua autosave, file-file backup, tramp, eshell, recentf, bahkan custom.el. Saya memasukkan file-file ini ke dalam ~/.emacs/.gen, jadi saya bisa mengabaikan direktori ini.

File yang sering berubah tetapi harus disinkronkan

Seperti file kamus pribadi yang digunakan oleh aspell, basis data file yang digunakan oleh elfeed, Dalam hal ini, saya menggunakan Dropbox untuk menyinkronkannya di komputer yang berbeda. Jadi saya tidak akan lupa untuk berkomitmen.

Rangi Lin
sumber
2
Intinya tentang Tong tidak apa-apa asalkan Anda hanya bekerja dengan mesin yang mendukung Tong, terutama Windows.
T. Verron
Beberapa orang boleh saja melakukan paket setelah setiap pembaruan, jika tidak saya sarankan jangan menyimpan seluruh paket. Biarkan manajer paket melakukan pekerjaan.
Rangi Lin
@ T. Verron Saya bisa membuat Cask bekerja pada Cygwin, tetapi itu memberi saya beberapa masalah. BTW, saya sekarang menggunakan Emacs Prelude , dan saya menemukan bahwa prelude-require-packagesfungsinya berfungsi sebagai Tong orang miskin (dengan keuntungan juga bekerja dengan Windows).
rsenna
Apakah cygwin tong bekerja dengan emacs w32? Ketika datang ke makro meniru perilaku ini, built-in yang package-installdisebutkan dalam emacs.stackexchange.com/a/410/184 mungkin membantu juga.
T. Verron
2
@JorgeArayaNavarro Sangat baik untuk melakukan itu jika mereka akan sama di berbagai mesin. :) tetapi tidak dalam kasus saya. Terlebih lagi, karena itu akan diedit secara otomatis, kadang-kadang saya lupa untuk melakukan, itu sebabnya saya tidak dimasukkan custom.elke dalam kontrol sumber.
Rangi Lin
8

Pastikan tidak ada hal-hal yang dihasilkan (seperti catatan @ rangi-lin) dalam repo dan, jika Anda berbagi dotfile Anda dengan orang lain, tidak ada hal-hal keamanan terkait (seperti kata sandi dan kunci API). Untuk nanti saya telah membagi kustomisasi menjadi file terpisah dengan:

(setq custom-file (concat dotfiles-dir "custom.el"))
(load custom-file 'noerror)

Kadang-kadang saya memindahkan kustomisasi "aman" ke setqpernyataan besar sebelum cuplikan di atas.

File .gitignore saya terlihat seperti:

/.org-id-locations
/ac-comphist.dat
/auto-save-list
/custom.el
/elpa/*
/image-dired/
/oauth2.plstore
/session.*
/tramp
/url/
/var/
*.elc
Remvee
sumber
8

tl; dr

  • gunakan .emacs.d/init.elsebagai ganti.emacs
  • buat daftar .gitignoreputih Anda
  • gunakan manajer paket

.emacs.d / init.el

Saya menggunakan .emacs.d/init.elbukannya .emacskarena pengaturan ini memungkinkan saya untuk meletakkan di .emacs.dbawah git. Setelah ~/.emacsmembuat Anda membuat tautan simbolis ke repositori git atau memiliki repositori git di direktori home Anda. Jika Anda menggunakan .emacs.d, semua sudah terpecahkan.

.gitignore

.Gitignore saya adalah daftar putih dan bukan daftar hitam standar.

*

!.gitignore
!init.el

Konfigurasi ini memungkinkan Anda untuk berkonsentrasi pada apa yang benar-benar Anda butuhkan daripada apa yang tidak Anda butuhkan. .emacs.dtidak seperti repositori kode sumber, yang berarti bahwa tidak hanya kode Anda berada tetapi juga semua file temporer yang dibuat secara otomatis atau lainnya ada di sana. Anda tidak benar-benar tahu apa yang akan masuk. Jadi, " abaikan semua secara default dan tambahkan file yang Anda pedulikan " adalah strategi yang lebih baik, IMO.

BTW, saya menyimpan sebagian besar konfigurasi di init.el, daripada menggunakan skema multi-file. Alasannya adalah bahwa file besar memungkinkan saya untuk a) menggunakan alat standar suka occuratau isearch-forwarduntuk pindah ke konfigurasi yang saya inginkan, b) penggunaan outshineyang membuat saya init.el org-cycle-able, c) tidak mengubah saya .gitignoresepanjang waktu.

Manajer Paket

Kecuali Anda memiliki kebutuhan khusus untuk menyinkronkan versi Emacs dan atau versi Paket di semua sistem Anda, jangan letakkan paket di bawah git. Package.elbaik-baik saja. use-packagejuga baik-baik saja. Tong itu bagus. Pilih manajer paket Anda dan lakukan hanya file konfigurasi Anda tetapi bukan paket itu sendiri.

yaitu. Salah satu kebutuhan khusus yang dapat saya pikirkan adalah memiliki dua sistem, pengembangan dan penyebaran dan mereka harus memiliki konfigurasi Emacs yang persis sama.

Yasushi Shoji
sumber
Menyimpan semua dalam satu init.elfile berfungsi selama file itu tidak terlalu besar. Emacs tidak pandai menangani file besar, dan setelah beberapa saat ia mulai merangkak saat mengedit besar init.el. Keuntungan lain dari memecah konfigurasi Anda ke beberapa file adalah bahwa mereka bermain lebih baik dengan git, yang dalam situasi tertentu dapat menganggap perubahan pada satu file sebagai konflik penggabungan, tetapi tidak demikian jika perubahan tersebut dalam file yang terpisah. Akhirnya, jauh lebih mudah untuk berkomentar hanya dengan satu kebutuhan daripada potongan besar file init Anda.
izkon
6

Saya memiliki hal-hal berikut di .hgignore saya

  • file server emacs
  • File recentf: Jalur file pada satu mesin tidak masuk akal pada yang lain
  • direktori elpa / melpa: Gunakan file init untuk secara otomatis menginstal paket yang diperlukan dan menghemat waktu tarikan / push.

Jika Anda ingin membagikan init Anda dengan orang lain, Anda dapat mempertimbangkan untuk menghapus file histori seperti yang dibuat oleh mode savehist. Selain itu saya tidak berpikir ada trik khusus untuk ini. Panduan apa pun yang Anda ikuti untuk proyek kode versi juga berfungsi dengan baik di sini.

Vamsi
sumber
3

Seiring waktu paket menambahkan banyak hal ke ~/.emacsdan saya akhirnya menambahkan mereka satu per satu ke saya .gitignore. Saya juga punya private.elyang berisi kata sandi, kode khusus mesin dll yang tidak saya lacak.

Inilah yang saya miliki sekarang.

# Gitignore file

# Remove backup files
*#
*.
*.elc
*~
.#*

# Emacs packages
elpa/
var/

#  Emacs tmp files & Misc
/.mc-lists.el
/.DS_Store
/.emacs.desktop
/.emacs.desktop.lock
/.watsonresults
/ac-comphist.dat
/auto-save-list
/eshell/history
/eshell/lastdir
/newsticker/feeds/
/snippets/
/tramp
/url/cookies
/.python-environments/
/ido.last
/places
/private.el
/games/
/bookmarks
/projectile-bookmarks.eld
/projectile.cache
Jaseem
sumber
1

Itu tergantung pada paket / fitur yang Anda gunakan, sehingga bisa rumit. Di samping file yang disebutkan oleh Vamsi, misalnya, jika Anda menggunakan dired-immage, itu membuat direktori di sana untuk cache cache. Anda mungkin ingin mengabaikan file .elc juga.

rlazo
sumber
1

Saya menerbitkan .emacs.d saya, tetapi menggunakan subrepo dengan perubahan pribadi (kata sandi dan semacamnya). Untuk memungkinkan orang lain untuk mengkloningnya, cabang default menunjuk ke subrepo placeholder, dan setiap mesin memiliki cabang bernama sendiri.

Saat menggabungkan antar mesin, saya pertama graft- tama mengubah baru ke defaultcabang dan kemudian menggabungkan defaultcabang ke cabang tempat kerja lainnya.

Sebagai contoh, Anda dapat menemukan .emacs.d saya di bitbucket , termasuk readme dengan panduan penggunaan singkat.

Anda mungkin ingin menambahkan driver gabungan mode-org ke pengaturan ini.

Arne Babenhauserheide
sumber
1

Setelah beberapa iterasi, saya telah menentukan bahwa, sementara kontrol versi sangat bagus untuk berbagi kode dan melacak perubahan, itu bukan solusi yang bagus untuk menyinkronkan konfigurasi yang berubah dengan cepat di seluruh komputer. Alasannya adalah bahwa ada banyak hal yang harus disinkronkan dan tidak boleh di kontrol versi. Beberapa contoh:

  1. .elcfile (mengkompilasi ulang mereka ketika ada perubahan konfigurasi adalah masalah besar, dan bug dari elcfile yang sudah usang sering menyusahkan untuk debug).
  2. Seluruh elpadirektori (dan sampai versi-pinning menjadi standar, secara otomatis membangunnya kembali tidak cukup andal).
  3. File yang dibuat secara otomatis seperti eshellriwayat dan gnusfile.
  4. Informasi pribadi seperti kata sandi dan kunci API.

(Perhatikan bahwa masalah lintas-platform tidak ada dalam daftar - seharusnya tidak apa-apa untuk memiliki satu konfigurasi yang bekerja di beberapa sistem operasi.) Daripada menggunakan git sebagai solusi sinkronisasi, saya menggunakannya semata-mata sebagai solusi pelacakan kode dan sinkronisasi menggunakan Dropbox. Dengan begitu, semua file menjengkelkan yang seharusnya tidak ada dalam kontrol versi diurus.

Saya lakukan , bagaimanapun, memiliki tujuan memiliki konfigurasi saya menjadi rebuildable dari sumber jika konfigurasi Dropbox saya menghilang karena alasan apapun, jadi saya melacak semua paket yang diinstal dan yang lainnya di sumber. Informasi pribadi saya disimpan dalam submission git juga. Tetapi untuk sinkronisasi sehari-hari, git bukanlah solusi yang bagus.

shosti
sumber