Hi, I didn't read your code too closely, but could you use the shell command functions in conjunction with mktemp?
Dave Feng Shu <tuma...@gmail.com> writes: > Hi everyone, > > The below configure is stumpwm configure for emacs, > My question is that how can I write a function which > can generate an unique file, like emacs lisp function `with-temp-file', > so I can generate a temp file instead use *emacsclient-load-file* > > > #+begin_src common-lisp > > (setq *stumpwmrc-file* "~/project/stumpwm-config/stumpwmrc") > (set-contrib-dir "~/project/stumpwm-contrib/") > (setq *swank-loader-file* "~/project/emacs-packages/slime/swank-loader.lisp") > (setq *emacs-daemon-name* "default") > (setq *emacsclient-load-file* "~/.stumpwm.d/emacsclient-load-file.el") > > > ;; load Swank so we can connect with SLIME > (load *swank-loader-file*) > (swank-loader:init) > (defvar *swank-p* nil) > > ;; define swank command to start swank server on port 4005 > (defcommand swank () () > "Starts a swank server on port 4005 and notifies the user." > (setf stumpwm:*top-level-error-action* :break) > (if *swank-p* > (message "Swank server already running.") > (progn > (swank:create-server :port 4005 > :style swank:*communication-style* > :dont-close t) > (setf *swank-p* t) > (message "Starting swank on port 4005.")))) > > (defcommand slime () () > (swank) > (emacsclient-eval > `(progn > (require 'slime) > (slime-connect "127.0.0.1" "4005")))) > > (defun my-run-or-raise (cmd props &optional (all-groups > *run-or-raise-all-groups*) > (all-screens *run-or-raise-all-screens*)) > (let* ((group (current-group)) > (frames (when (eq (type-of group) 'tile-group) > (group-frames group)))) > (if (> (length frames) 1) > (run-or-pull cmd props all-groups all-screens) > (run-or-raise cmd props all-groups all-screens)))) > > (defcommand emacs-daemon-kill-soft () () > (emacsclient-eval > '(progn > (when (not (eq window-system 'x)) > (message "Initializing x windows system.") > (x-initialize-window-system) > (when (not x-display-name) (setq x-display-name (getenv "DISPLAY"))) > (select-frame (make-frame-on-display x-display-name '((window-system . > x))))) > (let ((last-nonmenu-event nil)(window-system > "x"))(save-buffers-kill-emacs))) > t)) > > (defcommand emacs-daemon-kill-hard () () > (run-shell-command > (format nil "for i in `ps ax | grep emacs | grep =~A |cut -d ' ' -f 1`; do > kill -9 $i; done" > *emacs-daemon-name*)) > (message (format nil "emacs daemon which name is (~A) has been killed" > *emacs-daemon-name*))) > > (defun escape-instance-name (str) > (let (buf) > (map nil #'(lambda (ch) > (if (or (char= ch #\() > (char= ch #\)) > (char= ch #\") > (char= ch #\ ) > (char= ch #\Newline)) > (push #\_ buf) > (push ch buf))) > str) > (coerce (reverse buf) 'string))) > > (defun emacs-daemon-run-p () > (string-equal > (remove #\Newline > (run-shell-command > (concat > "emacsclient " > "--socket-name=" *emacs-daemon-name* > " --eval 't'") t)) "t")) > > (defun generate-elisp-expression-string (expression) > (cl-ppcre:regex-replace-all > "stumpwm::" > (write-to-string expression :case :downcase) "")) > > (defcommand bare-emacs-run (expression) () > (let ((expression-string > (generate-elisp-expression-string expression))) > (run-shell-command (concat "emacs -Q --eval '" expression-string "'")))) > > (defcommand emacs-daemon-start () () > (when (not (emacs-daemon-run-p)) > (run-shell-command > (concat > "x-terminal-emulator -T emacs-daemon-start -e emacs " > (if *emacs-daemon-name* (concat "--daemon=" *emacs-daemon-name*) > "--daemon"))))) > > (defun emacsclient-eval (&optional expression create-frame frame-name file) > "Eval an emacs lisp expression which emacsclient" > (let* ((expression-string > (generate-elisp-expression-string expression)) > (name (or frame-name > (escape-instance-name expression-string)))) > ;; write emacs lisp sexp to a file, all symbol names > ;; will be converted to downcase when save. > (with-open-file > (stream *emacsclient-load-file* > :direction :output > :if-exists :supersede) > (with-standard-io-syntax > (format stream "~A" expression-string))) > > ;; start emacs daemon > (emacs-daemon-start) > > ;; run emacs client > (my-run-or-raise > (format nil > (concat "for i in {1..20};" > "do emacsclient --socket-name=~A --eval 't' > /dev/null > 2>&1 && break;" > "sleep 1;" > "done;" > "emacsclient ~@[--socket-name=~A ~]" > "~:[ ~;-c~] ~@[-F '((name . \"~A\"))' ~]" > "~@[--eval '(load \"~A\")' ~] ~@[~A~]") > *emacs-daemon-name* > *emacs-daemon-name* > create-frame > name > *emacsclient-load-file* > file) > `(:instance ,name)))) > > (defcommand emacs () () > (emacsclient-eval '(recentf-open-files) t "emacs")) > > (defcommand org-agenda () () > (emacsclient-eval '(progn (org-agenda nil "l") (delete-other-windows)) t)) > > (defcommand gnus () () > (emacsclient-eval '(gnus) t)) > > (defcommand edit-stumpwmrc () () > (emacsclient-eval > `(find-file ,*stumpwmrc-file*) > t "edit-stumpwmrc")) > > #+end_src _______________________________________________ Stumpwm-devel mailing list Stumpwm-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/stumpwm-devel