Es gibt im Wesentlichen zwei Probleme zu lösen, wenn es um Umgebungsvariablen in OS X zu lösen. Das erste ist beim Aufruf von Programmen aus Spotlight (das Lupensymbol auf der rechten Seite des Mac Menü/Statusleiste) und das zweite beim Aufrufen von Programmen aus dem Dock. Das Aufrufen von Programmen aus einem Terminal-Programm ist trivial weil es die Umgebung aus den Standard-Shell-Speicherorten liest ( ~/.profile
, ~/.bash_profile
, ~/.bashrc
etc.)
Wenn Sie Programme aus dem Dock aufrufen, verwenden Sie ~/.MacOSX/environment.plist
wo die <dict>
Element enthält eine Folge von <key>KEY</key><string>theValue</string>
Elemente.
Wenn Sie Programme von Spotlight aus aufrufen, stellen Sie sicher, dass launchd mit allen erforderlichen Schlüssel/Wert-Einstellungen eingerichtet ist.
Um beide Probleme gleichzeitig zu lösen, verwende ich ein Login-Element (eingestellt über das Systemeinstellungen) für mein Benutzerkonto. Das Login-Element ist ein Bash-Skript, das eine Emacs-Lisp-Funktion aufruft, aber man kann natürlich auch sein Lieblings-Skriptprogramm verwenden, um das Gleiche zu erreichen. Dieser Ansatz hat den zusätzlichen Vorteil, dass es jederzeit funktioniert und keinen Neustart erfordert. Neustart, d.h. man kann ~/.profile
Sie können das Anmeldeelement in einer Shell ausführen und die Änderungen für neu aufgerufene Programme sichtbar machen, entweder im Dock oder in Spotlight.
Einzelheiten:
Element anmelden: ~/bin/macosx-startup
#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"
Emacs-Lisp-Funktion: ~/lib/emacs/elisp/macosx/envionment-support.el
;;; Provide support for the environment on Mac OS X
(defun generate-environment ()
"Dump the current environment into the ~/.MacOSX/environment.plist file."
;; The system environment is found in the global variable:
;; 'initial-environment' as a list of "KEY=VALUE" pairs.
(let ((list initial-environment)
pair start command key value)
;; clear out the current environment settings
(find-file "~/.MacOSX/environment.plist")
(goto-char (point-min))
(setq start (search-forward "<dict>\n"))
(search-forward "</dict>")
(beginning-of-line)
(delete-region start (point))
(while list
(setq pair (split-string (car list) "=")
list (cdr list))
(setq key (nth 0 pair)
value (nth 1 pair))
(insert " <key>" key "</key>\n")
(insert " <string>" value "</string>\n")
;; Enable this variable in launchd
(setq command (format "launchctl setenv %s \"%s\"" key value))
(shell-command command))
;; Save the buffer.
(save-buffer)))
HINWEIS: Diese Lösung ist eine Mischung aus den Lösungen, die vor mir kamen, insbesondere aus der von Matt Curtis, aber ich habe bewusst versucht, meine ~/.bash_profile
Inhalte plattformunabhängig und stellen die Einstellung der launchd
Umgebung (nur für Mac) in ein separates Skript.