* Problem setting frame title on startup @ 2013-03-15 19:24 Ian van der Neut 2013-03-15 19:51 ` Mark Skilbeck 0 siblings, 1 reply; 7+ messages in thread From: Ian van der Neut @ 2013-03-15 19:24 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 1266 bytes --] Hello all, rather a lisp newbie and been searching all over, but can't figure it out. I have the code below: (provide 'ian-project) ;; Based on the presence of the 'project' environment variable, ;; display the project name in the frame title and the mode line. (defun set-project-in-frame-title () (interactive) (setq projectname (getenv "project")) (message "Project: %s" projectname) (if projectname (setq-default frame-title-format (concat "%b (%*) [" projectname "] ")) (setq frame-title-format (concat "%b (%*)")) ) ;; if projectname ) And in my ~/.emacs I have: (require 'ian-project) (set-project-in-frame-title) The message "Project: <projectname>" is displayed in the *Messages* buffer on startup, however, the project name does not end up in the frame title, unless I execute the function by hand: M-x set-project-in-frame-title() My emacs version is: GNU Emacs 24.2.1 (x86_64-redhat-linux-gnu, GTK+ Version 3.6.4) of 2013-02-02 on buildvm-04.phx2.fedoraproject.org Thank you very much in advance for any pointers as to what I may be missing. Ian. -- One man's "magic" is another man's engineering. "Supernatural" is a null word. -- Excerpt from the notebooks of Lazarus Long, from Robert Heinlein's "Time Enough for Love" [-- Attachment #2: Type: text/html, Size: 1716 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem setting frame title on startup 2013-03-15 19:24 Problem setting frame title on startup Ian van der Neut @ 2013-03-15 19:51 ` Mark Skilbeck 2013-03-16 9:47 ` Ian van der Neut 0 siblings, 1 reply; 7+ messages in thread From: Mark Skilbeck @ 2013-03-15 19:51 UTC (permalink / raw) To: Ian van der Neut; +Cc: help-gnu-emacs Use modify-frame-parameters: (modify-frame-parameters nil '((title . "test"))) On Fri, Mar 15, 2013 at 08:24:20PM +0100, Ian van der Neut wrote: > Hello all, > > rather a lisp newbie and been searching all over, but can't figure it out. > I have the code below: > > (provide 'ian-project) > ;; Based on the presence of the 'project' environment variable, > ;; display the project name in the frame title and the mode line. > (defun set-project-in-frame-title () > (interactive) > (setq projectname (getenv "project")) > (message "Project: %s" projectname) > (if projectname > (setq-default frame-title-format (concat "%b (%*) [" projectname "] > ")) > (setq frame-title-format (concat "%b (%*)")) > ) ;; if projectname > ) > > And in my ~/.emacs I have: > > (require 'ian-project) > (set-project-in-frame-title) > > The message "Project: <projectname>" is displayed in the *Messages* buffer > on startup, however, the project name does not end up in the frame title, > unless I execute the function by hand: > M-x set-project-in-frame-title() > > My emacs version is: > GNU Emacs 24.2.1 (x86_64-redhat-linux-gnu, GTK+ Version 3.6.4) > of 2013-02-02 on buildvm-04.phx2.fedoraproject.org > > Thank you very much in advance for any pointers as to what I may be missing. > > Ian. > -- > One man's "magic" is another man's engineering. "Supernatural" is a null > word. > -- Excerpt from the notebooks of Lazarus Long, from Robert Heinlein's "Time > Enough for Love" ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem setting frame title on startup 2013-03-15 19:51 ` Mark Skilbeck @ 2013-03-16 9:47 ` Ian van der Neut 2013-03-16 10:24 ` Mark Skilbeck 0 siblings, 1 reply; 7+ messages in thread From: Ian van der Neut @ 2013-03-16 9:47 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 3623 bytes --] On Fri, Mar 15, 2013 at 8:51 PM, Mark Skilbeck <m@iammark.us> wrote: > Use modify-frame-parameters: > > (modify-frame-parameters nil '((title . "test"))) > > Hi, thank you for your reply. After some searching and reading docs I changed the code to (defun set-project-in-frame-title () (interactive) ;;(select-frame frame) (setq projectname (getenv "project")) (message "Project: %s" projectname) (if projectname (modify-frame-parameters nil (list (cons 'title (concat (buffer-name) " [" projectname "]")))) (modify-frame-parameters frame (list (cons 'title (buffer-name)))) ) ;; if projectname ) But it doesn't really make any difference. I figured out however, that I probably need a hook to be executed when a frame is opened: (add-hook 'after-make-frame-functions 'set-project-in-frame-title) But, this doesn't work exactly right either. I get the buffer-name of the previous buffer. E.g. when I start emacs: export projectname="myproject" emacs myfile The frame title has: *scratch* [myproject] In the documentation of after-make-frame-functions it is claimed that the new frame is passed as an argument, but when I do: (defun set-project-in-frame-title (frame) (interactive) (select-frame frame) (setq projectname (getenv "project")) (message "Project: %s" projectname) (if projectname (modify-frame-parameters frame (list (cons 'title (concat (buffer-name) " [" projectname "]")))) (modify-frame-parameters frame (list (cons 'title (buffer-name)))) ) ;; if projectname ) I get an error: Wrong number of arguments: (lambda (frame) (interactive) (select-frame frame) (setq projectname (getenv project)) (message Project: %s projectname) (if projectname (modify-frame-parameters frame (list (cons (quote title) (concat (buffer-name) [ projectname ])))) (modify-frame-parameters frame (list (cons (quote title) (buffer-name)))))), 0 Thank you very much for any help, Ian. > On Fri, Mar 15, 2013 at 08:24:20PM +0100, Ian van der Neut wrote: > > Hello all, > > > > rather a lisp newbie and been searching all over, but can't figure it > out. > > I have the code below: > > > > (provide 'ian-project) > > ;; Based on the presence of the 'project' environment variable, > > ;; display the project name in the frame title and the mode line. > > (defun set-project-in-frame-title () > > (interactive) > > (setq projectname (getenv "project")) > > (message "Project: %s" projectname) > > (if projectname > > (setq-default frame-title-format (concat "%b (%*) [" projectname "] > > ")) > > (setq frame-title-format (concat "%b (%*)")) > > ) ;; if projectname > > ) > > > > And in my ~/.emacs I have: > > > > (require 'ian-project) > > (set-project-in-frame-title) > > > > The message "Project: <projectname>" is displayed in the *Messages* > buffer > > on startup, however, the project name does not end up in the frame title, > > unless I execute the function by hand: > > M-x set-project-in-frame-title() > > > > My emacs version is: > > GNU Emacs 24.2.1 (x86_64-redhat-linux-gnu, GTK+ Version 3.6.4) > > of 2013-02-02 on buildvm-04.phx2.fedoraproject.org > > > > Thank you very much in advance for any pointers as to what I may be > missing. > > > > Ian. > > -- > > One man's "magic" is another man's engineering. "Supernatural" is a null > > word. > > -- Excerpt from the notebooks of Lazarus Long, from Robert Heinlein's > "Time > > Enough for Love" > -- One man's "magic" is another man's engineering. "Supernatural" is a null word. -- Excerpt from the notebooks of Lazarus Long, from Robert Heinlein's "Time Enough for Love" [-- Attachment #2: Type: text/html, Size: 5169 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem setting frame title on startup 2013-03-16 9:47 ` Ian van der Neut @ 2013-03-16 10:24 ` Mark Skilbeck 2013-03-16 11:04 ` Ian van der Neut 0 siblings, 1 reply; 7+ messages in thread From: Mark Skilbeck @ 2013-03-16 10:24 UTC (permalink / raw) To: Ian van der Neut; +Cc: help-gnu-emacs On Sat, Mar 16, 2013 at 10:47:54AM +0100, Ian van der Neut wrote: > On Fri, Mar 15, 2013 at 8:51 PM, Mark Skilbeck <m@iammark.us> wrote: > > > Use modify-frame-parameters: > > > > (modify-frame-parameters nil '((title . "test"))) > > > > > Hi, thank you for your reply. > > After some searching and reading docs I changed the code to > > (defun set-project-in-frame-title () > (interactive) > ;;(select-frame frame) > (setq projectname (getenv "project")) > (message "Project: %s" projectname) > (if projectname > (modify-frame-parameters nil (list (cons 'title (concat > (buffer-name) " [" projectname "]")))) > (modify-frame-parameters frame (list (cons 'title (buffer-name)))) > ) ;; if projectname > ) > > But it doesn't really make any difference. I figured out however, that I > probably need a hook to be executed when a frame is opened: > > (add-hook 'after-make-frame-functions 'set-project-in-frame-title) > > > But, this doesn't work exactly right either. I get the buffer-name of the > previous buffer. E.g. when I start emacs: > > export projectname="myproject" > emacs myfile > > The frame title has: > > *scratch* [myproject] Hum. I suppose this is because when a frame is created, the hook is run before the new buffer (i.e., myfile) is created, and therefore (current-buffer) points to the default buffer (in your case, *scratch*). I'm not sure how to remedy this as my Emacs hacking isn't much good. One thought would be to hook into the buffer change event, and update the title that way; but, of course, that will change the title whenever you change buffers, which may or may not be desirable. > > In the documentation of after-make-frame-functions it is claimed that the > new frame is passed as an argument, but when I do: > (defun set-project-in-frame-title (frame) > (interactive) > (select-frame frame) > (setq projectname (getenv "project")) > (message "Project: %s" projectname) > (if projectname > (modify-frame-parameters frame (list (cons 'title (concat > (buffer-name) " [" projectname "]")))) > (modify-frame-parameters frame (list (cons 'title (buffer-name)))) > ) ;; if projectname > ) > > I get an error: > Wrong number of arguments: (lambda (frame) (interactive) (select-frame > frame) (setq projectname (getenv project)) (message Project: %s > projectname) (if projectname (modify-frame-parameters frame (list (cons > (quote title) (concat (buffer-name) [ projectname ])))) > (modify-frame-parameters frame (list (cons (quote title) > (buffer-name)))))), 0 Queer. The following works fine for me (I've removed the duplication of the modify-frame-parameters): (defun set-project-title-in-frame (frame) (interactive) (setq project-name (getenv "projectname")) (setq project-title (concat (buffer-name) (if project-name (concat " [" project-name "]")))) (modify-frame-parameters frame `((title . ,project-title)))) (add-hook 'after-make-frame-functions 'set-project-title-in-frame) Also note that you have "project" rather than "projectname" in your GETENV call; but that may just be a typo. > > Thank you very much for any help, > > Ian. > - mgs ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem setting frame title on startup 2013-03-16 10:24 ` Mark Skilbeck @ 2013-03-16 11:04 ` Ian van der Neut 2013-03-16 11:26 ` Ian van der Neut 0 siblings, 1 reply; 7+ messages in thread From: Ian van der Neut @ 2013-03-16 11:04 UTC (permalink / raw) To: Mark Skilbeck; +Cc: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 2638 bytes --] On Sat, Mar 16, 2013 at 11:24 AM, Mark Skilbeck <m@iammark.us> wrote: > On Sat, Mar 16, 2013 at 10:47:54AM +0100, Ian van der Neut wrote: > > On Fri, Mar 15, 2013 at 8:51 PM, Mark Skilbeck <m@iammark.us> wrote: > > > > > Use modify-frame-parameters: > > > > > > (modify-frame-parameters nil '((title . "test"))) > > > > > > > > Hi, thank you for your reply. > > > > After some searching and reading docs I changed the code to > > > > (defun set-project-in-frame-title () > > (interactive) > > ;;(select-frame frame) > > (setq projectname (getenv "project")) > > (message "Project: %s" projectname) > > (if projectname > > (modify-frame-parameters nil (list (cons 'title (concat > > (buffer-name) " [" projectname "]")))) > > (modify-frame-parameters frame (list (cons 'title (buffer-name)))) > > ) ;; if projectname > > ) > > > > But it doesn't really make any difference. I figured out however, that I > > probably need a hook to be executed when a frame is opened: > > > > (add-hook 'after-make-frame-functions 'set-project-in-frame-title) > > > > > > But, this doesn't work exactly right either. I get the buffer-name of the > > previous buffer. E.g. when I start emacs: > > > > export projectname="myproject" > > emacs myfile > > > > The frame title has: > > > > *scratch* [myproject] > > Hum. I suppose this is because when a frame is created, the hook > is run before the new buffer (i.e., myfile) is created, and therefore > (current-buffer) points to the default buffer (in your case, *scratch*). > I'm not sure how to remedy this as my Emacs hacking isn't much good. > > One thought would be to hook into the buffer change event, and update the > title that way; but, of course, that will change the title whenever you > change buffers, which may or may not be desirable. > That would be desirable, the buffer name in the title should reflect the buffer in the frame. > > > > > I get an error: > > Wrong number of arguments: (lambda (frame) (interactive) (select-frame > > frame) (setq projectname (getenv project)) (message Project: %s > > projectname) (if projectname (modify-frame-parameters frame (list (cons > > (quote title) (concat (buffer-name) [ projectname ])))) > > (modify-frame-parameters frame (list (cons (quote title) > > (buffer-name)))))), 0 > > Argh... my bad. Somewhere in my ~/.emacs there was still a call to set-project-in-frame-title without any argument. > Also note that you have "project" rather than "projectname" in your > GETENV call; but that may just be a typo. > Yes, it was a typo in the email :) > Thank you so far. Not quite there yet though... :) Ian. [-- Attachment #2: Type: text/html, Size: 4014 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem setting frame title on startup 2013-03-16 11:04 ` Ian van der Neut @ 2013-03-16 11:26 ` Ian van der Neut 2013-03-18 5:40 ` XeCycle 0 siblings, 1 reply; 7+ messages in thread From: Ian van der Neut @ 2013-03-16 11:26 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 4174 bytes --] Well, the following works exactly as I want it in emacsclient/daemon mode (which is what I use pretty much all the time): (defun set-project-in-frame-title (frame) (interactive) (select-frame frame) ;; Doen't seem to make a difference if you uncomment this or not. (setq project-name (getenv "project")) (message "Project: %s" project-name) (if project-name (setq frame-title-format (concat "%b (%*) [" project-name "] ")) (setq frame-title-format (concat "%b (%*)")))) (add-hook 'after-make-frame-functions 'set-project-in-frame-title) In normal mode (just starting 'emacs filename' from the command line, rather than emacsclient) it doesn't show the project name until I open a new frame, then both frames get the right frame title. Thank you for your help, Ian. PS. The reason I wanted this, is that I often work on multiple projects at the same time. (or multiple mercurial repositories of the same source code) and I like to see in the frame title which one I'm having in front of me. Each also has its own daemon: emacs --daemon=project Some shell scripting makes sure that the proper daemon is automatically started if it's not running already. On Sat, Mar 16, 2013 at 12:04 PM, Ian van der Neut <ivdneut@gmail.com>wrote: > > > > On Sat, Mar 16, 2013 at 11:24 AM, Mark Skilbeck <m@iammark.us> wrote: > >> On Sat, Mar 16, 2013 at 10:47:54AM +0100, Ian van der Neut wrote: >> > On Fri, Mar 15, 2013 at 8:51 PM, Mark Skilbeck <m@iammark.us> wrote: >> > >> > > Use modify-frame-parameters: >> > > >> > > (modify-frame-parameters nil '((title . "test"))) >> > > >> > > >> > Hi, thank you for your reply. >> > >> > After some searching and reading docs I changed the code to >> > >> > (defun set-project-in-frame-title () >> > (interactive) >> > ;;(select-frame frame) >> > (setq projectname (getenv "project")) >> > (message "Project: %s" projectname) >> > (if projectname >> > (modify-frame-parameters nil (list (cons 'title (concat >> > (buffer-name) " [" projectname "]")))) >> > (modify-frame-parameters frame (list (cons 'title (buffer-name)))) >> > ) ;; if projectname >> > ) >> > >> > But it doesn't really make any difference. I figured out however, that I >> > probably need a hook to be executed when a frame is opened: >> > >> > (add-hook 'after-make-frame-functions 'set-project-in-frame-title) >> > >> > >> > But, this doesn't work exactly right either. I get the buffer-name of >> the >> > previous buffer. E.g. when I start emacs: >> > >> > export projectname="myproject" >> > emacs myfile >> > >> > The frame title has: >> > >> > *scratch* [myproject] >> >> Hum. I suppose this is because when a frame is created, the hook >> is run before the new buffer (i.e., myfile) is created, and therefore >> (current-buffer) points to the default buffer (in your case, *scratch*). >> I'm not sure how to remedy this as my Emacs hacking isn't much good. >> >> One thought would be to hook into the buffer change event, and update the >> title that way; but, of course, that will change the title whenever you >> change buffers, which may or may not be desirable. >> > > > That would be desirable, the buffer name in the title should reflect the > buffer in the frame. > > >> >> > >> > I get an error: >> > Wrong number of arguments: (lambda (frame) (interactive) (select-frame >> > frame) (setq projectname (getenv project)) (message Project: %s >> > projectname) (if projectname (modify-frame-parameters frame (list (cons >> > (quote title) (concat (buffer-name) [ projectname ])))) >> > (modify-frame-parameters frame (list (cons (quote title) >> > (buffer-name)))))), 0 >> >> > Argh... my bad. Somewhere in my ~/.emacs there was still a call to > set-project-in-frame-title without any argument. > > >> Also note that you have "project" rather than "projectname" in your >> GETENV call; but that may just be a typo. >> > > Yes, it was a typo in the email :) > > >> Thank you so far. Not quite there yet though... :) > > Ian. > -- One man's "magic" is another man's engineering. "Supernatural" is a null word. -- Excerpt from the notebooks of Lazarus Long, from Robert Heinlein's "Time Enough for Love" [-- Attachment #2: Type: text/html, Size: 6302 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Problem setting frame title on startup 2013-03-16 11:26 ` Ian van der Neut @ 2013-03-18 5:40 ` XeCycle 0 siblings, 0 replies; 7+ messages in thread From: XeCycle @ 2013-03-18 5:40 UTC (permalink / raw) To: help-gnu-emacs [-- Attachment #1: Type: text/plain, Size: 1122 bytes --] Ian van der Neut <ivdneut@gmail.com> writes: [...] > In normal mode (just starting 'emacs filename' from the command line, rather > than emacsclient) it doesn't show the project name until I open a new frame, > then both frames get the right frame title. If Emacs is started as `emacs --daemon`, there would be no frame while executing .emacs. If not started as a daemon, there would be one, but after-make-frame-functions won't be executed for this frame. Therefore I wrote this macro: (require 'cl) (defmacro do-frames (&rest body) (let ((frame (gensym))) `(progn (dolist (,frame (frame-list)) (select-frame ,frame) ,@body) (add-hook 'after-make-frame-functions (lambda (new-frame) (select-frame new-frame) ,@body))))) And (do-frames (what-ever you-like)) would work for all frames, either started as daemon or not. -- Carl Lei (XeCycle) Department of Physics, Shanghai Jiao Tong University OpenPGP public key: 7795E591 Fingerprint: 1FB6 7F1F D45D F681 C845 27F7 8D71 8EC4 7795 E591 [-- Attachment #2: Type: application/pgp-signature, Size: 489 bytes --] ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2013-03-18 5:40 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-03-15 19:24 Problem setting frame title on startup Ian van der Neut 2013-03-15 19:51 ` Mark Skilbeck 2013-03-16 9:47 ` Ian van der Neut 2013-03-16 10:24 ` Mark Skilbeck 2013-03-16 11:04 ` Ian van der Neut 2013-03-16 11:26 ` Ian van der Neut 2013-03-18 5:40 ` XeCycle
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).