~ / .Emacs.d / init.el ve ~ / emacs.d? İçeriğini düzenleyin.


28
  1. ~/.emacs.d/init.elÇeşitli amaçlar için daha fazla satır eklediğimizde (python modu için, emacs-eclim için, ... için), dosya uzun ve daha az okunabilir hale gelir. İçeriğini düzenlemeye yardımcı olmanın bir yolu var mı?
  2. Şu anki durumum ~/.emacs.dşuna benziyor

    $ 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.3ederken elle yüklendiği emacs-eclim-20140809.207tarafından yüklendiği elpave ben% 100 emin başka şeyler altında oyum elpa/tarafından idi elpa. İçeriğini nasıl düzenleyebilirim ~/.emacs.d/?

Yanıtlar:


32

Daha az editör kullanan insanlar kodlarını birden fazla dosyaya bölmeyi severler. Emacs kullanıyorsanız, bunu yapmak için hiçbir neden yoktur: bölümlere ayırdığınız tek bir büyük dosya kullanın.

Her bölüm ile başlamalı

^L
;;; title of the section

nereye eklemek ^Lyazarak karakter C-q C-l. Daha sonra dosyada gezinmek için C-x ]( forward-page) veya C-x n p( narrow-to-page) gibi komutları kullanabilirsiniz . Daha fazla bilgi için bkz. Emacs kılavuzunun Bölüm 25.4 (Sayfaları) .


16
Özel bir neden de var değil birden fazla dosya içine bölünmüş koduna. Bu, bir şeyleri gruplandırmanın ne demek istediğine - nasıl davranmasını istediğine bağlı. Ve BÜYÜK büyüklüğüne bağlı olabilir. Örneğin, kodunuzun parçalarının başkalarıyla, örneğin kitaplıklar olarak paylaşılıp paylaşılmadığına bağlı olabilir.
Drew

2
@ Drew'ın yorumlarına piggybacking, kullanıcı farklı emacs versiyonları ve ortamları için farklı konfigürasyonlara sahip olmak ve ilgili elisp'i buna göre yüklemek isteyebilir. Bu sayfalama ipucunu sevdim dedi.
Harvey

3
@Harvey: Sayfalandırma ve ayrı dosyalar kullanmak, metni düzenlemenin bağımsız yollarıdır. Açıkçası her ikisini de kullanabilirsiniz. Bölümleri ayırmak için bütün kütüphanelerimde sayfalandırma kullanıyorum. Ama ayrıca ayrı kütüphanelerim (dosyalarım) var.
Drew

1
jch Bu stili kullanıyorsanız, bölümlerin ve işlevlerin katlanmasına izin vermek için Anahat Küçük Modu'nu veya benzer bir özelliği etkinleştirmek de isteyebilirsiniz. Tüm üst seviye başlıkların katlanması, Emacs yapılandırmanızdaki tüm bölümlere güzel bir genel bakış sağlar.
lunaryorn

@lunaryorn, denedim ama rahatsız edici buldum - çoğu zaman sayfa hareketi komutlarını yeterli buluyorum, yalnızca zaman zaman daraltmam gerekiyor. Belki benim .emacsve .wlyeterince uzun değil.
jch

20

Bunu yapmanın klasik bir yolu, sizi .emacsayrı dosyalara bölmektir . Örneğin, tüm web sayfalarınızı taşıyabilir ~/.emacs.d/web-config.elve daha sonra içine yükleyebilirsiniz init.el:

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

~/.emacs.dBiraz daha düzenli tutmak istiyorsanız , bu yapılandırma dosyalarını kendi dizinlerine de kaydırabilirsiniz:

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

Artık konfigürasyonunuzda değişiklik yaparken uygun dosyaya atlayabilirsiniz.

