* 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).