Làm cách nào để thiết bị đầu cuối / vỏ sinh ra bên trong Emacs chạy trên máy Mac thừa hưởng các biến môi trường của thiết bị đầu cuối gốc?


7

Thiết bị đầu cuối tự nhiên trên Mac tức là sinh ra thông qua Spotlight hoặc Launchpad, thông qua các biến môi trường mong muốn bao gồm tùy chỉnh trong ~/.bash_profile. Nhưng khi tôi chạy Emacs ( Emacs.applấy từ Emacs Đối với Mac OS X ) và vỏ spawn bên trong nó (sử dụng một trong hai shell, eshellhoặc term), vỏ không áp dụng các biến môi trường tương tự như đã đề cập trước đó.

Tôi nhận ra rằng shell chấp nhận môi trường của nó từ quá trình khởi chạy nó và chính vì điều này mà các giá trị của môi trường shell thay đổi giống như của Emac (ví dụ (getenv "PATH"))

Mạo hiểm bên trong nội dung Terminal.appEmacs.appkhông làm tôi may mắn.

Làm thế nào tôi có thể tự động nhận được cùng một biến môi trường mà tôi nhận được Terminal.apptrong trình bao sinh ra bên trong Emacs? Và tôi không thích khởi chạy Emacs từ thiết bị đầu cuối.

(Tôi nhận ra rằng đây là quá MacOSX-ish và câu trả lời có thể đề xuất các giải pháp / chỉnh sửa hoàn toàn bên ngoài Emacs. Nhưng câu hỏi liên quan đến Emacs do đó tôi đã chọn trang web này)


Nếu bạn khởi động Emacs.app từ cửa sổ Terminal, bạn có thấy các biến môi trường chính xác không?
Melioratus

Bằng cách đó, các biến môi trường phong phú hơn nhưng không giống với biến trong thiết bị đầu cuối mà nó được khởi chạy. Các tùy chỉnh (bí danh, v.v.) trong ~ / .bash_profile không được đọc. @Melioratus
Chảy máu ngón tay

1
Kỳ dị. My ~/.bash_profileđược đọc chính xác khi tôi thực hiện Emacs.appnhư thế này /Applications/Emacs.app/Contents/MacOS/Emacs . &bằng cách sử dụng Terminal.app.
Melioratus

Chỉ cần kiểm tra lại rằng bí danh của tôi cũng hoạt động.
Melioratus

Câu trả lời:


5

Gần đây tôi đã bắt đầu sử dụng emacs bên ngoài thiết bị đầu cuối gây ra cho tôi một số vấn đề về PATH. Tôi đã thử thiết lập nó bằng cách thêm (getenv "PATH")vào đường thực thi của mình, trong số những thứ khác mà cuối cùng không bao giờ hoạt động.

Tôi đã kết thúc việc cài đặt gói exec-path-from-shell thông qua melpa. Nó hoạt động bằng cách sử dụng $SHELLbiến môi trường của bạn để yêu cầu trình bao của bạn in ra $PATHvà sao chép kết quả.

Chỉnh sửa: Đây là mã tôi sử dụng

;; I set this at the beginning of my init.el for other mac specific settings
(defconst *is-a-mac* (eq system-type 'darwin))

;; Later on, after loading exec-path-from-shell package
(if *is-a-mac*
    (add-hook 'after-init-hook 'exec-path-from-shell-initialize))

1
Hãy mô tả làm thế nào câu trả lời này trả lời câu hỏi. Ví dụ, cách cài đặt gói đó giúp gì?
vẽ

3

Với tiêu đề thực tế ở đây "Làm thế nào để thiết bị đầu cuối / vỏ sinh ra bên trong Emacs chạy trên máy Mac thừa hưởng các biến môi trường của thiết bị đầu cuối gốc?" bạn không thể vì Emacs sẽ không có Terminal.app như một siêu tiến trình ở mọi cấp độ vì vậy Emacs không thể kế thừa bất cứ thứ gì tạo thành vỏ trong Terminal.app. Bạn phải làm cho môi trường giống nhau bằng cách tìm nguồn của các tệp giống nhau.

Dựa trên câu trả lời này trên AskDifferent

Bạn cần lưu ý các tập tin khởi động cho bash là gì. ~ / .bash_profile được đọc trong shell đăng nhập ~ / .bashrc khi shell khác bắt đầu.

Ca cao Emacs là một GUI và khi nó chạy, nó chạy trong một quy trình con, trong đó không có gì chạy vỏ đăng nhập nên môi trường của nó không có gì có nguồn gốc ~ / .bash_profile. Emacs sẽ bắt đầu một vỏ không đăng nhập để mọi thứ trong ~ / .bashrc sẽ được đọc.

Loại điều này là lý do tại sao được khuyến nghị trong hướng dẫn bash để có cái này trong ~ /, bash_profile

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi 

và đặt cài đặt môi trường của bạn trong ~ / .bashrc

Về lý do /Appluggest/Emacs.app/Contents/MacOS/Emacs. làm việc trong nhà ga. Terminal.app mặc định chạy shell trong chế độ đăng nhập và do đó shell đã có nguồn gốc ~ / .bash_profile và emacs là một quy trình con của shell đó và do đó thừa hưởng môi trường của nó. Vì vậy, trong trường hợp này, bạn sẽ kế thừa từ trình bao trong Terminal.app

Lưu ý X11 khác khi bạn chạy nó từ shell để shell có các biến môi trường khi shell đó được bắt đầu như là một đăng nhập.


3

Giống như Mark nói, Terminal và iTerm 2 invoke vỏ như vỏ đăng nhập bằng cách mặc định, do đó Bash đọc ~/.bash_profilenhưng không phải ~/.bashrc, nhưng M-x shellM-x terminvoke vỏ như vỏ không đăng nhập, do đó Bash đọc ~/.bashrcnhưng không phải ~/.bash_profile. Hoặc thêm . ~/.bash_profilevào ~/.bashrcvà tiếp tục sử dụng ~/.bash_profilenhư tập tin cấu hình Bash của bạn, hoặc thêm . ~/.bashrcvào ~/.bash_profilevà bắt đầu sử dụng ~/.bashrcnhư tập tin cấu hình Bash của bạn.

Để thực hiện shell-commandshell-command-on-regionđọc ~/.bash_profile, thêm -lvào shell-command-switch:

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

Bạn có thể đặt đường dẫn mặc định rộng OS X bằng cách lưu danh sách thuộc tính như sau ~/Library/LaunchAgents/startup.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Đường dẫn mới sẽ được hiển thị trong các ứng dụng đầu cuối, Emacs và các ứng dụng khác sau khi bạn đăng xuất và đăng nhập lại. Phương pháp này không thay đổi đường dẫn trong các ứng dụng được mở dưới dạng mục đăng nhập hoặc được mở lại khi đăng nhập sau khi tắt máy. Nếu bạn có Emacs, ứng dụng đầu cuối hoặc các ứng dụng khác mà bạn muốn thay đổi đường dẫn trong các mục đăng nhập, bạn sẽ phải xóa chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.