Düzenli emac'lerle birlikte boşluk bırakma: ayrı bir .emacs.d nasıl korunur


32

Spacemacs denemek istiyorum. Ancak henüz normal emacs konfigürasyonumdan geçmek istemiyorum, bu yüzden şu anda benim .emacs.diçimdeki konfigürasyonun bir dizinde olmasını ve boşlukların eşdeğer bir konfigürasyonunun başka bir dizinde olmasını istiyorum. Her iki dizinde de hangi isim olduğu umurumda değil.

Bu mümkün mü, chroot / LD_PRELOAD / diğer hilelerden mahrum mu? Nasıl yapabilirim?


2
Ayrıca bkz. Dan'in Emacs başladığında seçeneklerle zamanlayıcı kurma konusunda benzer bir soruya verdiğim cevaba bakınız: emacs.stackexchange.com/questions/3588/… O zamandan beri bu cevabın küçük bir değişimini kullanıyorum.
kanun listesi

1
“Diğer hile” kategorisinde, belki de, spacemacsemacs'ın çalıştırılabilir olduğuna işaret eden bir sembolik bağlantı oluşturabilir ve (car command-line-args)hangi init dosyasının çalıştırılacağına karar vermek için değerini kullanabilirsiniz . Tabii ki, OS X dışında bir unix sistemde çalıştığınızı varsayıyorsunuz. (Uygulama paketlerinin OS X üzerinde çalışması bu hilenin gerçekleştirilmesini zorlaştırıyor.)
Harald Hanche-Olsen

1
Burada başka bir yaklaşıma bakın: emacs.stackexchange.com/q/4253/780
glucas

2
Söylemeye geldim, yaklaşık 18 ay sonra, hala boşlukları öğrenemememin nedeni bu. Kabul edilen cevapla ilgili birkaç sıkıntı yaşadım, sonra tekrar denedim, yine de doğru. Org katmanı eklendikten sonra şimdi "Sembolün fonksiyon tanımı geçersiz: loop" var. Bunun nedeninin bir parçası olduğunu bilmiyorum ama bu tamamen bir sorun: Cilalı bir "piller" projesi için, sadece BAŞLATMAK için bir şeyi birlikte kaldırmak zorunda kalmak gibi görünüyor, sonra yapılandırmamın desteklenip desteklenmediğini merak ediyor musunuz? Belki de haksızlık ama bu bana güven kaybetmemi sağlıyor. Belki başka bir 18 ay sonra
tamir edilir

Yanıtlar:


20

Bir seçenek, bir ~/.emacsdosyaya hangi yapılandırmayı yüklemek istediğinizi belirlemektir . Emacs başladığında, bakmadan önce böyle bir dosyayı arayacaktır ~/.emacs.d/. Daha fazla ayrıntı için Emacs kılavuzundaki Init Dosyası'nı okuyabilirsiniz .

Mesela bir tane yaratıp ~/.spacemacs.dvarlığınızı ~/.emacs.dolduğu gibi tutabilirsiniz . Ardından, ~/.emacshangisini kullanacağınızı seçmek için bir tane yükleyin:

(setq use-spacemacs t)   ; or nil 

(when use-spacemacs
  (setq user-emacs-directory "~/.spacemacs.d/"))   ; defaults to ~/.emacs.d/

(load (expand-file-name "init.el" user-emacs-directory))

İsterseniz, .emacs dosyasını değiştirmeden yapılandırmaları değiştirmenin yollarını bulabilirsiniz. Örneğin, .emac'larınızın kabuğunuzda veya boşlukları başlatmak için kullandığınız bir komut dosyasında belirlediğiniz bazı ortam değişkenlerini denetlemesini sağlayın:

(setq use-spacemacs (getenv "USE_SPACEMACS"))

1
Elbette, boşluk kullanarak koşup koşmadığınızı söylemeniz için elisp içinden bir yol olmalı? Örneğin, fboundpboşluk haritalarına özgü bir işlevi veya komutu kontrol ederek (ile )?
Harald Hanche-Olsen

