Widziałem przykłady online, w których ludzie dodają ścieżki do domyślnej ścieżki w Emacsie za pomocą:
(add-to-list 'exec-path "/usr/local/bin/")
Jestem nowy w Elisp i myślę, że rozumiem, co robi powyższe stwierdzenie, ale mam kilka pytań:
W jakiej kolejności Emacs przeszukuje ścieżki wykonania? Na przykład, czy w ogóle bierze pod uwagę wartość
$PATH
(zmiennej środowiskowej) (a jeśli tak, przed czy poexec-path
?)Jak mogę wstawić wiele takich ścieżek? Czy mogę je po prostu łączyć? na przykład
(add-to-list 'exec-path "PATH1", "PATH2")
czy powinienem zrobić:
(add-to-list 'exec-path "PATH1:PATH2:PATH3")
Znalazłem też ten interesujący pakiet na GitHub: exec-path-from-shell . Dlaczego potrzebny jest pakiet do tego?
Motywacja
Czy kiedykolwiek odkryłeś, że polecenie działa w twojej powłoce, ale nie w Emacsie?
Zdarza się to często w OS X, gdzie instancja Emacsa uruchomiona z GUI dziedziczy domyślny zestaw zmiennych środowiskowych.
Ta biblioteka działa rozwiązuje ten problem, kopiując ważne zmienne środowiskowe z powłoki użytkownika: działa, prosząc powłokę o wydrukowanie interesujących zmiennych, a następnie kopiując je do środowiska Emacsa.
(describe-function 'add-to-list)
(C-h f
) poda ci dokumentadd-to-list
funkcji, a także linki do źródła. Jest też(describe-variable 'exec-path)
(C-h v
). To nie ma być komentarz RTFM - te dokumenty nie odpowiadają na wszystkie pytania, które wymieniłeś, tylko coś przydatnego.C-h v exec-path
skorzystaj z instrukcji obsługi (Emacs i Elisp). W podręcznikui exec-path
zawiera pomocne wyjaśnienie. Najpierw zapytaj Emacsa - nie będziesz żałował, że tak zrobiłeś.Odpowiedzi:
1)
PATH
iexec-path
Emacs ustawia
exec-path
na podstawie wartościPATH
przy uruchomieniu, ale nie będzie na to patrzeć później. Ale jeśli uruchomisz polecenie, nie odziedziczyPATH
onoexec-path
, więc podprocesy mogą znaleźć inne polecenia niż Emacs.Jak mówi Francesco, może to być szczególnie mylące
shell-command
, ponieważ nie uruchamia to bezpośrednio procesu, ale wywołuje powłokę, aby go uruchomić, aPATH
nieexec-path
.2) Dodanie wielu ścieżek do
exec-path
Wystarczy dzwonić
add-to-list
wielokrotnie:Zauważ, że
add-to-list
dodaje się na początku listy, więc skończy się"PATH2"
to naexec-path
wcześniejszym"PATH1"
.Możesz także skorzystać z większego „niskiego poziomu” dostępu do list:
To doda
"PATH1"
i"PATH2"
do twojegoexec-path
, w tej kolejności.3) ŚCIEŻKA Mac OS
Problem w Mac OS X polega na tym, że Mac OS nie ustawia środowiska tak samo, gdy wywołujesz program z globalnego interfejsu użytkownika lub gdy wywołujesz go z powłoki. Oznacza to, że uruchomienie Emacsa z powłoki spowoduje ustawienie różnych zmiennych środowiskowych niż podczas uruchamiania z wyszukiwarki. Jest to szczególnie denerwujące, jeśli ustawisz zmienne środowiskowe w
.bashrc
lub podobne, ponieważ nie wpłynie to na „globalny” Emacs.Pakiet najwyraźniej uruchamia powłokę i stamtąd importuje zmienne środowiskowe, naśladując środowisko, które otrzymujesz z powłoki w uruchomionym globalnie Emacsie.
źródło
PATH
jest zdefiniowane ustawienie domyślne programów uruchamianych z globalnego interfejsu użytkownika (środowisko pulpitu)? Mam ten sam problem zPYTHONPATH
welpy
:). Kiedy uruchamiam Emacsa z pulpitu, Emacs nie wie o moichPYTHONPATH
definicjach w moim.zshenv
pliku (pliku init dlazsh
), co jest bardzo frustrujące, ponieważelpy
nie wie, gdzie mogę znaleźć moje pakiety Pythona. Z przyjemnością przenoszę tePYTHONPATH
definicje do innegoinit
pliku powłoki (chociaż idealnie chciałbym, aby Emacs używał definicji z mojego.zshenv
)exec-path
iwPATH
swoim.emacs
. Możesz ustawićPATH
za pomocą(setenv "PATH" (format "%s:%s" "/new/path/element" (getenv "PATH")))
.PYTHONPATH
któryelpy
powinien użyć?process-environment
, na przykład używającsetenv
. Możesz to zrobićelpy-mode-hook
wewnątrz, ale jest to zmienna globsl, a ustawienie jej na bufor lokalny może łatwo prowadzić do mylących zachowań.Kiedy emacs uruchamia nowy proces zewnętrzny przy użyciu prymitywnych funkcji, takich jak
call-process
lubstart-process
, plik wykonywalny jest przeszukiwanyexec-path
(a nie$PATH
)Jednak funkcja taka jak
shell-command
uruchamia powłokę jako podproces i przekazuje polecenie, które chcesz uruchomić. Aby wykonać to polecenie, powłoka spróbuje znaleźć plik wykonywalny w$PATH
(a nie wexec-path
).Dlatego
exec-path
to, co najbardziej liczy się dla procesów zewnętrznych, które są uruchamiane przez samego emacsa, podczas gdy$PATH
to, co liczy się dla poleceń uruchamianych za pomocą funkcji wyższego poziomu (używając M-!na przykład)Jeśli chcesz dodać wiele katalogów
exec-path
, powinieneś użyć ichadd-to-list
wiele razy.Możesz to zrobić ręcznie
lub za pomocą pętli
Jeśli chodzi o twoje trzecie pytanie, jeśli emacs został uruchomiony ze środowiska graficznego, dziedziczy po nim środowisko, które może być mniej kompletne niż środowisko pełnej powłoki.
Oznacza to, że czasami konieczne może być uzupełnienie wartości Emacsa za
$PATH
użycie tego, co widzi zwykła powłoka. Taki jest cel wspomnianejexec-path-from-shell
biblioteki.źródło