Bundan eksik olan bir şey, özelleştirme sistemi aracılığıyla ayarlanan değişkenlerdir. Bunların hepsi hala ana init.elinizde olacak. Görünüşe göre, init split adlı küçük bir yardımcı program var ve bu da hangi özelleştirme ayarının nereye gittiğine dair kurallar koymanıza izin veriyor, ama ben kendim kullanmadım. Alternatif olarak, “kişiselleştir” sistemi, ayarlarınızda yapılan değişiklikler için ayrı bir dosya kullanacak şekilde yapılandırılabilir. “Özelleştir” ayarlarının nereden okunup nereye yazılacağını belirtmek için custom-filedeğişkeni ayarlayın .

Dizinin kendisi gittiğinde, varsayılan düzenden her zaman mutlu oldum. Yaptığım ana değişiklik olduğunu kendi özel paketler ve kütüphaneler tümü için bir dizin oluşturarak oldu değil tarafından yönetilen package.el. Bu benim özel elisp yapılandırma ile ilgili olmayan tek bir ev verir.


Teşekkürler. (1) package.el tarafından yönetilen paket ve kütüphanelerin dizini nedir? (2) Dir'in içeriği elpayönetiliyor elpamu? Onları başka bir yere götürebilir miyim?
Tim

2
Değişken ayarlayarak custom-fileDeğişkenleri özelleştir için ayrı bir dosya belirleyebilirsiniz . Kaynak
Kaushal Modi

@Tim: package.el tarafından yönetilen dizin elpa. Elpa bir lisp paketi değil, bir paket deposu. Package.el hala kurduğu tüm paketleri ekleyecektir (elpa'dan veya başka bir depodan --- örneğin sizin durumunuzda, eclim ve s'nin elpa'dan olduğunu sanmıyorum). Ve evet, bu dizinin içeriği hakkında endişelenmenize gerek yok.
T. Verron

(Artık düzenleyemiyorum) Yukarıda yazdıklarım kesinlikle doğru değil: elpa, paket arşivlerinin formatı, package.el, paket yöneticisidir. Kullanıcı için, ikisi arasında gerçek bir fark yoktur. Yukarıdaki yorumum, mevcut elpa paketlerinden biri olan GNU elpa ile (ve sadece resmi olan) elpa hataları.
T. Verron

16

Org modunu seviyorsanız, .emacsayırmadan düzenlemek için kullanabilirsiniz . Mevcut konfigürasyonum altında .emacsdosyam sadece sahip olduğum bir init.org dosyasını bootstraps etti~/.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")))

Farklı dosyaları kullanarak , bir şey aramak için grepbasit yerine yapmanız gerekir C-s. Ayrıca, kuruluşunuza birkaç seviye eklemek daha kolaydır.


1
Şu an bunu yapmayı düşünüyorum, ama kullanmayı düşünmedim org-babel-load-file. Tatlı! (Örnekler: github.com/vermiculus/dotfiles/blob/… , github.com/larstvei/dot-emacs )
Sean Allred

Bu soruda Emacs config için org-mode kullanma hakkında daha fazla bilgi: .emacs veya başka bir .el yapılandırma dosyasını yapılandırmak için org-mode kullanabilir miyim?
ShreevatsaR

9

Sadece kod parçalarını, init.elo zaman ayırdığınız ayrı dosyalara (kütüphaneler) taşıyın require. ( provideKütüphanelerde kullanmak için kullanın require.) Bu dosyaları istediğiniz yere koyun ve load-pathuygun şekilde güncelleyin .


Teşekkürler. (1) örneğin? (2) ne organize etmeyi önerirsiniz? / .Emacs.d /?
Tim

1
Ne demek istiyorsun "içeriğini organize et ~/.emacs.d/? Ne istediğine dair bir spesifikasyon sunmuyorsun. Her şeyi tek bir dizinde tutmakla sınırlı değilsin. İstediğin herhangi bir şeyi bir yere koyabilirsin ve load-pathbuna göre değiştirebilirsin . Bazı programlar / araçlar sadece koyarsa içinde şeyler ~/.emacs.d/. (eğer malzeme koymak için nerede söyleyemem eğer yani) istediğiniz yere o program / aracı yapıldıktan sonra ve taşımak
Drew

1
"Örneğin" ile ne demek istiyorsun? Örnek olarak istediğiniz şey nedir? (require 'foobar)kullanma örneğidir require. (add-to-list 'load-path "/my/lisp/dir")değiştirmeye bir örnektir load-path. (provide 'foobar)kullanma örneğidir provide.
Drew

"/ .emacs.d / 'nin içeriğini düzenleyerek, ben bir insan olarak, onu daha iyi anlayabilirim, emacların anlayamaması için değil. Bu, bir kabine, çekmeceler, raflardan düzenleme gibi bir alışkanlıktır. Örneğin, python -mode.el-6.1.3, emacs-eclim-20140809.207, elpa tarafından yüklenirken, her ikisi de paketler mi? Bunları varsa, bunları ~ / .emacs.d alt dizininde bir alt dizine koymak iyi bir fikir mi? /?
Tim

Hangi kuruluşun daha iyi anlamanıza yardımcı olabileceği konusunda size cevap verebilecek insan sizsiniz. (Emacs hiçbir şey anlamıyor.) İstediğiniz klasör yapısını kullanın. Onlara dolapları, çekmeceleri, kitap raflarını veya sadece klasörleri çağırın. Ve yine, sadece içinde değil, her yerdeinit.el bulunan kütüphaneleri yükleyebilirsiniz . ~/.emacs.d/
Drew

7

Öneriyi Emacs Wiki: Load dizininde bulunan targzeta tarafından kullanıyorum .

Temelde ben bir ~ / .emacs.d / load-directory.el var:

;;;; ~/.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)))))))

