Atur konten ~ / .emacs.d / init.el dan ~ / emacs.d?

28
  1. Ketika kita menambahkan lebih banyak baris ke ~/.emacs.d/init.elberbagai tujuan (untuk mode-python, untuk emacs-eclim, untuk ...), file menjadi panjang dan kurang dapat dibaca. Apakah ada cara untuk membantu mengatur kontennya?
  2. Arus saya ~/.emacs.dterlihat seperti ini

    $ ls *
    init.el
    
    auto-save-list:
    
    elisp:
    python-mode.el-6.1.3
    
    elpa:
    archives        auctex-readme.txt         s-20140910.334
    auctex-11.87.7  emacs-eclim-20140809.207
    
    eshell:
    history
    

    python-mode.el-6.1.3telah diinstal secara manual, saat emacs-eclim-20140809.207diinstal oleh elpa, dan saya tidak 100% yakin bahwa hal-hal lain di bawah elpa/ini oleh elpa. Bagaimana saya bisa mengatur konten ~/.emacs.d/?

Tim
sumber

Jawaban:

32

Orang yang menggunakan editor yang lebih sedikit suka membagi kode mereka menjadi beberapa file. Jika Anda menggunakan Emacs, tidak ada alasan untuk melakukan itu: cukup gunakan satu file besar, yang Anda bagi menjadi beberapa bagian.

Setiap bagian harus dimulai dengan

^L
;;; title of the section

tempat Anda memasukkan ^Lkarakter dengan mengetik C-q C-l. Anda kemudian dapat menggunakan perintah seperti C-x ]( forward-page) atau C-x n p( narrow-to-page) untuk menavigasi file. Lihat Bagian 25.4 (Halaman) dari manual Emacs untuk lebih lanjut.

jch
sumber
16
Tidak ada alasan khusus untuk tidak membagi kode menjadi beberapa file. Tergantung pada apa yang Anda inginkan pengelompokan barang bersama artinya - bagaimana Anda ingin berperilaku. Dan itu bisa bergantung pada seberapa besar LARGE. Dan itu bisa bergantung pada apakah potongan-potongan kode Anda dibagikan kepada orang lain, sebagai perpustakaan, misalnya.
Drew
2
Membonceng komentar @ Drew, pengguna mungkin ingin memiliki konfigurasi yang berbeda untuk versi dan lingkungan emacs yang berbeda dan memuat elisp yang sesuai. Yang mengatakan, saya suka tip pagination.
Harvey
3
@ Harvey: Pagination dan menggunakan file terpisah adalah cara independen untuk mengatur teks. Anda dapat menggunakan keduanya, jelas. Saya menggunakan pagination di semua perpustakaan saya, untuk memisahkan bagian. Tapi saya juga punya pustaka (file) terpisah.
Drew
1
@ jch Jika Anda menggunakan gaya ini, Anda mungkin juga ingin mengaktifkan Outline Minor Mode atau fitur serupa, untuk memungkinkan pelipatan bagian dan fungsi. Melipat semua judul tingkat atas memberi Anda gambaran bagus tentang semua bagian dalam konfigurasi Emacs Anda.
lunaryorn
@ Lunaryorn, saya sudah mencoba, tetapi saya merasa hal itu mengganggu - saya menemukan perintah pergerakan halaman cukup sering, saya hanya sesekali perlu mempersempit. Mungkin saya .emacsdan .wltidak cukup lama.
jch
20

Cara klasik untuk melakukan ini adalah membelah Anda .emacsmenjadi file yang terpisah. Misalnya, Anda bisa memindahkan semua barang web ke ~/.emacs.d/web-config.eldan kemudian memuatnya di dalam init.el:

(load "~/.emacs.d/web-config.el")

Jika Anda ingin menjaga ~/.emacs.dsedikit lebih teratur, Anda juga bisa memindahkan file-file konfigurasi ini ke direktori mereka sendiri:

(load "~/.emacs.d/config/web.el")

Sekarang Anda bisa langsung beralih ke file yang sesuai saat membuat perubahan pada konfigurasi Anda.

Satu hal yang hilang dari ini adalah variabel yang ditetapkan melalui sistem kustomisasi. Ini semua masih akan berada di init.el. utama Anda Rupanya, ada sedikit utilitas yang disebut init split yang memungkinkan Anda membuat aturan tentang pengaturan kustom mana yang digunakan, tetapi saya tidak pernah menggunakannya sendiri. Atau, sistem "kustomisasi" dapat dikonfigurasi untuk menggunakan file terpisah untuk modifikasi pengaturan Anda. Atur custom-filevariabel untuk menentukan dari mana pengaturan "kustomisasi" harus dibaca dan ditulis .

