Özel bir kullanıcı emacs diziniyle emacs nasıl başlatılır


58

Gelecekteki yapılandırmaları için temel olarak kullanmaları için bazı arkadaşlarla git deposu olarak paylaşmak istediğim özel ve küçük bir Emacs yapılandırması üzerinde çalışıyorum.

Bunun için konfigürasyonumu test etmek için bir yola ihtiyacım var ve bulabildiğim en basit çözüm şunun gibi:

$ emacs --eval "(setq user-emacs-directory \"~/Code/my_custom_emacs.d/\")"

Ama çalışmasını sağlayamıyorum.

Herhangi bir yardım çok takdir etmek.


3
Emacs Invocation Ek C Komut Satırı Argümanları üzerinden okudum, ancak .emacs.dHOME'u benim için sorunlu görünmediği sürece Emacs'ı özel bir dizinle başlatmak için basit bir komut satırı seçeneği bulamadım . İnsanlar aşağıda geçici çözümler sağlamıştır, ancak bana göre bu Emacs'in kendisi için çok makul bir özellik isteği gibi geliyor.
David J.


5
@DavidJames Haklısın: Emacs'in hata izleyicisinde bununla ilgili bir dilek listesi var.
ffevotte

2
Güncelleme: bu özellik Emacs geliştiricilerini çok fazla ilgilendirmiyor gibi görünüyor: istek etiketlendi wontfixve hata izleyicide kapatıldı.
ffevotte

@Francesco: Kullanıcı Emacs dizinini "~" dışına koymayı sağlayan dinamik bir yaklaşım deniyorum. Belki bir deneyeceksin.
antonio

Yanıtlar:


39

Bunun için kullandığım temel yaklaşım, aşağıdakileri yaparak değiştirmektir $HOME:

env HOME=/path/to/dir emacs

Sonra kullan /path/to/dir/.emacs.d

Ayrıca, bu sahte evdeki önemli dosyaları veya dizinleri asıl olanlarla yeniden ilişkilendirmek isteyebilirsiniz, böylece Emacs onları görecektir.


2
Bu mükemmel çalışıyor!
Mattias Bengtsson

8
Emac Kılavuzuna göre - Ek C Komut Satırı Emacs Çağrısı için Argümanlar - Ortam Değişkenleri - Genel Değişkenler , HOME, "Dosyalarınızın dizin ağacındaki konumu; tilde (~) ile başlayan dosya adlarını genişletmek için kullanılır." HOME'u değiştirmek, daha sonra gerçek ana klasörünüzdeki dosyaları hızlı bir şekilde gezinmek veya bulmak istediğinizde sorun için bir tarif gibi görünür .
David J.

2
David James: Evet, bu yaklaşımla küçük bir sıkıntı. Belirtildiği gibi, HOME altında görmek için Emacs'a ihtiyacınız olan şeyleri kopyalamak veya işaretlemek isteyeceksiniz ve gerçek ev dizininizi ziyaret etmek istiyorsanız, mutlak yolu kullanmanız gerekir (veya buna bir işaret ekleyebilirsin). ).
phils

3
Ayrıca, başlatma sırasında Emacs içindeki orijinal HOME'u geri yüklemeyi deneyebilirsiniz. Bunu denemedim, ama araştırmaya değer.
Phil,

1
@ phils: Ne önerdiğini denedim .
antonio

39

Birkaç .emacs.ddizini paralel olarak tutmak için kullandığım yol şudur.

  1. emacs şöyle başlar:

    alias emacs='emacs -q --load "/path/to/init.el"'
    
  2. Her init.eldosya user-init-fileve user-emacs-directorydeğişkenleri doğru şekilde ayarlamak için bu şekilde başlar :

    (setq user-init-file (or load-file-name (buffer-file-name)))
    (setq user-emacs-directory (file-name-directory user-init-file))
    

