unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* How to update modelines of all displayed buffers
@ 2010-04-15 19:21 Cecil Westerhof
  2010-04-16  2:17 ` Barry Margolin
  2010-04-16 22:49 ` Andreas Politz
  0 siblings, 2 replies; 5+ messages in thread
From: Cecil Westerhof @ 2010-04-15 19:21 UTC (permalink / raw)
  To: help-gnu-emacs

I have defined the following function:
    (defun buffer-update-mode-line ()
      (setq buffer-mode-line (buffer-mode-line-extra))
      (force-mode-line-update t))

The function buffer-mode-line-extra gives the extra data I want to
display in the modeline.

It is called every minute with:
    (run-with-timer 60 60 'buffer-update-mode-line)

With this only the modeline of the current buffer is updated. In
principal (force-mode-line-update t) makes all modelines updated, but
that will only work if for every (visible) buffer buffer-mode-line is
updated with the function buffer-mode-line-extra. Is there a way to get
this done?

-- 
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How to update modelines of all displayed buffers
  2010-04-15 19:21 How to update modelines of all displayed buffers Cecil Westerhof
@ 2010-04-16  2:17 ` Barry Margolin
  2010-04-16  7:19   ` Cecil Westerhof
  2010-04-16 22:49 ` Andreas Politz
  1 sibling, 1 reply; 5+ messages in thread
From: Barry Margolin @ 2010-04-16  2:17 UTC (permalink / raw)
  To: help-gnu-emacs

In article <87y6gor07c.fsf@linux-lqcw.site>,
 Cecil Westerhof <Cecil@decebal.nl> wrote:

> I have defined the following function:
>     (defun buffer-update-mode-line ()
>       (setq buffer-mode-line (buffer-mode-line-extra))
>       (force-mode-line-update t))
> 
> The function buffer-mode-line-extra gives the extra data I want to
> display in the modeline.

What's the variable buffer-mode-line?  I can't find it in the Emacs Lisp 
documentation, is it something you added?

> 
> It is called every minute with:
>     (run-with-timer 60 60 'buffer-update-mode-line)
> 
> With this only the modeline of the current buffer is updated. In
> principal (force-mode-line-update t) makes all modelines updated, but
> that will only work if for every (visible) buffer buffer-mode-line is
> updated with the function buffer-mode-line-extra. Is there a way to get
> this done?

If buffer-mode-line is a buffer-local variable, you need to loop through 
all buffers, changing to each one and running your function.

(defun update-mode-line-all-buffers ()
  (save-current-buffer
    (dolist (b (buffer-list))
      (set-buffer b)
      (buffer-update-mode-line))))

-- 
Barry Margolin, barmar@alum.mit.edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***
*** PLEASE don't copy me on replies, I'll read them in the group ***


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How to update modelines of all displayed buffers
  2010-04-16  2:17 ` Barry Margolin
@ 2010-04-16  7:19   ` Cecil Westerhof
  2010-04-16 21:58     ` José A. Romero L.
  0 siblings, 1 reply; 5+ messages in thread
From: Cecil Westerhof @ 2010-04-16  7:19 UTC (permalink / raw)
  To: help-gnu-emacs

Barry Margolin <barmar@alum.mit.edu> writes:

>> I have defined the following function:
>>     (defun buffer-update-mode-line ()
>>       (setq buffer-mode-line (buffer-mode-line-extra))
>>       (force-mode-line-update t))
>> 
>> The function buffer-mode-line-extra gives the extra data I want to
>> display in the modeline.
>
> What's the variable buffer-mode-line?  I can't find it in the Emacs Lisp 
> documentation, is it something you added?

Yes, my bad:
    (unless (memq 'buffer-mode-line global-mode-string)
      (setq global-mode-string
        (append global-mode-string 
            '("" buffer-mode-line))))


>> It is called every minute with:
>>     (run-with-timer 60 60 'buffer-update-mode-line)
>> 
>> With this only the modeline of the current buffer is updated. In
>> principal (force-mode-line-update t) makes all modelines updated, but
>> that will only work if for every (visible) buffer buffer-mode-line is
>> updated with the function buffer-mode-line-extra. Is there a way to get
>> this done?
>
> If buffer-mode-line is a buffer-local variable, you need to loop through 
> all buffers, changing to each one and running your function.
>
> (defun update-mode-line-all-buffers ()
>   (save-current-buffer
>     (dolist (b (buffer-list))
>       (set-buffer b)
>       (buffer-update-mode-line))))

This does all buffers. Is it possible to do it only for displayed
buffers?

-- 
Cecil Westerhof
Senior Software Engineer
LinkedIn: http://www.linkedin.com/in/cecilwesterhof


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How to update modelines of all displayed buffers
  2010-04-16  7:19   ` Cecil Westerhof
@ 2010-04-16 21:58     ` José A. Romero L.
  0 siblings, 0 replies; 5+ messages in thread
From: José A. Romero L. @ 2010-04-16 21:58 UTC (permalink / raw)
  To: help-gnu-emacs

On 16 Kwi, 09:19, Cecil Westerhof <Ce...@decebal.nl> wrote:
(...)
> > (defun update-mode-line-all-buffers ()
> >   (save-current-buffer
> >     (dolist (b (buffer-list))
> >       (set-buffer b)
> >       (buffer-update-mode-line))))
>
> This does all buffers. Is it possible to do it only for displayed
> buffers?
(...)

You could try something like this:

(mapc
 (lambda (b) (set-buffer b) (buffer-update-mode-line))
 (delete-dups
  (mapcar 'window-buffer
          (apply 'append
                 (mapcar 'window-list (frame-list))))))

though if you refactored your buffer-update-mode-line to accept the
buffer as parameter you could write this a bit more elegantly:

(mapc 'buffer-update-mode-line
      (delete-dups
       (mapcar 'window-buffer
               (apply 'append
                      (mapcar 'window-list (frame-list))))))

Cheers,
--
José A. Romero L.
escherdragon at gmail
"We who cut mere stones must always be envisioning cathedrals."
(Quarry worker's creed)


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: How to update modelines of all displayed buffers
  2010-04-15 19:21 How to update modelines of all displayed buffers Cecil Westerhof
  2010-04-16  2:17 ` Barry Margolin
@ 2010-04-16 22:49 ` Andreas Politz
  1 sibling, 0 replies; 5+ messages in thread
From: Andreas Politz @ 2010-04-16 22:49 UTC (permalink / raw)
  To: help-gnu-emacs

Cecil Westerhof <Cecil@decebal.nl> writes:

> I have defined the following function:
>     (defun buffer-update-mode-line ()
>       (setq buffer-mode-line (buffer-mode-line-extra))
>       (force-mode-line-update t))
>
> The function buffer-mode-line-extra gives the extra data I want to
> display in the modeline.
>
> It is called every minute with:
>     (run-with-timer 60 60 'buffer-update-mode-line)
>
> With this only the modeline of the current buffer is updated. In
> principal (force-mode-line-update t) makes all modelines updated, but
> that will only work if for every (visible) buffer buffer-mode-line is
> updated with the function buffer-mode-line-extra. Is there a way to get
> this done?

(defun displayed-buffer-list (&optional all-frames)
  (flet ((fn (buf) (get-buffer-window buf all-frames)))
    (remove-if-not #'fn (buffer-list))))

ap


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-04-16 22:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-15 19:21 How to update modelines of all displayed buffers Cecil Westerhof
2010-04-16  2:17 ` Barry Margolin
2010-04-16  7:19   ` Cecil Westerhof
2010-04-16 21:58     ` José A. Romero L.
2010-04-16 22:49 ` Andreas Politz

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