Sejauh direktori itu sendiri berjalan, saya selalu senang dengan tata letak default. Perubahan utama yang saya buat adalah membuat direktori untuk semua paket kustom saya sendiri dan perpustakaan yang tidak dikelola oleh package.el. Ini memberikan satu rumah untuk pelat kustom saya yang tidak terkait dengan konfigurasi.

Tikhon Jelvis
sumber
Terima kasih. (1) apa direktori untuk paket dan perpustakaan yang dikelola oleh package.el? (2) Apakah isi direktori elpadikelola oleh elpa? Bisakah saya memindahkannya ke tempat lain?
Tim
2
Anda dapat menentukan file terpisah untuk variabel Kustomisasi dengan mengatur custom-filevariabel. Sumber
Kaushal Modi
@Tim: Direktori yang dikelola oleh package.el adalah elpa. Elpa bukan paket lisp, ini adalah repositori paket. Package.el masih akan menambahkan semua paket yang diinstal (baik itu dari elpa atau dari repositori lain --- misalnya dalam kasus Anda, saya tidak berpikir eclim dan s berasal dari elpa) di direktori elpa. Dan ya, Anda tidak perlu khawatir tentang isi direktori ini.
T. Verron
(Tidak dapat mengedit lagi) Apa yang saya tulis di atas tidak sepenuhnya benar: elpa adalah format arsip paket, package.el adalah manajer paket. Untuk pengguna, tidak ada perbedaan nyata antara keduanya. Komentar saya di atas kesalahan elpa dengan GNU elpa, yang merupakan salah satu paket elpa yang tersedia (dan satu-satunya yang resmi).
T. Verron
16

Jika Anda menyukai Org-mode, Anda dapat menggunakannya untuk mengatur Anda .emacstanpa membaginya. Di bawah konfigurasi saya saat ini, .emacsfile saya hanya bootstrap file init.org yang saya miliki di bawah~/.emacs.d/init/init.org