Sonra sadece ~ / .emacs.d / config içine ayrı dosyalar koymak:

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

Sonunda ~ / .emacs.d / init.el dosyasında da var:

;; Load all ".el" files under ~/.emacs.d/config directory.
(load "~/.emacs.d/load-directory")
(load-directory "~/.emacs.d/config")

Sadece bir linkten daha fazla bilgi vermemizi istiyor - örneğin, o linkte ne olduğuna dair bir özet.
Drew

Haklısın, cevabımı düzenledim.
Boccaperta-IT

Hm. Bir nezaket olarak, en azından, sözlü olarak yazdığınız kodun targzeta tarafından yazıldığını söylemelisiniz . Özetle bir çapraz referanslı sayfa içeriğini plagiarizing anlamına gelmez. (Eğer değilse, doğal olan targzeta ardından muhtemelen sorun yoktur.)
Drew

Yine haklısın, düzenlendi. Teşekkürler.
Boccaperta-IT

Teşekkürler. (Doğru yapmak için biraz zaman alacağını biliyorum, ancak herkese biraz daha yardımcı olur.)
Drew

5

Belli bir kediyi cildin birden fazla yolu olduğu açık. Şu anki favorim, güneş ışığıoutline-minor-mode ile kullanmak . Alıntı:

;; * 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:

En sevdiğiniz paket havuzundan para kazanmanız gerekeceğini unutmayın.


1
Anahat-minor-mod ile başladım, ancak anahtar bağlarını çok acı verici buldum ve kendimle ilgili bir şey yapmak için zaman bulamadım. Bu yüzden org-modunu keşfettikten sonra orgstruct moduna geçtim, ama sonra güneş ışığı hakkında bir şeyler öğrendim. Mutluluk! Şu anda elisp, lateks ve diğer dosyaları kendi ana modlarına sahip yapılandırmalarım ve her tür nota için org-mode yapılarım için anahat + outshine kullanıyorum.
Harald Hanche-Olsen

2

Paketleri ve dosyaları takip etmek için aşağıdaki yapıyı kullanıyorum

~/.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

Daha sonra use-packagehangi paketlerin yüklendiğini ve her paket için hangi özelleştirmelerin ayarlandığını yönetmek için kullanırım . Zaman sadece Çoğu hackve elpagüncellenmesi gerektiren, diğer klasörler için genellikle tek seferlik ben testi veya kullanım kısaca istiyorum ama (hatta boş boş) yüke gerekmez paketler.

