help-gnu-emacs
[Top][All Lists]
Advanced

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

Re: Problem setting frame title on startup


From: Mark Skilbeck
Subject: Re: Problem setting frame title on startup
Date: Sat, 16 Mar 2013 10:24:34 +0000
User-agent: Mutt/1.5.21 (2010-09-15)

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



reply via email to

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