(require 'org)

;; Load the actual configuration file
(org-babel-load-file
  (expand-file-name (concat user-emacs-directory "init/init.org")))

Dengan menggunakan file yang berbeda Anda perlu, grepbukannya mudah C-suntuk mencari sesuatu, dan sebagainya. Juga, lebih mudah untuk menambahkan beberapa level ke organisasi Anda.

rlazo
sumber
1
Saat ini saya sedang dalam proses melakukan ini, meskipun saya tidak berpikir untuk menggunakannya org-babel-load-file. Manis! (Contoh: github.com/vermiculus/dotfiles/blob/… , github.com/larstvei/dot-emacs )
Sean Allred
Lebih lanjut tentang menggunakan mode-org untuk konfigurasi Emacs pada pertanyaan ini: Dapatkah saya menggunakan mode-org untuk membuat struktur .emacs saya atau file konfigurasi .el lainnya?
ShreevatsaR
9

Cukup pindahkan potongan-potongan kode dari init.elke file yang terpisah (perpustakaan), yang kemudian Anda require. (Gunakan providedi perpustakaan untuk required.) Letakkan file-file itu di mana pun Anda inginkan, dan perbarui load-pathsesuai.

Drew
sumber
Terima kasih. (1) misalnya? (2) apa yang Anda sarankan untuk mengatur ~ / .emacs.d /?
Tim
1
Apa yang Anda maksud dengan "mengatur konten ~/.emacs.d/? Anda tidak menawarkan spesifikasi apa yang Anda inginkan. Anda tidak dibatasi untuk memiliki semuanya dalam satu direktori. Anda dapat meletakkan barang-barang di mana saja Anda suka, dan memodifikasi load-pathsesuai. Jika beberapa program / alat hanya menempatkan barang-barang di ~/.emacs.d/(yaitu, jika Anda tidak bisa mengatakan di mana harus meletakkan barang-barang), kemudian pindahkan ke tempat yang Anda inginkan setelah program / alat itu selesai
Drew
1
Apa yang Anda maksud dengan "misalnya"? Apa yang Anda inginkan sebagai contoh? (require 'foobar)adalah contoh penggunaan require. (add-to-list 'load-path "/my/lisp/dir")adalah contoh modifikasi load-path. (provide 'foobar)adalah contoh penggunaan provide.
Drew
oleh "mengatur konten ~ / .emacs.d /, saya, sebagai manusia, dapat memahaminya dengan lebih baik, bukan untuk emacs untuk mengerti. Itu adalah kebiasaan, sama seperti mengatur kabinet, laci, rak buku Anda. Misalnya, python -mode.el-6.1.3 diinstal secara manual, sementara emacs-eclim-20140809.207 diinstal oleh elpa. Apakah mereka berdua paket? Jika ya, apakah itu ide yang baik untuk meletakkannya di bawah satu subdirektori ~ / .emacs.d /?
Tim
Anda adalah manusia yang dapat menjawab organisasi apa yang mungkin membantu Anda memahaminya dengan lebih baik. (Emacs tidak mengerti apa-apa.) Gunakan struktur folder apa pun yang Anda suka. Sebut saja lemari, laci, rak buku, atau hanya folder. Dan lagi, Anda init.eldapat memuat perpustakaan yang berlokasi di mana saja , tidak hanya di dalam ~/.emacs.d/.
Drew
7

Saya menggunakan saran oleh targzeta yang ditemukan di Emacs Wiki: Memuat direktori .

Pada dasarnya saya punya ~ / .emacs.d / load-directory.el:

;;;; ~/.emacs.d/load-directory.el

;; Handy function to load recursively all '.el' files in a given directory
(defun load-directory (directory)
  "Load recursively all '.el' files in DIRECTORY."
  (dolist (element (directory-files-and-attributes directory nil nil nil))
    (let* ((path (car element))
           (fullpath (concat directory "/" path))
           (isdir (car (cdr element)))
           (ignore-dir (or (string= path ".") (string= path ".."))))
      (cond
       ((and (eq isdir t) (not ignore-dir))
        (load-directory fullpath))
       ((and (eq isdir nil) (string= (substring path -3) ".el"))
        (load (file-name-sans-extension fullpath)))))))

Kemudian saya hanya meletakkan file terpisah di ~ / .emacs.d / config saya:

~/.emacs.d/config ls
01-packages.el  02-style.el  03-modes.el  04-keybindings.el  05-functions.el

Dan akhirnya saya memilikinya di ~ / .emacs.d / init.el:

;; Load all ".el" files under ~/.emacs.d/config directory.
(load "~/.emacs.d/load-directory")
(load-directory "~/.emacs.d/config")
Boccaperta-IT
sumber
Mereka ingin kami memberikan informasi lebih dari sekadar tautan - misalnya, deskripsi ringkasan tentang apa yang ada di tautan itu.
Drew
Anda benar, saya mengedit jawaban saya.
Boccaperta-IT
Hm Sebagai rasa hormat, setidaknya, Anda mungkin harus mengatakan bahwa kode yang Anda usap kata demi kata ditulis oleh targzeta . Meringkas halaman referensi silang tidak berarti menjiplak kontennya. (Tentu saja, jika Anda adalah targzeta, maka tidak mungkin ada masalah.)
Drew
Anda benar lagi, diedit. Terima kasih.
Boccaperta-IT
Terima kasih. (Saya tahu perlu sedikit waktu untuk melakukannya dengan benar, tetapi ini membantu semua orang sedikit lebih banyak.)
Drew
5

Jelas ada lebih dari satu cara untuk menguliti kucing khusus ini. Favorit saya saat ini adalah untuk digunakan outline-minor-modedengan lebih baik . Kutipan:

;; * This here is my emacs init file
;; ** Many subsections with headlines like this one omitted
;; ** Customising modes
;; […] more lines omitted
;; *** Org and outline modes
(autoload 'outshine-hook-function "outshine")
(add-hook 'outline-minor-mode-hook 'outshine-hook-function)
;; […] and more
;; * Emacs Magic
;;; Local Variables:
;;; mode: emacs-lisp
;;; coding: utf-8
;;; mode: outline-minor
;;; fill-column: 79
;;; End:

Perhatikan bahwa Anda perlu keluar dari repositori paket favorit Anda.

Harald Hanche-Olsen
sumber
1
Saya mulai dengan outline-minor-mode, tetapi menemukan keybindings terlalu menyakitkan, dan tidak pernah menemukan waktu untuk melakukan sesuatu tentang hal itu sendiri. Jadi saya pindah ke mode-org setelah menemukan mode-org, tapi kemudian saya mengetahui tentang outshine. Kebahagiaan! Saat ini saya menggunakan outline + outshine untuk semua penataan file elisp, lateks dan lainnya dengan mode utama mereka sendiri, dan mode org untuk semua jenis catatan.
Harald Hanche-Olsen
2

Saya menggunakan struktur berikut untuk melacak paket dan file

~/.emacs.d
|-- elpa            ;; Package.el packages
|-- hack            ;; Development versions of packages (e.g. org, personal packages)
|-- single-lisp     ;; Individual lisp files from outside sources (e.g. EmacsWiki)
|-- site-lisp       ;; Lisp packages not managed by package.el (directories)
|-- user-config     ;; Machine/situation specific customization (work vs home)
|   `-- custom.el   ;; Customization settings
|-- lisp            ;; Individual .el files to keep init.el clean
|   `-- defaults.el ;; Default configuration settings
`-- init.el

Saya kemudian gunakan use-packageuntuk mengelola paket mana yang dimuat dan kustomisasi mana yang ditetapkan untuk setiap paket. Sebagian besar waktu hanya hackdan elpamemerlukan pembaruan, folder lain sering untuk paket satu kali yang ingin saya uji atau gunakan secara singkat tetapi tidak perlu memuat (bahkan diam-diam).

custom.el adalah untuk pengaturan Kustomisasi, yang saya lebih suka tidak menggunakan (dan tidak versi bahkan jika saya menggunakan).

defaults.eladalah untuk konfigurasi umum (menu-bar, font, encoding, dll) yang kemudian dapat ditimpa dalam file .el user-config/untuk memungkinkan sistem yang akan berfungsi seperti yang saya harapkan, tetapi dapat disesuaikan agar sesuai dengan lingkungan.

Saya sebelumnya telah mencoba untuk menjaga functions, macros, advicedalam paket terpisah untuk memungkinkan penggambaran antara konten, tapi ran dalam definisi / membutuhkan masalah sehingga telah menempatkan kembali mereka ke dalam init.el. Mereka akhirnya dapat dimasukkan kembali ke ~/.emacs.d/lisp/.

Saya mencoba untuk tetap init.elrapi, mengurutkan konten berdasarkan fungsi dan tujuan sehingga menemukan lagi akan mudah. Saya sudah memiliki init.elfile monolitik dan terus menambahkan konten baru di akhir (atau di mana saya pikir itu cocok) dan kemudian akan berakhir tidak tahu apa yang telah saya tambahkan atau di mana saya telah menambahkannya ketika saya pergi untuk mencarinya (dan kadang-kadang pencarian menggunakan isearchtidak membantu karena saya tidak ingat bagaimana saya menyebutkan sesuatu pada saat itu).

Jonathan Leech-Pepin
sumber
2

Semua jawaban yang ada membahas praktik terbaik untuk mengatur file yang dibuat secara manual , seperti init.eldan teman-teman. Yang tak kalah penting adalah pengorganisasian semua file yang dibuat secara otomatis dari berbagai paket, dan untuk ini paketnya no-litteringluar biasa.

Radon Rosborough
sumber
1

saya tambahkan

  (when (string= (buffer-name) "init.el")
    (setq imenu-generic-expression
      '((nil "^;; \\[ \\(.*\\)" 1))))

untuk emacs-lisp-mode-hook. Kemudian tambahkan ke bagian file "yasnippet", "packaging", "java mode", dll. Ini berfungsi baik untuk 1000 baris kode saya (termasuk komentar).

EDIT: Akhirnya saya beralih antar bagian dengan helm-imenu. Sebenarnya pengait helm menjadi fungsi imenu normal secara otomatis sehingga yang saya butuhkan hanyalah

       (local-set-key (kbd "C-*") 'imenu)
Matthias
sumber
Anda bisa menggunakan variabel file lokal, bukan hook.
YoungFrog
1

Saya membagi .emacsfile saya yang relatif kecil menjadi tiga bagian:

  • emacs-custom.el untuk kustomisasi, merobek banyak data besar dan tidak berguna; file secara otomatis ditulis ulang tanpa menyentuh file .emacs utama , mencegah perubahan palsu.

    (setq custom-file "~/.emacs-custom.el")
    (load custom-file)
    
  • lg-lib.el untuk kode daripada konfigurasi: memuat perpustakaan saya sendiri dari lokasi sumber yang tidak standar daripada dari direktori paket dan mendefinisikan berbagai fungsi (kebanyakan disalin dan diretas tanpa adanya paket yang tepat); itu adalah pengurangan besar jumlah baris .emacs

    (load "~/lg-lib")
    
  • File .emacs utama : tanpa kode besar dan variabel kustomisasi besar, ini berisi requirepanggilan untuk paket, variabel yang bukan bagian dari sistem Kustomisasi, dan berbagai macam panggilan fungsi untuk memuat dan menginisialisasi paket. Saya "mengatur" dengan hati-hati menjaga semua baris yang berkaitan dengan paket atau fitur yang sama bersama-sama, dan selanjutnya memisahkan pemuatan paket dan pengaturan terkait paket dari fungsionalitas "inti". Kutipan yang cukup representatif:

    (require 'ido)
    (ido-mode t)
    
    (require 'auto-complete)
    (add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
    
    (require 'auto-complete-config)
    (ac-config-default)
    (global-auto-complete-mode t)
    

    Bagian-bagian ini kecil, tetapi akan tetap dapat dikelola dengan lebih banyak garis konfigurasi untuk setiap paket.

Lorenzo Gatti
sumber
1

Ikuti pengaturan master Emacs, misalnya, https://github.com/purcell/emacs.d

Misalnya, mengenai cara mengatur paket dan paket yang diinstal secara manual yang diinstal dari ELPA, setup Steven Purcell telah

a place for 3rd party code which isn't available in MELPA or other
package repositories. This directory and its immediate
subdirectories will be added to load-path at start-up time.

Notably, in Emacs 23.x, a backported package.el is automatically
downloaded and installed here

Mengapa mengikuti seorang master? Poin utama dari "Master emacs saya dalam satu tahun" adalah bahwa pemula dapat secara efisien menghindari pengaturan overhead dan "gotchas."

Saya mengerti bahwa banyak orang tidak setuju dengan saya, tetapi inilah kasus saya (dirinci dalam artikel saya ):

Saya mulai menggunakan Emacs dengan menggunakan konfigurasi Purcell yang sangat dihormati ( 1403 GitHub per Nov 2014!), Konfigurasi stabil (5 tahun dalam pengembangan). Meskipun mulai dari itu, saya masih memiliki banyak masalah . Steve Purcell membantu saya menyelesaikan semua masalah itu. (Saya benar-benar menjadi Padawan- nya selama lebih dari setahun.) Dengan menggunakan pengaturannya, dan menggunakan masalah repo-nya untuk melaporkan masalah, dan mengambil keuntungan dari pengalamannya, saya menghindari membuang banyak waktu. Bahkan hari ini, saya masih mengamati banyak orang menggunakan git submoduleuntuk mengelola plugin pihak ketiga. Steve dan saya menyerah menggunakan git submoduleini karena ini bisa menjadi PITA .

Tetapi jika Anda sangat percaya diri dengan keterampilan Anda atau lebih suka belajar mandiri, ini bukan jalan untuk Anda.

chen bin
sumber
2
" Mengkloning pengaturan dari master ": Tanpa memperhatikan referensi yang Anda kutip, yang mungkin memberikan fitur atau saran yang luar biasa (saya belum memeriksa), saya secara umum tidak setuju bahwa orang harus memulai dengan mengkloning file init atau pengaturan lain dari orang lain. Itu bahkan telah menjadi kebijakan yang secara eksplisit tidak disarankan, IIRC, karena dapat menyebabkan masalah. Lebih baik memulai dari awal dan waspadai (dan bahkan mengerti!), Apa pun yang Anda gunakan sebagai pengaturan dasar. Tentu saja tidak ada yang salah dengan belajar dan belajar dari apa yang telah dilakukan orang lain. Tetapi menyalin secara membabi buta file init tidak disarankan. (Hanya satu pendapat.)
Drew
1
sebenarnya, saya menulis artikel saya karena masih banyak orang percaya bahwa mereka harus mulai dari awal di setup. itu bukan cara terbaik bagi kebanyakan orang, seperti yang saya amati, dan cara yang tidak perlu sulit bagi pemula. cari saja
chen bin
1
Ini adalah " cara terbaik bagi kebanyakan orang ". Cukup cari diskusi dan saran untuk tidak memulai dengan menggunakan file init orang lain. Cari [email protected], dan www.emacswiki.org, dan [email protected], dan bahkan debbugs.gnu.org. Yang mengatakan, tidak ada yang salah dengan berbagi file init seseorang, untuk melayani orang lain sebagai makanan untuk dipikirkan. Nasihatnya adalah agar pemula tidak memulai seperti itu; sarannya adalah agar orang tidak membagikan pendekatan dan tip startup mereka sendiri.
Drew
1
Itu karena "bias penyintas". Banyak orang menyerah sebelum mereka tahu emacswiki atau milis.
chen bin
0

Cara inovatif dan sederhana untuk membersihkan .emacs.dfolder Anda adalah dengan menggunakan org-modedan menguraikan semuanya menggunakan blok sumber. Kemudian, di .emacsfile Anda , arahkan ke config.org.

Sumber yang bagus tentang ini adalah Harry Schwartz. Dia memiliki video youtube yang menyentuh dan posting blog yang menjelaskan detailnya . Saya bisa mengikutinya sebagai emacs noob dan mendapatkan semua pengaturan. Bekerja seperti pesona. 1 file untuk keseluruhan saya init.

SeaDude
sumber