Bunun son aylarda çok güvenilir bir şekilde çalıştığını buldum. İşte birkaç açıklama:

  • emacs-init-timeyalnızca varsayılan sistem yapılandırmasını yüklemek için gereken süreyi bildiren ancak kendi init dosyanızın olmadığını bildiren sonları verir . Başlangıç ​​zamanınızı karşılaştırmakla ilgileniyorsanız, başka bir yolla yapmalısınız (örneğin elisp kodunun performansını nasıl ölçebilirim? ).

  • normal bir girişime eşdeğer değildir ve birkaç özel noktaya dikkat etmeniz gerekir. Özellikle:

    • after-init-hookinit dosyası yüklenmeden önce çalıştırılır .
    • *scratch*Tampon oluşturulduktan önce init dosyası yüklenir. Modunu açıkça değiştirmek zorunda kalacaksın (kullanmak yerine initial-major-mode).
    • Açıkça aramanız gerekir package-initialize; otomatik olarak yapılmayacak
  • yol için init.elkeyfi olarak seçilebilir; Özellikle, içinde init.elbulunduğu dizinin adlandırılması zorunlu değildir .emacs.d. Ben mesela sahip olmak için bu kullanmak .emacs.d.23yanında .emacs.d.24emacs'ın farklı sürümleri (iş yerinde kullanıyorum sistem passably modası geçmiş ve ben kullanan tüm makinelerde emacs 24 yüklenemez) arasında geçiş yapabilmek için.

  • Bu iş akışı, ortamları (ve özellikle HOMEenvvar'ı) değiştirmeyi gerektirmez ; bu, programları değiştirilmiş ortamdan etkilenebilecek emacs içinden çalıştırmanız istenebilir).


1
Bu, (etkin) normal --loadedisyon sırasını değiştirir, eğer ed dosyasının init dosyası olduğunu düşünüyorsanız. Başlangıç ​​olarak, bana normal (varsayılan) paket başlatma işlemi gerçekleşmeyecekmiş gibi görünüyor ve (sahte) init dosyası değerlendirilmeden önceafter-init-hook çalışacak . Bunlar, kesinlikle çalışabileceğiniz şeylerdir, ancak belirtilen dosyayı init dosyasıyla kullanan Emacs ile tamamen aynı olmadığını unutmayın.
phil:

2
@ phils evet, haklısınız. Bu gerçekten normal yürütme sırasını değiştirir ve normal bir init dosyası kullanmaya eşdeğer değildir. Yanıtınızı yansıtacak şekilde cevabımı düzenlemiştim after-init-hook. Ancak şunu söylemeliyim ki, bu tekniği her zaman kullanmama rağmen, hiçbir zaman bir sorunla karşılaşmadım after-init-hook(ama açıkça kullanmıyorum ve belki de kullandığım paketlerin ona güvenmediği için şanslıyım) . "Normal (varsayılan) paket başlatma gerçekleşmez" derken ne demek istiyorsunuz?
ffevotte

1
Bunu demek command-linearamayacağım package-initializebu durumda. Sahte init dosyasında elle çağırmanız gerekir.
phils 22

1
@ philips teşekkürler. Bunu cevaba ekledim, ilk ana modun da özel olarak ele alınması gerektiğini belirtti.
ffevotte

Bu mükemmel çalıştı .. Teşekkür ederim !!!
Stryker

15

Sen bağlayabilirsin ~/.emacs.d , yaptığım şey bu.

  1. Emac'larımın konfigürasyonunu ~/.emacs.dyönlendirmeye çalışın, yani bütün emac'lerle ilgili config dosyaları bu klasörde kalmalı

  2. Sonra ~/.emacs_configstüm config klasörlerinin (temelde init.elkonfigürasyonun geri kalanını içeren bir klasör ) yaşadığı bir klasörüm var , böylece kişisel config klasörüm olacak ~/emacs_configs/iqbal, bir ön dağıtım~/emacs_configs/prelude

  3. Kişisel emacs konfigürasyonumun çok başında user-emacs-directory, aşağıdakileri kullanarak config'imin tam yolunu ayarlarım.

    (setq user-emacs-directory (file-truename "~/.emacs.d/"))
    
  4. Sonra nihayet ~/.emacs.dkullanmak istediğim konfigürasyona bağlanıyorum , örneğin. yapılandırmamı kullanmak için yapacağım ln -s ~/emacs_configs/iqbal .emacs.d. Bir yapılandırma denemek istiyorsanız, yapılandırma klasörünü kopyalayın ~/emacs_configs/whatever_nameve bağlantıyı değiştirin

3. adımın avantajı, kişisel konfigürasyonumla başlatılan .emacs.demakların emacs çalışır durumdayken sembolik bağlantıyı değiştirmeme rağmen etkilenmeden çalışabilmesidir.

Başka bir avantajı, HOMEdış programların değişmemesidir. Emacs'ın etkileşim kurması gerekebilir.


1
Bu, birbirinden (setq user-emacs-directory (file-truename "~/.emacs.d/"))etkilenmeden çalışabilmeleri için tüm ayrı emacs yapılandırmalarını ayarlayabileceğimiz anlamına mı geliyor ?
user1011471

1
Teoride evet, fakat pratikte ~/.emacs.dkullanmak yerine yolu zorlaştıran bazı kütüphaneler olabilir user-emacs-directory. En azından böyle bir kütüphaneye rastladım ama ne yazık ki adını hatırlayamıyorum.
Iqbal Ansari


5

Bu temiz çözümü EmacsWiki'den buldum :

emacs -q -l ~/my-init-file.el

(tam olarak özel bir dizin kullanmıyor, ama yine de tek bir giriş dosyasına sahip olduğunuz için iyi çalışıyor)


Bilginize, bu @Francesco tarafından 2 yıl önce yapılan bir yorum ile gereksizdir.
Bryce,


3

İnit dosyanızı yüklemeden önce var ayarlarınızı yapın:

emacs -q --eval '(setq alt-conf t)' --load ~/.emacs

Ardından, init dosyanızda (bu durumda ~/.emacs):

(defvar alt-conf nil)

(if alt-conf
    (let ((default-directory "~/src/elisp-test/"))
      (normal-top-level-add-subdirs-to-load-path)
      (various-alt-config-stuff)
      (message "Alternate conf"))
  (message "Regular conf"))

Çok zarif, en sevdiğim sistem, çünkü her şey olması gerektiği gibi Emacs'ın alanında kalıyor. Teşekkür ederim.
gsl

1

@Phils kullanıcısının yanıtını genişleterek testrun.shyeni emacs config'umu test etmek için bu küçük kabuk betiğini (çağrılmış ) yaptım. Bu, diğer durumlarda da (örneğin init.el'inizdeki emakları kırabilecek değişiklikleri test ederken) yapmak mantıklı gelebilir.

