Pracuję nad niestandardową i małą konfiguracją Emacsa, którą chcę udostępnić niektórym znajomym jako repozytorium git, aby mogli oni używać ich jako podstawy dla własnych przyszłych konfiguracji.
W tym celu potrzebuję sposobu na przetestowanie mojej konfiguracji, a najprostszym rozwiązaniem, jakie mogę wymyślić, jest:
$ emacs --eval "(setq user-emacs-directory \"~/Code/my_custom_emacs.d/\")"
Ale nie mogę sprawić, żeby działało.
Każda pomoc bardzo doceniana.
.emacs.d
katalogiem, chyba że zmienisz HOME, co wydaje mi się problematyczne. Ludzie przedstawili poniższe obejścia, ale dla mnie to brzmi jak bardzo rozsądna prośba o funkcje dla samego Emacsa.wontfix
i zamknięte w module do śledzenia błędów.Odpowiedzi:
Podstawowym podejściem, którego używam do tego jest modyfikacja
$HOME
, uruchamiając:Następnie użyj
/path/to/dir/.emacs.d
Możesz również dowiązać dowolne pliki lub katalogi ważne w tym fałszywym katalogu domowym z powrotem do prawdziwych, aby Emacs je zobaczył.
źródło
Sposób, w jaki używam do obsługi kilku
.emacs.d
katalogów równolegle, jest następujący.emacs jest uruchamiany w następujący sposób:
Każdy
init.el
plik zaczyna się w ten sposób, aby poprawnie skonfigurować zmienneuser-init-file
iuser-emacs-directory
:Przekonałem się, że działa to bardzo niezawodnie w ciągu ostatnich miesięcy. Oto kilka uwag:
psuje się
emacs-init-time
, co zgłasza tylko czas potrzebny do załadowania domyślnej konfiguracji systemu, ale nie twój własny plik init. Jeśli chcesz sprawdzić czas inicjalizacji, musisz to zrobić w inny sposób (zobacz na przykład Jak zmierzyć wydajność kodu elisp? ).nie jest to odpowiednik normalnego startu i musisz zadbać o kilka konkretnych punktów. W szczególności:
after-init-hook
jest uruchamiany przed załadowaniem pliku init.*scratch*
Bufor jest tworzony przed plik init załadowany. Musisz jawnie zmienić jego tryb (zamiast używaćinitial-major-mode
).package-initialize
; nie będzie to zrobione automatycznieścieżka, którą
init.el
można dowolnie wybrać; w szczególności katalog, w którym sięinit.el
znajduje, nie musi być nazwany.emacs.d
. Używam tego, aby mieć na przykład.emacs.d.23
obok.emacs.d.24
, aby móc przełączać się między różnymi wersjami emacsa (system, którego używam w pracy, jest dość przestarzały i nie mogę zainstalować emacsa 24 na wszystkich komputerach, których używam).ten przepływ pracy nie wymaga modyfikowania środowiska (a zwłaszcza środowiska
HOME
envvar), co może być pożądane, jeśli uruchamiasz programy z poziomu emacsa, na które zmodyfikowane środowisko może mieć wpływ).źródło
--load
plik ed jako plik init. Na początek wydaje mi się, że normalna (domyślna) inicjalizacja pakietu nie nastąpi iafter-init-hook
będzie działać przed oceną (fałszywego) pliku inicjującego. Są to rzeczy, które możesz obejść, z pewnością, ale pamiętaj, że nie jest to dokładnie to samo, co Emacs używający określonej ścieżki jako pliku init.after-init-hook
. Ale muszę powiedzieć, że chociaż używam tej techniki przez cały czas, nigdy nie spotkałem się z żadnym problememafter-init-hook
(ale nie używam jej jawnie i być może mam szczęście, że pakiety, których używam, nie polegają na niej) . Co rozumiesz przez „normalną (domyślną) inicjalizację pakietu nie nastąpi”?command-line
nie zadzwonipackage-initialize
w tej sytuacji. Będziesz musiał wywołać go ręcznie w fałszywym pliku inicjującym.Możesz linkować
~/.emacs.d
, to właśnie robięStaraj się, aby moja konfiguracja emacsa była
~/.emacs.d
zorientowana, tzn. Wszystkie pliki konfiguracyjne związane z emacsem powinny znajdować się w tym folderzeNastępnie mam
~/.emacs_configs
folder, w którym wszystkie foldery konfiguracji (w zasadzie folder zinit.el
resztą konfiguracji) są aktywne, więc mój osobisty folder konfiguracji będzie~/emacs_configs/iqbal
, dystrybucja preludium będzie w~/emacs_configs/prelude
Bardzo wcześnie w mojej osobistej konfiguracji emacsa ustawiłem
user-emacs-directory
pełną ścieżkę do mojej konfiguracji, używając następujących poleceńNastępnie w końcu dowiązuję symbolicznie
~/.emacs.d
do konfiguracji, której faktycznie chcę użyć, np. aby użyć mojej konfiguracji zrobięln -s ~/emacs_configs/iqbal .emacs.d
. Jeśli chcesz wypróbować jakąś konfigurację, po prostu skopiuj folder konfiguracji~/emacs_configs/whatever_name
i zmień dowiązanie symboliczneZaletą trzeciego kroku jest to, że emacs rozpoczęty w mojej osobistej konfiguracji może działać bez zmian, nawet jeśli zmienię
.emacs.d
dowiązanie symboliczne podczas działania emacsa.Kolejną zaletą jest to, że
HOME
nie ulegają zmianie programy zewnętrzne, z którymi emacs może potrzebować interakcji, pozostają niezmienioneźródło
(setq user-emacs-directory (file-truename "~/.emacs.d/"))
wszystkie mogły działać jednocześnie bez zmian?~/.emacs.d
raczej kodują ścieżkę niż używająuser-emacs-directory
. Natrafiłem na przynajmniej jedną taką bibliotekę, ale niestety nie pamiętam nazwy.Konfiguracja, która się nie zmienia
HOME
lub działa z dowiązaniami symbolicznymi, można znaleźć w mojej odpowiedzi https://emacs.stackexchange.com/a/20508/934 . W tej konfiguracji możesz zmienićuser-emacs-directory
, ustawiając zmienną środowiskową:i to nawet działa z demonem.
źródło
Znalazłem to fajne rozwiązanie od EmacsWiki :
(nie do końca używasz niestandardowego katalogu, ale działa dobrze, ponieważ najprawdopodobniej i tak masz plik pojedynczego wpisu)
źródło
Łatka, która pozwala określić lokalizację .emacs.d za pomocą zmiennej środowiskowej `EMACS_USER_DIRECTORY ', jest dostępna na https://debbugs.gnu.org/cgi/bugreport.cgi?bug=15539, ale nie została jeszcze scalona.
źródło
Ustaw swój var przed załadowaniem pliku init:
Następnie w pliku inicjującym (w tym przypadku
~/.emacs
):źródło
Rozwijając odpowiedź z @phils, stworzyłem ten mały skrypt powłoki (wywoływany
testrun.sh
) do testowania mojej nowej konfiguracji emacsa. Może to mieć sens również w innych przypadkach (na przykład podczas testowania zmian w pliku init.el, które mogą uszkodzić emacsa).źródło
Oto mały skrypt oparty na odpowiedzi i komentarzu @ Phila na temat zmiany
HOME
zmiennej środowiskowej, a następnie przywrócenia jej w Emacsie.źródło
Jeśli przypadek użycia polega na współużytkowaniu katalogu pojedynczego emacsa „.emacs.d” dla wszystkich użytkowników komputera z systemem Linux, to rozwiązanie https://emacs.stackexchange.com/a/4258/5488 działałoby w większości przypadków, ale w niektórych przypadki emacs próbuje zapisać pliki tymczasowe w katalogu emacs użytkownika (np. plik .ido.last). W takich przypadkach, jeśli udostępniony katalog konfiguracji ma uprawnienia do zapisu dla wszystkich użytkowników, będzie działać, ale może nie być pożądanym rozwiązaniem, ponieważ każdy użytkownik systemu może nie chcieć udostępniać tego samego katalogu do przechowywania plików tymczasowych. W takim przypadku lepszym rozwiązaniem będzie poniższe rozwiązanie.
Wspólny udostępniony plik konfiguracyjny .emacs.d / init.el powinien zaczynać się od
Upewnij się, że udostępniona konfiguracja .emacs.d ma uprawnienia do odczytu dla wszystkich użytkowników (nie muszą mieć uprawnień do zapisu)
Każdy użytkownik będzie miał swój własny katalog „~ / .emacs.d /”, ale służy tylko do zapisywania plików tymczasowych, ale pakiety i inna konfiguracja są ładowane z udostępnionego katalogu konfiguracji.
źródło