Elisp version of system(...);

TorgoX on 2005-11-19T04:42:15

Dear Log,

More Emacs fun. I'm learnding elisps!!!!

(setenv "UNDER_EMACS" "1")
; A handy envvar for letting some programs know
;  when they're being called via shell-command

(defun launch (cmd &rest args)
  "Launch cmd with given arguments, not waiting for it completion, nor saving its output."
  ; sort of like perl 'system(...)';
  (unwind-protect
      (progn
	(setenv "UNDER_EMACS")
	(apply 'call-process cmd nil 0 nil args))
      (setenv "UNDER_EMACS" "1")))

(defun spawn-terminal ()
  "Spawn a new terminal window"
  (interactive)
  (launch "gnome-terminal"))

(defun spawn-explore-pwd ()
  "Spawn a filesystem window on pwd"
  (interactive)
  (launch "gnome-open" "."))

(defun start-current-buffer ()
  "Call 'start' on the current buffer"
  (interactive)
  (unless (buffer-file-name) (error
    "You have to save this buffer someplace first"))
  (save-buffer)
  (launch "gnome-open" (buffer-file-name)))

(defun dired-start-this-file ()
  "Call 'start' on current/selected files"
  (interactive)
  (unwind-protect
      (progn
	(setenv "UNDER_EMACS")
	(mapc
	 (function (lambda (x)
		     (call-process "gnome-open" nil 0 nil x)))
	 (dired-get-marked-files t current-prefix-arg)))
    (setenv "UNDER_EMACS" "1")))


From an old elisp hacker...

merlyn on 2005-11-19T11:27:48

You already have "EMACS=t" in the environment, so you don't need an extra variable to do that.

If you want to temporarily get rid of that, setenv does a lot more than you need, including pushing your temp changes into setenv-history. Look at localizing the process-environment variable, and simply modifying it to a new value. For example (slightly untested):

(let ((process-environment (cons "FOO=bar" process-environment)))
  ... your code ...
)

Re:From an old elisp hacker...

TorgoX on 2005-11-19T12:12:00

You already have "EMACS=t" in the environment,

I don't see that when I shell-command "printenv" or do (getenv "EMACS"). Are you using Xemacs? I'm using GNU Emacs 21.3.1.

That's a handy trick with localizing process-environment tho!

Re:From an old elisp hacker...

merlyn on 2005-11-19T12:17:46

EMACS=t is apparently only when I start a shell. Must be a function of shell mode. (Time passes.) Oh, it's defined in comint-exec-1. There's a good example of manipulating a local process-environment there too! Bonus!