(defun fwoar/source (filename)
"Update environment variables from a shell source file."
(interactive "fSource file: ")
(message "Sourcing environment from `%s'..." filename)
(with-temp-buffer
(shell-command (format "diff -u <(true; export) <(source %s; export)" filename) '(4))
(let ((envvar-re "\\([^=[:space:]]+\\)=\\(.*\\)$"))
;; Remove environment variables
(while (search-forward-regexp (concat "^-" envvar-re) nil t)
(let ((var (match-string 1)))
(message "%s" (prin1-to-string `(setenv ,var nil)))
(setenv var nil)
))
;; Update environment variables
(goto-char (point-min))
(while (search-forward-regexp (concat "^+" envvar-re) nil t)
(let ((var (match-string 1))
(value (string-trim (match-string 2) "'" "'")))
(message "%s" (prin1-to-string `(setenv ,var ,value)))
(setenv var value)
))))
(message "Sourcing environment from `%s'... done." filename))