exec-path ve $ PATH


28

Çevrimiçi olarak insanların Emacs'taki varsayılan yola yol eklediği örnekleri gördüm:

(add-to-list 'exec-path "/usr/local/bin/")

Elisp için yeniyim ve yukarıdaki ifadenin ne yaptığını anladığımı düşünüyorum, ancak birkaç sorum var:

  • Gelen hangi sırayla Emacs yürütme yolları arasında arama geliyor? Örneğin, $PATH(env. Değişkeni) değerini hiç düşünüyor mu (ve eğer öyleyse, önce exec-pathmi , sonra mı?)

  • Böyle birden fazla yolu nasıl hazırlayabilirim ? Onları birleştirmeye devam edebilir miyim? Örneğin

    (add-to-list 'exec-path "PATH1", "PATH2")
    

    ya da yapmalı mıyım:

    (add-to-list 'exec-path "PATH1:PATH2:PATH3") 
    

Bu ilginç paketi GitHub'da da buldum: exec-path-from-shell . Bunun için bir pakete neden ihtiyaç var?

Motivasyon

Hiç bir komutun kabuğunuzda çalıştığını ama Emacs'ta olmadığını gördünüz mü?

Bu, OS X'de çok olur, burada bir Emacs örneği GUI'den başlatılır, varsayılan bir ortam değişkenleri devralınır.

Bu kütüphane çalışması, önemli çevre değişkenlerini kullanıcının kabuğundan kopyalayarak bu sorunu çözer: Kabuğunuzdan ilgilenilen değişkenleri yazdırmasını ve ardından bunları Emacs ortamına kopyalamasını isteyerek çalışır.


3
Emacs ve Elisp'e Hoşgeldiniz! Ben konuyla kendim hala çok iyiyim ve sorularınızın cevaplarını bilmiyorum, ama hayatı çok daha kolay hale getiren bir şeyden bahsedeceğimi düşündüm: açıklama işlevleri. örneğin (describe-function 'add-to-list)( C-h f) add-to-listfonksiyon için dokümanı ve kaynağa bağları verir. Ayrıca (describe-variable 'exec-path)( C-h v) var. Bu bir RTFM yorumu olması anlamına gelmez - bu dokümanlar listelediğiniz tüm sorulara cevap vermez, sadece yararlı bir şeydir.
jtmoulia

Teşekkürler @jtmoulia! Bunu gelecekteki sorular için kesinlikle aklımda tutacağım.
Amelio Vazquez-Reina,

Ek olarak C-h v exec-path, el kitaplarını (Emacs ve Elisp) kullanın. Bir el kitabında, i exec-pathsizi yararlı bir açıklamaya yönlendirir. Önce Emacs'a sor - yaptığın için üzgün olmayacaksın.
Drew

Yanıtlar:


23

1) PATHveexec-path

Emacs başlangıçtaki exec-pathdeğerinden belirlenir PATH, ancak daha sonra tekrar bakmaz. Ancak bir komut çalıştırırsanız, miras alır PATH, öyle olmaz exec-path, böylece alt işlemler Emacs'ınkinden farklı komutlar bulabilir.

Francesco'nun dediği gibi, bunun doğrudan kafa karıştırıcı olabileceği shell-commandgibi, doğrudan bir işlem yürütmüyor, ancak onu çalıştırmak için kullanacak PATH, kullanmayacak bir kabuk çağırıyor exec-path.

2) Birden çok yol eklemek exec-path

Sadece add-to-listtekrar tekrar arayın :

(add-to-list 'exec-path "PATH1")
(add-to-list 'exec-path "PATH2")

add-to-listListenin başına eklendiğine dikkat edin, bu daha öncede "PATH2"olmanızla sonuçlanacaktır .exec-path"PATH1"

Listelere daha fazla "düşük seviye" erişimi de kullanabilirsiniz:

(setq exec-path (append '("PATH1" "PATH2")
                        exec-path))

Bu , sırasıyla "PATH1"ve "PATH2"sizin için ekleyecektir exec-path.

3) Mac OS 'PATH

Mac OS X'teki sorun, Mac OS'un bir programı genel kullanıcı arabiriminden veya kabuktan çağırdığınızda ortamı aynı şekilde ayarlamamasıdır. Bu, Emacs'i bir kabuktan çalıştırmanın, bulucudan çalıştırdığınızdan farklı ortam değişkenlerinin ayarlanmasıyla sonuçlanacağı anlamına gelir. Bu, ortam değişkenlerini .bashrc"global" Emac'leri etkilemeyeceği için ya da benzeri olarak ayarlarsanız, can sıkıcı bir durumdur .

Paket, görünüşe göre bir kabuk başlatır ve oradan ortam değişkenlerini içe aktarır; bu da küresel olarak başlatılmış bir Emacs'ta bir kabuktan aldığınız ortamı taklit eder.


Sağol Jorgen. S3 ile ilgili: PATHGlobal UI'den (masaüstü ortamı) başlatılan programlar için varsayılanın nerede tanımlandığını biliyor musunuz ? Ben aynı sorunu yaşıyorum PYTHONPATHiçinde elpy:). Emacs'ı masaüstünden başlattığımda, Emacs dosyamdaki PYTHONPATHtanımlarımın .zshenv(init dosyası için zsh) farkında değil , bu çok sinir bozucu, çünkü elpyPython paketleri nerede bulacağımı bilmiyor. Bu PYTHONPATHtanımları farklı bir kabuk initdosyasına taşımaktan mutluyum (her ne kadar ideal olarak Emacs'ın tanımları kullanmasını isterim .zshenv)
Amelio Vazquez-Reina

Korkarım Mac OS X hakkında fazla bir şey bilmiyorum. Hızlı bir google stackoverflow.com/questions/135688/… 'a gitmem için beni zorladı ki bu, launchd.conf' un doğru yer olduğunu gösteriyor. Sen, elbette sadece ikisi ayarlayabilirsiniz Emacs olduğu için bu gerekli tüm ederse exec-pathve PATHöğenize .emacs. PATHKullanarak ayarlayabilirsiniz (setenv "PATH" (format "%s:%s" "/new/path/element" (getenv "PATH"))).
Jorgen Schäfer

Teşekkürler. Aşağıdaki Q OP'sinden biraz ayrıldığı ancak Emacs belirtmek için herhangi bir yolu var olduğunu biliyorum PYTHONPATHo elpykullanmalıyım?
Amelio Vazquez-Reina

process-environmentÖrneğin, kullanarak değiştirebilirsiniz setenv. Bunu içinde yapabilirsiniz elpy-mode-hook, ancak bir globsl değişkenidir ve onu tampon-yerel yapmak kolayca kafa karıştırıcı davranışlara yol açabilir.
Jorgen Schäfer

9

Emacs, call-processveya gibi ilkel işlevleri kullanan yeni bir harici işlemi başlattığında start-process, yürütülebilir dosya aranır exec-path(değil $PATH)

Ancak, gibi bir işlev shell-commandkabuğu bir alt işlem olarak başlatır ve çalıştırmak istediğiniz komutu iletir. Bu komutu yürütmek için, kabuk sonra yürütülebilir in bulmaya çalışacağız $PATH(ve de exec-path).

Bu nedenle, exec-pathemacs tarafından başlatılan harici işlemler için en önemli olan $PATHşeydir ; oysa , kendinizi daha yüksek düzeyde bir işlevle çalıştırdığınız komutlar için geçerli olan şeydir ( M-!örneğin)


Birden çok dizin eklemek istiyorsanız, birden çok kez exec-pathkullanmanız gerekir add-to-list.

El ile de yapabilirsiniz

(add-to-list 'exec-path "dir1")
(add-to-list 'exec-path "dir2")

veya bir döngü kullanarak

(dolist (dir '("dir1" "dir2"))
  (add-to-list 'exec-path dir))

Üçüncü sorunuzla ilgili olarak, eğer emacs masaüstü ortamından başlatıldıysa, çevreyi tam bir kabuğunkinden daha az tam olabilen miras alır.

Bu, bazen $PATHnormal bir kabuğun gördüğü şeyi kullanmak için Emacs'in değerini tamamlamanın gerekli olabileceği anlamına gelir . exec-path-from-shellBahsettiğiniz kütüphanenin amacı budur .

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.