custom.el Kullanmamayı tercih ettiğim ayarları Özelleştir (ve kullansam bile sürümlerini değiştirmeyin).

defaults.eluser-config/beklediğim gibi çalışacak, ancak çevreye uyacak şekilde ayarlanabilen herhangi bir .el dosyasında üzerine yazılabilecek genel yapılandırma (menü çubuğu, yazı tipi, kodlama vb.) içindir .

Daha önce tutmaya çalışmış functions, macros, adviceiçerik arasındaki çizilmesi için izin vermek ayrı paketlerde, ama tanım içine koştu / meselelerinin içine bu geri koyduk gerektirir init.el. Sonunda tekrar yerleştirilebilirler ~/.emacs.d/lisp/.

init.elDüzenli tutmaya , içeriği işlev ve amaca göre sıralamaya çalışarak yeniden bulmanın kolay olacağını düşünüyorum. Yekpare bir dosyam init.eloldu ve sonunda yeni içerik eklemeye devam ettim (veya uygun olabileceğini düşündüğüm yere) ve sonra ne eklediğimi ya da aramaya gittiğimde nereye eklediğimi bilmeden sona erecekti (ve Bazen arama yapmak isearchyardımcı olmadı çünkü o zamanları nasıl adlandırdığımı hatırlayamadım).


2

Mevcut cevapların tümü, arkadaş ve el ile oluşturulan dosyaları düzenlemek için en iyi uygulamaları ele almaktadır init.el. Eşit derecede önemli, çeşitli paketlerden otomatik olarak oluşturulan tüm dosyaların düzenlenmesidir ve bunun için paket no-litteringmükemmeldir.


1

ekledim

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

emacs-lisp-mode-kanca için. Sonra "yasnippet", "packaging", "java mode", vb. Gibi dosya bölümlerine ekleyin. Bu, 1000 kod satırım için çok işe yarar.