2
Elbette, ama anladığım kadarıyla soru bu değildi. Boşluklar yalnızca bir emacs yapılandırmasıdır ve OP birden fazla bağımsız emacs yapılandırma dizinini nasıl koruyacağını bilmek ister.
glucas,

1
@ HaraldHanche-Olsen indirdiğimde beni şaşırttı, ama düşündüğümde tamamen mantıklı geldi. Beklediğimizin nedeni, çoğu sistem için, cilalanmış bir 'ürün' gibi, boşluk gibi görünen bir ürün yapmak, bazı alt seviye sistemler dilini yıpratmak için gerekli gibi görünüyor - ama emac'larda çok fazla genişletilebilirlik var (teşekkürler elisp) bu gerekli değil.
Croad Langshan

1
Bunu kabul ettim ama gerçekten denemedim. Şimdi sahip olduğum gibi, tam olarak çalışmaz: Dosya hatası: /home/me/.emacs.d/core/core-load-paths.el dosyasını yükleyemiyorum, (setq user-emacs-directory "~/.spacemacs.d/")bunun için gerekli iş ( prognkoşullu koşullarınızın bir dalında). Bunu cevabına ekleyebilir misin, böylece tekrar kabul edebilirim?
Croad Langshan

2
@glucas win10'dayım, bir nedenden dolayı HOME, c: / users / nate şirketine atandı. Çevresel değişken kaldırıldı ve her şey iyi çalıştı.
Nathaniel Saxe,

12

Sadece bir dosya yüklemek ve diğer yandan çalışma ortamımı .emacs.ddeğiştirmek veya değiştirmekle uğraşmak yerine init'te yapılacak daha çok şey olduğu HOMEiçin, @glucas’nun önerdiği bir değişkeni seçtim. Farklı init dizinleri arasında geçiş yapmak için bir ortam değişkeni kullanmak için kodu kullandım startup.elve yamayı # 15539'dan ekledim . Hiçbiri verilmezse, varsayılan kullanılır.

Ara boşluklarla ilgili bir sorun vardı: asyncdeğiştirilen init dizini hakkında bir şey bilmiyor ve bu nedenle gerekli bazı dosyaları bulamıyor. Ancak bu son zamanlarda boşluklarda çözüldü: .emacs.d dışında bir config dizini kullanıldığında hata oluştu · Sayı # 3390

Öyleyse işte ~/.emacsorjinal init-code gibi davranmalı fakat yapılandırılabilir init dizini ile

;;; .emacs --- let the user choose the emacs environment to use