#!/bin/bash

cd $(dirname "${BASH_SOURCE[0]}")
[ -d .testrun ] || mkdir .testrun
cd .testrun
[ -h .emacs.d ] || ln -s .. .emacs.d

env HOME=`pwd` emacs

rm .emacs.d
cd ..
rm -rf .testrun

1

@ Phil'in HOMEçevre değişkenini değiştirme ve ardından Emacs içinde geri yükleme hakkındaki cevabı ve yorumu üzerine kurulu küçük bir senaryo .

#!/bin/bash

# Use it like this:
#   /path/to/this/script  EMACS_USER_DIRECTORY  [OTHER EMACS ARGS]

# You can never be too careful
set -e

# First arg = emacs user directory
#   (get a canonical, absolute path)
EMACS_USER_DIRECTORY=$(readlink -f "$1")
shift
if [ ! -d "${EMACS_USER_DIRECTORY}" ]; then
    echo "Non-existent directory: '${EMACS_USER_DIRECTORY}'"
    exit 1
fi

# Bootstrap directory
BOOTSTRAP=$(mktemp --directory --tmpdir .emacs-bootstrap.XXXXXX)
mkdir "${BOOTSTRAP}/.emacs.d"

# Bootstrap init file
cat >"${BOOTSTRAP}/.emacs.d/init.el" <<EOF
  ;; # Correctly set-up emacs-user-directory
  (setq user-emacs-directory "${EMACS_USER_DIRECTORY}/")
  (setq user-init-file (concat user-emacs-directory "init.el"))

  ;; # Reset the HOME environment variable
  (setenv "HOME" "${HOME}")

  ;; # Load the real init file and clean-up afterwards
  (unwind-protect (load user-init-file)
    (delete-directory "${BOOTSTRAP}" :recursive))
EOF

# Forward remaining arguments to emacs
exec env HOME="${BOOTSTRAP}" emacs "$@"

1

Kullanım durumu, bir linux makinesinin tüm kullanıcıları arasında tek bir emac yapılandırması ".emacs.d" dizini paylaşıyorsa, bu çözüm https://emacs.stackexchange.com/a/4258/5488 çoğu durumda işe yarayabilir, ancak bazı durumlarda emacs geçici dosyaları user-emacs dizinine (.ido.last dosyası gibi) yazmaya çalışır. Bu gibi durumlarda paylaşılan yapılandırma dizini tüm kullanıcılara yazma iznine sahipse çalışacaktır ancak her sistem kullanıcısı geçici dosyaları depolamak için aynı dizini paylaşmak istemeyebileceğinden çözüm istenmeyebilir. Bu durumda, aşağıdaki çözüm daha iyi bir seçenek olacaktır.

Ortak paylaşılan yapılandırma dosyası .emacs.d / init.el ile başlamalıdır

;; should come before calling package-initialize as it will populate
;; everything under common config "~/.emacs.d/elpa"
(setq user-init-file (or load-file-name (buffer-file-name)))
(setq package-user-dir (concat (file-name-directory user-init-file) "elpa"))

(package-initialize)

Paylaşılan yapılandırma .emacs.d'nin tüm kullanıcılar için okuma iznine sahip olmasını sağlayın (yazma izniniz olması gerekmez)

another_user $ emacs -q --load /path/to/shared/config/.emacs.d/init.el

Her kullanıcının kendi "~ / .emacs.d /" dizini olur, ancak yalnızca geçici dosyaları kaydetmek için kullanılır, ancak paketleri ve diğer config paylaşılan yapılandırma dizininden yüklenir.

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.