stumpwm-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [STUMP] How can I generate an unique file for emacsclient --eval '(l


From: David Bjergaard
Subject: Re: [STUMP] How can I generate an unique file for emacsclient --eval '(load file)'
Date: Tue, 29 Jul 2014 21:45:03 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux)

Hi,

I didn't read your code too closely, but could you use the shell command
functions in conjunction with mktemp?

    Dave

Feng Shu <address@hidden> 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 address@hidden ~]"
>                    "~:[ ~;-c~] address@hidden '((name . \"~A\"))' ~]"
>                    "address@hidden '(load \"~A\")' ~] address@hidden")
>            *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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]