2011-06-20 19 views
11

Bazı komutları çalıştırmak için $PATH Emacs'te kullanmam gerekir. Emacs'i nasıl kullanabilirim? Emacs'i Ubuntu depolarından kurdum.Emacs, .bashrc dosyasını nasıl kullanır?

+0

http://stackoverflow.com/questions/1393400/commands-from-bashrc-not-available-in-emacs –

+0

[Bu yanıt] (https://emacs.stackexchange.com/a/29120/8849) mükemmel bir çözünürlük gibi görünüyor. –

cevap

29

İşte benim GUI Emacs hep bir kabuk içine girmek aynı $PATH görür sağlamak için bir hile I use var: OS X,

(defun set-exec-path-from-shell-PATH() 
    (let ((path-from-shell (replace-regexp-in-string 
          "[ \t\n]*$" 
          "" 
          (shell-command-to-string "$SHELL --login -i -c 'echo $PATH'")))) 
    (setenv "PATH" path-from-shell) 
    (setq eshell-path-env path-from-shell) ; for eshell users 
    (setq exec-path (split-string path-from-shell path-separator)))) 

(when window-system (set-exec-path-from-shell-PATH)) 

Özellikle, bir grafik Emacs kullanıcının kabuk tanımını almak olmaz $PATH, bu yüzden bu hile bana bu platformda yardımcı olur.

Güncelleme: Bu kod artık exec-path-from-shell adında bir elisp kitaplığı olarak yayımlandı ve yüklenebilir paketler MELPA adresinde bulunmaktadır. Ayrıca GUI uygulamalar için bu dosyadaki yolunu ayarlayabilirsiniz böylece

+0

Bu aynı sorunu 13.04 ubuntu'da giderir (paket yöneticisi yüklemesini kullandım) – Anake

+0

Takma adlar kullanmıyor gibi görünüyor. Ancak isimden dolayı bunu beklemezdim. Normal bash takmalarını almak için bir şey var mı? – Zelphir

+0

Emacs, bash takma adlarınızı asla kullanmaz, özür dileriz: bunlar sadece bash oturumlarında kullanılabilir. Bu kod ve exec-path-from-shell paketi, Emacs'in bash oturumlarınızda görünen aynı yürütülebilir dosyaları ve komut dosyalarını güvenilir bir şekilde bulmasına izin verir. – sanityinc

0

$PATH terminalinden, emacs'ı başlattığınız terminalde ayarlanmışsa, sistem komutlarını M-! <your command> RET komutuyla çalıştırabilirsiniz.

1

Eğer env varsınız alınmazsa, emacs'ın başlatılmasından dolayı olabilir. Menüyü kontrol edin veya neyse ve emacs'u bash -c emacs olarak değiştirmeyi deneyin.

1

Sen Ubuntu gibi

# /etc/profile.d/path.sh 
export PATH="$PATH:/usr/local" 

/etc/profile.d yolu ayarlarını ekleyebilir, ben tüm oturumlar kaynağını senin ~/.xsessionrc hatırlıyorum.

1

Benim .bash_profile kaynak için benzer bir şey ile geldi. Sadece PATH ile ilgileniyorsanız, yukarıdaki diğer cevaplardan biri daha basittir.

source ~/.bash_profile ; echo post-env; env dosyasını yürüterek, ardından "post-env" önce her şeyi atarak ve ardından "env" komutunun yazdırdığı "anahtar = değer" biçimindeki değerleri ayrıştırarak çalışır.

Muhtemelen her durumu mükemmel bir şekilde ele almıyor, ama benim için yeterince iyi çalışıyor. -

;;------------------------------------------------------- 
;; begin sourcing of .bash_profile 

;; only do this on Mac OS X 
(when (string= system-type "darwin") 
    ;; require common lisp extensions, for search 
    (require 'cl) 


    (defun src-shell-unescape (string) 
    ;; replace \n \t \r \b \a \v \\ 
    ;; and octal escapes of the form \0nn 

    (replace-regexp-in-string 
    "\\\\\\([ntrbav]\\|\\(\\\\\\)\\|\\(0[0-7][0-7]\\)\\)" 
    (lambda (str) 
     ;; interpret octal expressions 
     ;; of the form "\0nn" 
     (let ((char1 (aref str 1))) 
    (cond ((= ?0 (aref str 1)) 
     (byte-to-string 
     (+ (* (- (aref str 2) ?0) 8) 
      (- (aref str 3) ?0)))) 
      ((eq char1 ?n) "\n") 
      ((eq char1 ?t) "\t") 
      ((eq char1 ?r) "\r") 
      ((eq char1 ?b) "\b") 
      ((eq char1 ?a) "\a") 
      ((eq char1 ?v) "\v") 
      ((eq char1 ?\\) "\\\\") 
      (t "")))) string)) 

    (defun src-set-environment-from-env-output(env-output) 
    ;; set the environment from shell's "env" output 
    (let ((lines (split-string env-output "\n" t))) 
     (dolist (line lines) 
    (let ((idx-equals (search "=" line))) 
     (when (and (not (eq idx-equals nil)) 
      (> idx-equals 1)) 
     (let ((key (substring line 0 idx-equals)) 
      (value (substring line (+ idx-equals 1)))) 
      (setenv key (src-shell-unescape value)) 
      ;; (message "%s = %s" key value) 
     )))))) 

    (defun src-source-shell-file (file-name) 
    ;; if your shell is sh rather than bash, the "source " may need 
    ;; to be ". " instead 
    (let* ((command (concat "source '" file-name "'; echo 'post-env'; env")) 
     (output (shell-command-to-string command)) 
     (idx-post-env (search "post-env" output))) 
     (if (eq nil idx-post-env) 
     (message "Didn't find expected output after sourcing %s. Found: %s" file-name output) 
    (let ((trimmed-output (substring output idx-post-env))) 
     ;; (message "trimmed-output: %s" trimmed-output) 
     (src-set-environment-from-env-output trimmed-output))))) 



    (src-source-shell-file (expand-file-name "~/.bash_profile"))) 


;; end sourcing of .bash_profile 
;;------------------------------------------------------- 
1

Daha genel bir çözüm https://stackoverflow.com/a/12229404/1190077 verilmiştir (sadece PATH tüm değişkenleri ve diğer adlar ayarlamak için) tuşuna ayarlamaktır: varsayılan "-c" (yürütmek geçersiz kılar

(setq shell-command-switch "-ic") 

aşağıdaki komutu). "-i" eklenmesi, bas kabuğu, ~/.bashrc kaynağına götüren etkileşimli moda zorlar.