EDIT: Sonunda dümen-imenu olan bölümler arasında geçiş yapıyorum. Aslında dümen kancaları normal imenu fonksiyonuna otomatik olarak bağlanır, böylece ihtiyacım olan tek şey

       (local-set-key (kbd "C-*") 'imenu)

Kanca yerine bir dosya yerel değişkeni kullanıyor olabilirsiniz.
YoungFrog

1

Göreceli olarak küçük dosyamı .emacsüç bölüme ayırdım:

  • özelleştirmeler için emacs-custom.el , çok sayıda hantal ve yararsız veriyi sökmek ; Ana .emacs dosyasına dokunmadan dosya otomatik olarak yeniden yazılır ve sahte değişiklikleri önler.

    (setq custom-file "~/.emacs-custom.el")
    (load custom-file)
    
  • konfigürasyondan ziyade kod için lg-lib.el : kendi kütüphanelerimi paketleri dizinden ziyade standart olmayan kaynak konumlarından yüklemek ve çeşitli fonksiyonlar tanımlamak (çoğunlukla uygun bir paketin yokluğunda kopyalanır ve hacklenir); .emacs satır sayısının bir başka büyük azalmasıdır .

    (load "~/lg-lib")
    
  • Ana .emacs dosyası: hantal kod ve hantal kişiselleştirme değişkenleri olmadan, requirepaket çağrıları, Özelleştirme sisteminin bir parçası olmayan değişkenler ve paketleri yüklemek ve başlatmak için çeşitli işlev çağrıları içerir. Aynı pakete veya özelliğe ait tüm çizgileri bir arada tutarak ve paket yükleme ile pakete ilişkin ayarları "temel" işlevsellikten daha fazla ayırarak "organize ediyorum". Oldukça temsilci bir alıntı:

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

    Bu bölümler küçük, ancak her paket için daha birçok yapılandırma satırıyla yönetilebilir kalıyorlardı.


1

Bir Emacs master kurulumunu izleyin, örneğin, https://github.com/purcell/emacs.d

Örneğin, ELPA'dan yüklenen elle yüklenen paketlerin ve paketlerin nasıl organize edileceğine ilişkin olarak, Steven Purcell’in

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

Neden bir ustayı takip ediyorsun? "Bir yılda Master emacs" benim önemli bir nokta yeni başlayanlar böylece genel gider ve "gotchas" kurulumunu etkin bir şekilde önleyebilirler.

Anladığım kadarıyla birçok insan benimle aynı fikirde değil, ancak işte benim davam ( makalemde ayrıntılı olarak verilmiştir ):

Emcell'i Purcell'in saygın ( Kasım 2014 itibariyle 1403 GitHub yıldızı!), İstikrarlı (5 yıllık geliştirme) yapılandırmasını kullanarak başladım . Bundan başladığım halde hala birçok sorunum vardı . Steve Purcell tüm bu sorunları çözmeme yardım etti. (Ben aslında bir yıldan uzun süre Padawan oldum .) Kurulumunu kullanarak ve repo sorunlarını sorunları bildirmek için kullanmak ve deneyimlerinden faydalanmakla, çok fazla zaman kaybetmekten kaçındım. Bugün bile git submodule, üçüncü taraf eklentilerini yönetmek için kullanan birçok insanı hala gözlemliyorum . Hem Steve hem de ben bunun için kullanmaktan vazgeçtikgit submodule çünkü bu böyle bir PITA olabilir .

Ancak, yeteneklerinizden çok eminseniz veya kendi kendine öğrenmeyi tercih ediyorsanız, bu sizin için bir yol değildir.


2
" Kurulumu ana birimden klonlamak ": Aldığınız referanslara özel olarak bakıldığında, harika özellikler veya tavsiyeler sunabilir (kontrol etmedim), genel olarak insanların init dosyalarını veya diğer kurulumları klonlayarak başlaması gerektiğine katılmıyorum. Bu, açıkça sorunlara yol açabileceği için açıkça tavsiye edilmeyen bir politika olan IIRC olmuştur. Sıfırdan başlamak ve temel kurulum olarak ne kullanıyorsanız kullanın (ve hatta anlayın!) Farkında olun. Elbette, başkalarının yaptıklarından ders çalışmak ve öğrenmekle ilgili yanlış bir şey yoktur. Ancak init dosyalarının kör şekilde kopyalanması önerilmez. (Sadece bir görüş.)
Drew

1
aslında yazımı yazıyorum çünkü hala birçok kişi kurulumdaki sıfırdan başlaması gerektiğine inanıyor. gözlemlediğim gibi çoğu insan için en iyi yol değil ve yeni başlayanlar için de gereksiz yere zor yoldur. sadece arama
chen bin

1
O ise " çoğu insan için en iyi yolu ". Başkasının init dosyasını kullanarak başlamanıza karşı tartışmalar ve tavsiyeler arayın . Arama yapın help-gnu-emacs@gnu.orgve www.emacswiki.org, ve emacs-devel@gnu.org, ve hatta debbugs.gnu.org. Bununla birlikte, birisinin init dosyasını paylaşırken, başkalarına düşünce için yiyecek olarak hizmet etmede yanlış bir şey olmadığını söyledi. Tavsiye, yeni başlayanlar için bu şekilde başlamaması; tavsiye, insanların kendi başlangıç ​​yaklaşımlarını ve ipuçlarını paylaşmamaları değildir.
Drew

1
Hayatta kalma önyargısı yüzünden. Birçok kişi emacswiki veya posta listesini bilmeden önce pes eder.
chen bin

0

.emacs.dKlasörünüzü temizlemenin yenilikçi ve basit bir yolu org-modekaynak blokları kullanarak her şeyi kullanmak ve özetlemektir. Ardından, .emacsdosyanızda, işaret edin config.org.

Bu konuda harika bir kaynak Harry Schwartz. Dokunan bir youtube videosu ve detayları açıklayan bir blog yazısı var . Bunu bir emacs noob olarak izleyebildim ve tüm ayarları yaptım. ÇALIŞIYOR bir cazibe gibi. Tüm dosyam için 1 dosya init.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.