;;; Commentary:
;;; This code mimics the behaviour of `startup.el' to let the
;;; usage of the custom init directory behave just like the
;;; one and only "~/.emacs.d".
;;;
;;; By setting the environment variable `EMACS_USER_DIRECTORY'
;;; the user-emacs-directory can be chosen and if there is an
;;; `init.el' the configuration from that directory will be used.
;;; If the environment variable is not set or there is no `init.el'
;;; the default configuration directory `~/.emacs.d/' will be used.
;;;
;;; The variable `server-name' will be set to the name of the directory
;;; chosen as start path.  So if the server will be started, it can be
;;; reached with 'emacsclient -s servername'.
;;;
;;; This now works with a current version of spacemacs but does not
;;; work with `async-start' in general, if the code executed with `async'
;;; uses `user-init-dir' or makes other assumptions about the emacs
;;; start-directory.

;;; Code:
(let* ((user-init-dir-default
    (file-name-as-directory (concat "~" init-file-user "/.emacs.d")))
       (user-init-dir
    (file-name-as-directory (or (getenv "EMACS_USER_DIRECTORY")
                    user-init-dir-default)))
       (user-init-file-1
    (expand-file-name "init" user-init-dir)))
  (setq user-emacs-directory user-init-dir)
  (with-eval-after-load "server"
    (setq server-name
      (let ((server--name (file-name-nondirectory
                   (directory-file-name user-emacs-directory))))
        (if (equal server--name ".emacs.d")
        "server"
          server--name))))
  (setq user-init-file t)
  (load user-init-file-1 t t)
  (when (eq user-init-file t)
    (setq user-emacs-directory user-init-dir-default)
    (load (expand-file-name "init" user-init-dir-default) t t)))

(provide '.emacs)
;;; .emacs ends here

Ayrıca, fazladan çaba göstermeden bir arka plan programı olarak çalışmasını sağlayan hoş bir ek de var: sunucu ismi init dizininin ismine ayarlanacak. Şimdi ikinci bir emac daemon'a vanilya spacemacs ile başlayabilirsiniz.

EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon

ve hala emacsclient kullanın

emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'

Usecase'im çok basit ve şaşırdım, tek kişi benim: Sürekli çalışan bir emacs cini kullanıyorum ve onu gui ve konsoldan kullanıyorum (örneğin ssh ile). Bu emacs ben tüm belgeleri ve çalışma günlüğümü hazırlıyorum, bu yüzden her zaman orada olmalı. Fakat daha sonra boşlukları ya da diğer dağıtım paketlerinden birini denemek ve hatta mevcut konfigürasyonumu geri çekinceye ya da zekice fikirlerden bazılarını kullanana kadar yapılandırmak istiyorum. Ve diğerleri gibi, çalışma arkadaşlarım için basit bir temel konfigürasyon oluşturmak ve çalışan örneğimde org-mode ile belgelemek istedim.

Bildiğim tek sorun asyncve değiştirilen init dir. Hakkında bir şey bilmediğinden, asyncvarsayılan olarak enjekte edilmesi gereken değişkenlere sahip olan bazı konfigürasyonları eklemenin en iyi yolu olduğunu düşünüyorum. ait çağırmaları async-startspacemacs yaptığı gibi.


Bu gerçekten çok hoş ve güzelce çalıştı ... kullanmam gerekene kadar async. :-( Gönderdiğinizden bu yana birkaç ay geçtiğinden, bir geçici çözümünüz var mı?
Trey

Maalesef hayır - boşluklar için sabit ve genel asenkronize için herhangi bir değişiklik olması gerekip gerekmediğinden gerçekten emin değilim, çünkü herhangi bir değişiklik async-startyapmadan emacs başlatır ve eğer bir değişken kullanmak istiyorsanız onu geçmek zorunda kalırsınız. eğer zaman uyumsuz, her çağrıda kullanılacak bir değişken listesiyle yapılandırılabilirse, iyi ve rahat olun async-start.
Uwe Koloska,

1
Bu yaklaşımla, .emac'leriniz yüklenmeden önce default user emacs dizininden başlatılan başka değişkenler olabilir. Mesela (setq custom-theme-directory user-emacs-directory)buraya eklemem gerekiyordu.
glucas

1
Bu değişkenin nerede ayarlandığını bilmiyorum, çünkü onu minimal bir testenv içinde incelediğimde, alıyorum: Değeri "~ / .emacs.d /". Orijinal değer "~ / .emacsenv.d / init-test /" idi. Bu yüzden doğru değere sahip, ancak bunun üzerine yazılmıştır.
Uwe Koloska

1
Aslında soruyu sorduktan çok sonra bu cevabı kullandım. Kabul edilen cevabı değiştirmedim, çünkü çok uzun ve uygulama için fazla dikkat etmediğim için! Bu cevap benim için çok faydalı oldu.
Croad Langshan

5

Bu açıklanmıştır burada ve bir orada devam eden PR belgelerine eklemek için:

mkdir ~/spacemacs
git clone git@github.com:syl20bnr/spacemacs.git ~/spacemacs/.emacs.d
HOME=~/spacemacs emacs```

6
Evet, bazen alternatif bir yapılandırma denemek için HOME'u değiştiriyorum. Dezavantajı HOME'un etkilememeyi tercih edebileceğiniz diğer şeyler için kullanılmasıdır.
glucas 23

3

Çoktan cevaplandı ve kabul edildi, ancak işleri tersine çevrilebilir şekilde yapmanın yeni yollarını denemek istiyorsanız (emacs yapılandırmalarının ötesinde), kendinizi GNU Stow ile tanıştırmak için yarım saat geçirmenizi öneririm. Bir çeşit var ln -ssteroid ve kullanmak için çeşitli yaklaşımlar olabilir. Tüm kurulumu tek bir alt dizinde (offlineimap config, emacs config vb.) - çevre temelli bir yaklaşım olabilir - veya sahip olduğunuz her uygulama için ayrı bir alt dizine sahip olabilirsiniz. Tatlı şizofreni.

Emacs ile ilgili listelemeler ~ / Stow'dan:

-> % ls ~/Stow | grep emacs
emacs 
emacs_from_scratch
spacemacs
hoodoo@T450s 2:46 [~]

Kullanılabilir hale getirmeyi başardığım ilk yapılandırma var, biri 'varsayılanları yapıyorum' config ve biri 'kendim atacağım'. Bunların her birini açıp kapatabilirim ve her zaman kullanılabilir olmasını sağlayabilirim. Her alt dizin ~ 'e göre tam bir ağaca sahip olabilir ve karıştırmak ve eşleştirmek oldukça kullanışlı.


Stow'u zaten olduğu gibi kullanıyorum. Ama bunun için nasıl kullanıyorsunuz? Sadece stoğunuzu kullanarak kullanmak istediğinize in / out işaretleyerek .emacs.d'nizi dinamik bir şekilde kapsamaya mı başladınız? İkisini de aynı anda yaptınız mı? Eğer öyleyse, her iki emac de kendilerinin "kendi" olduğunu düşünürler. Acaba, devleti koruyan şeylerle bazı tuhaflıklara neden olabilir mi, merak ediyorum, son söylenenler, tasarruf kayıtları, otomatik kaydetme vb.
Croad Langshan,

Hayır, sadece yapılandırmaları gerektiği gibi değiştiriyorum.
Roman Grazhdan

2

@Uwe Koloska'nın kullandığı yamayı kontrol ettim. Ana şubeye dahil edilmedi. Biraz katılıyorum, sorunun kabuk dışına çıkıp emacs hakkında hiçbir şey bilmemesi dışında emacs dışında çözülmesi gerektiğini düşünüyorum.

Belki bu özellik kullanıcı bakış açısından daha mantıklı olur, bayrak kullanmak bazı kullanıcılar için daha az karmaşık olurdu.

Kullanım durumumda, Emacs kurulumumu ve Spacemac'larımı tutmak istiyorum, böylece yukarıdaki iki çözümün varyasyonları bunun gibi çalışır.

kabuk betiği

Öncelikle boşlukları başlatmak için kullanılan komut dosyası:

#!/bin/sh

export EMACS_USER_DIR=~/spacemacs/emacs.d

exec emacs "$@"

Bu komut dosyası denir spacemacsve /usr/local/binklasöre yüklenir .

.emacs dosyası

Sonra .emacsev klasörümde ortam değişkenine düzgün davranacak bir dosyaya ihtiyacım var EMACS_USER_DIR.

(defvar user-custom-dir (getenv "EMACS_USER_DIR"))

(when (/= (length user-custom-dir) 0)
  (setq user-emacs-directory (file-name-as-directory user-custom-dir)))

(load (expand-file-name "init.el" user-emacs-directory))

Elisp konusunda hiç deneyimli değilim, bu yüzden bunu gördüm, daha deneyimli insanlar muhtemelen daha iyi bir şey bulabilirler. Ama hey, işe yarıyor.

Göz-şeker

Öyleyse neden bir simge eklemiyorsunuz:

ikon

[Desktop Entry]
Name=Spacemacs
GenericName=Text Editor
Comment=Edit text
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
Exec=spacemacs %F
Icon=/home/marcs/.icons/spacemacs.svg
Type=Application
Terminal=false
Categories=Development;TextEditor;
StartupWMClass=Emacs
Keywords=Text;Editor;

3
Shell-script'iniz kullanmalı exec emacs "$@".
Uwe Koloska

Evet, bahşiş için teşekkürler, düzeltildi.
Marcs,

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.