* Showing network speed in emacs mode line.
@ 2010-01-19 23:00 Vicente Hernando Ara
2010-01-20 0:09 ` Ken Hori
2010-01-20 1:52 ` Juri Linkov
0 siblings, 2 replies; 5+ messages in thread
From: Vicente Hernando Ara @ 2010-01-19 23:00 UTC (permalink / raw)
To: emacs-devel
[-- Attachment #1.1: Type: text/plain, Size: 1292 bytes --]
Hi to all the emacs community!
I have written an elisp file(attached to this mail) that shows network speed
in emacs mode line.
Just to make it work:
M-x load-file RET /path/to/network-speed.el
M-x network-speed-start
and to stop it showing in the mode line
M-x network-speed-stop
There are several customizable variables. e.g in my .emacs file :
(custom-set-variables
....
'(network-speed-update-interval 2) ; Shows network speed every 2 seconds.
'(network-speed-interface-list (list "ppp0" "eth0"))) ; Network interfaces
to be shown in mode line.
'(network-speed-precision 1) ; Number of digits to be shown after decimal
point.
'(network-speed-format-string " [%NI %AX %AB] ") ; or i.e: "[%NI rx:%RX
tx:%TX]"
'(network-speed-interface-list (list "ppp0" "eth0")) ; Network interfaces
to be shown in mode line.
network-speed-format-string can be customized to show:
%NI : network interface name
%RB: received bytes
%TB: transmitted bytes
%AB: all received + transmitted bytes.
%RX: received byte speed.
%TX: transmitted byte speed.
%AX: total byte speed.
%%%: escape secuence for % character.
I hope you test it and enjoy!
Any constructive criticism is welcomed.
I also would be glad about signing FSF papers for this file if it is
considered worthy.
Kind regards,
Vicente.
[-- Attachment #1.2: Type: text/html, Size: 1495 bytes --]
[-- Attachment #2: network-speed.el --]
[-- Type: application/octet-stream, Size: 9680 bytes --]
;;; network-speed.el --- display network speed information -*- coding: mule-utf-8 -*-
;; Copyright (C) 2009 Vicente Hernando Ara
;; Author: Vicente Hernando Ara <bizenton@gmail.com>
;; Created: 1 Jan 2010
;; Keywords: hardware
;; This file is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; network-speed.el package displays network speed in emacs mode line for the interfaces the user selects.
;; There are several configurable options:
;; network-speed-update_interval: time interval after which speed is calculated.
;; network-speed-interface-list: list containing all network interfaces we want to show data about.
;; network-speed-precision: every floating point number will show this number of figures after decimal point.
;; network-speed-format-string: customizable string to be shown in the mode line.
;; There are several scape strings which will be sustituted by data.
;; %NI == network interface
;; %RX == received bytes speed
;; %TX == transmitted bytes speed
;; %AX == received + transmitted bytes speed
;; %RB == total received bytes
;; %TB == total transmitted bytes
;; %AB == total received plus transmitted bytes
;; %%% == % character"
;; After this file is loaded, it is necessary to call `network-speed-start' function.
;; To stop network-speed working you need to call `network-speed-stop' function.
;;
;; A lot of ideas were taken from `battery.el.gz' file.
;;; NETWORK-SPEED CONFIGURATION
;;
;; Add something like this in your .emacs file:
;;
;; ;; Custom variables:
;; '(network-speed-update-interval 2) ; Shows network speed every 2 seconds.
;; '(network-speed-interface-list (list "ppp0" "eth0")) ; Network interfaces to be shown in mode line.
;; '(network-speed-precision 1) ; Number of figures after decimal point.
;; '(network-speed-format-string " [%NI total: %AX] ") ; String format.
;;
;; ;; network-speed configuration:
;; (add-to-list 'load-path "/path/to/network-speed.el")
;; (require 'network-speed)
;; (network-speed-start) ;
;;
;; ;; to stop network-speed, call "network-speed-stop" interactive function.
;; ;; (network-speed-stop)
;;; Code:
(defgroup network-speed nil
"Displays network interface speed."
:group 'hardware)
;;; CUSTOM VARIABLES:
;; Network interface list to be shown in mode line.
;; E.g: `(list "ppp0" "eth0" "ppp1")'
(defcustom network-speed-interface-list (list "eth0") "Network interface list to be shown in mode line."
:type '(repeat string)
:group 'network-speed )
(defcustom network-speed-update-interval 1 "Network speed is calculated every network-speed-update-interval seconds."
:type 'number
:group 'network-speed )
(defcustom network-speed-precision 2 "Number of digits after point in numbers shown in mode line."
:type 'integer
:group 'network-speed )
;; String used to build the output string shown in emacs mode line.
(defcustom network-speed-format-string " [%NI rx:%RX tx:%TX] " "Format string.
%NI == network interface
%RX == received bytes speed
%TX == transmitted bytes speed
%AX == received + transmitted bytes speed
%RB == total received bytes
%TB == total transmitted bytes
%AB == total received plus transmitted bytes
%%% == % character"
:type 'string
:group 'network-speed
)
(defvar network-speed-update-timer nil)
;; List that contains vectors like this: [ network-interface-string received-bytes transmitted-bytes rx-speed tx-speed ]
;; This variable is only for internal use.
(defvar network-speed-data-list nil)
;; We will parse /proc/net/dev file using the returned regexp.
(defun network-speed-get-regex (network-interface)
"Returns the right regular expression needed to find received and transmitted bytes for NETWORK-INTERFACE."
(concat "^\\( *" network-interface ":[ ]*\\)"
"\\([0-9]+\\)" ; received bytes.
"\\( +[0-9]+\\)\\{7\\} +"
"\\([0-9]+\\)")) ; transmitted bytes.
(defun network-speed-get-rx-tx-bytes ()
"Gets received and transmitted bytes for every required network interface and calculates received and transmitted speeds.
Received and transmitted bytes are read from `/proc/net/dev' file"
(mapc
(lambda (network-speed-data)
(with-temp-buffer
(ignore-errors (insert-file-contents "/proc/net/dev"))
(cond ((re-search-forward (network-speed-get-regex (aref network-speed-data 0)) (point-max) t)
(let ((old-received-bytes (aref network-speed-data 1)) ; get old received bytes.
(old-transmitted-bytes (aref network-speed-data 2)) ; get old transmitted bytes.
(received-bytes (string-to-number (match-string 2))) ; get updated received bytes.
(transmitted-bytes (string-to-number (match-string 4)))) ; get updated transmitted bytes.
;; Save received and transmitted bytes.
(aset network-speed-data 1 received-bytes)
(aset network-speed-data 2 transmitted-bytes)
;; Save received and transmitted speed.
(aset network-speed-data 3 (/ (float (- received-bytes old-received-bytes)) network-speed-update-interval))
(aset network-speed-data 4 (/ (float (- transmitted-bytes old-transmitted-bytes)) network-speed-update-interval))))
(t
(aset network-speed-data 3 -1 ) ; There is no network interface available.
(aset network-speed-data 4 -1 ) ; There is no network interface available.
))))
network-speed-data-list))
(defun network-speed-add-units (speed &optional add-seconds)
"Returns speed in adequate units e.g: B/s, KB/s, MB/s, B, KB or MB."
(let ((string-end ""))
(when add-seconds
(setq string-end "/s"))
(cond
((< speed 0) (format "*")) ; Network interface not available right now.
((< speed 1000) (format "%d B%s" speed string-end))
((< speed 1000000) (format (concat "%." (number-to-string network-speed-precision) "f KB%s") (/ speed 1000) string-end))
(t (format (concat "%." (number-to-string network-speed-precision) "f MB%s") (/ speed 1000000) string-end)))))
(defun network-speed-parse-format (vector-data)
"Substitute %XX sequences in network-speed-format-string."
(replace-regexp-in-string
;;; "%NI\\|%RX\\|%TX\\|%AX\\|%RB\\|%TB\\|%%%"
"%\\(NI\\|RX\\|TX\\|AX\\|RB\\|TB\\|AB\\|%%\\)"
(lambda (str)
(cond
((equal str "%NI") (aref vector-data 0)) ; network interface.
((equal str "%RX") (network-speed-add-units (aref vector-data 3) t)) ; received bytes speed.
((equal str "%TX") (network-speed-add-units (aref vector-data 4) t)) ; transmitted bytes speed.
((equal str "%AX") (network-speed-add-units (+ (aref vector-data 3) (aref vector-data 4)) t)) ; received + transmitted speed.
((equal str "%RB") (network-speed-add-units (aref vector-data 1))) ; received bytes.
((equal str "%TB") (network-speed-add-units (aref vector-data 2))) ; transmitted bytes.
((equal str "%AB") (network-speed-add-units (+ (aref vector-data 1) (aref vector-data 2)))) ; received + transmitted bytes.
((equal str "%%%") "%") ; % character.
)
)
network-speed-format-string t t)
)
(defun network-speed-update-handler()
"This function is called every `network-speed-update-interval' seconds to calculate data and show network speed in modeline."
(network-speed-get-rx-tx-bytes)
(setq network-speed-mode-line-string "")
(mapc
(lambda (network-speed-data)
(setq network-speed-mode-line-string
(concat network-speed-mode-line-string
(network-speed-parse-format network-speed-data)))) ; Obtains the string we will show.
network-speed-data-list)
(force-mode-line-update)
(sit-for 0))
(defun network-speed-start ()
"Shows network speed in mode line.
This function initializes all needed data.
Speed is not shown inmediately but after `network-speed-update-interval' seconds when first correct value is calculated."
(interactive)
;; Adding network-speed-mode-line-string to global mode line.
(setq network-speed-mode-line-string "")
(add-to-list 'global-mode-string 'network-speed-mode-line-string t)
;; Initialize all needed vectors in `network-speed-data-list'.
(setq network-speed-data-list ())
(mapc
(lambda (x)
(add-to-list 'network-speed-data-list (vector x 0 0 0 0) t)) ; Initialices and element of network-speed-data list.
network-speed-interface-list)
;; Calculate speeds.
(network-speed-get-rx-tx-bytes)
;; Create network-speed-update-timer.
(and network-speed-update-timer (cancel-timer network-speed-update-timer))
;; This does not inmediately show speeds but it waits `network-speed-update-interval' seconds to start showing it.
(setq network-speed-update-timer (run-at-time network-speed-update-interval network-speed-update-interval 'network-speed-update-handler)))
(defun network-speed-stop ()
"Stops displaying network speed in mode line."
(interactive)
;; Delete the text from global mode line.
(setq global-mode-string (delq 'network-speed-mode-line-string global-mode-string))
;; Cancel timer.
(and network-speed-update-timer (cancel-timer network-speed-update-timer)))
(provide 'network-speed)
;;; filename ends here
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Showing network speed in emacs mode line.
2010-01-19 23:00 Showing network speed in emacs mode line Vicente Hernando Ara
@ 2010-01-20 0:09 ` Ken Hori
2010-01-20 0:31 ` Vicente Hernando Ara
2010-01-20 1:52 ` Juri Linkov
1 sibling, 1 reply; 5+ messages in thread
From: Ken Hori @ 2010-01-20 0:09 UTC (permalink / raw)
To: Vicente Hernando Ara; +Cc: emacs-devel
[-- Attachment #1: Type: text/plain, Size: 1655 bytes --]
interesting elisp. but the only thing that gets appended to modeline is
[eth0 rx:0 B/s tx:0 B/s]
there is no change whatsoever even though i am online (otherwise you wouldnt
receive this email).
On Tue, Jan 19, 2010 at 3:00 PM, Vicente Hernando Ara <bizenton@gmail.com>wrote:
> Hi to all the emacs community!
>
> I have written an elisp file(attached to this mail) that shows network
> speed in emacs mode line.
>
> Just to make it work:
>
> M-x load-file RET /path/to/network-speed.el
> M-x network-speed-start
>
> and to stop it showing in the mode line
> M-x network-speed-stop
>
> There are several customizable variables. e.g in my .emacs file :
> (custom-set-variables
> ....
> '(network-speed-update-interval 2) ; Shows network speed every 2
> seconds.
> '(network-speed-interface-list (list "ppp0" "eth0"))) ; Network
> interfaces to be shown in mode line.
> '(network-speed-precision 1) ; Number of digits to be shown after decimal
> point.
> '(network-speed-format-string " [%NI %AX %AB] ") ; or i.e: "[%NI rx:%RX
> tx:%TX]"
> '(network-speed-interface-list (list "ppp0" "eth0")) ; Network interfaces
> to be shown in mode line.
>
> network-speed-format-string can be customized to show:
> %NI : network interface name
> %RB: received bytes
> %TB: transmitted bytes
> %AB: all received + transmitted bytes.
> %RX: received byte speed.
> %TX: transmitted byte speed.
> %AX: total byte speed.
> %%%: escape secuence for % character.
>
> I hope you test it and enjoy!
> Any constructive criticism is welcomed.
> I also would be glad about signing FSF papers for this file if it is
> considered worthy.
>
> Kind regards,
> Vicente.
>
[-- Attachment #2: Type: text/html, Size: 2098 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Showing network speed in emacs mode line.
2010-01-20 0:09 ` Ken Hori
@ 2010-01-20 0:31 ` Vicente Hernando Ara
2010-01-20 1:34 ` Ken Hori
0 siblings, 1 reply; 5+ messages in thread
From: Vicente Hernando Ara @ 2010-01-20 0:31 UTC (permalink / raw)
To: Ken Hori; +Cc: emacs-devel
Hi Ken,
this elisp program parses /proc/net/dev file searching for the line
containing the interface you selected. Then it gets first and ninth
numbers (for received and transmitted bytes) and performs a
subtraction and a division to calculate speed)
I would check that /proc/net/dev file to know if it changes adequately
when you are online.
I this gives us no clue I would add a (message "hello") to
network-speed-update-handler and network-speed-get-rx-tx-bytes
functions. network-speed-update-handler is the function called every
network-speed-update-interval seconds and
network-speed-get-rx-tx-bytes parses the file and store values in a
list of vectors.
On 20/01/2010, Ken Hori <fplemma@gmail.com> wrote:
> interesting elisp. but the only thing that gets appended to modeline is
>
> [eth0 rx:0 B/s tx:0 B/s]
>
> there is no change whatsoever even though i am online (otherwise you wouldnt
> receive this email).
>
>
> On Tue, Jan 19, 2010 at 3:00 PM, Vicente Hernando Ara
> <bizenton@gmail.com>wrote:
>
>> Hi to all the emacs community!
>>
>> I have written an elisp file(attached to this mail) that shows network
>> speed in emacs mode line.
>>
>> Just to make it work:
>>
>> M-x load-file RET /path/to/network-speed.el
>> M-x network-speed-start
>>
>> and to stop it showing in the mode line
>> M-x network-speed-stop
>>
>> There are several customizable variables. e.g in my .emacs file :
>> (custom-set-variables
>> ....
>> '(network-speed-update-interval 2) ; Shows network speed every 2
>> seconds.
>> '(network-speed-interface-list (list "ppp0" "eth0"))) ; Network
>> interfaces to be shown in mode line.
>> '(network-speed-precision 1) ; Number of digits to be shown after decimal
>> point.
>> '(network-speed-format-string " [%NI %AX %AB] ") ; or i.e: "[%NI rx:%RX
>> tx:%TX]"
>> '(network-speed-interface-list (list "ppp0" "eth0")) ; Network
>> interfaces
>> to be shown in mode line.
>>
>> network-speed-format-string can be customized to show:
>> %NI : network interface name
>> %RB: received bytes
>> %TB: transmitted bytes
>> %AB: all received + transmitted bytes.
>> %RX: received byte speed.
>> %TX: transmitted byte speed.
>> %AX: total byte speed.
>> %%%: escape secuence for % character.
>>
>> I hope you test it and enjoy!
>> Any constructive criticism is welcomed.
>> I also would be glad about signing FSF papers for this file if it is
>> considered worthy.
>>
>> Kind regards,
>> Vicente.
>>
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Showing network speed in emacs mode line.
2010-01-20 0:31 ` Vicente Hernando Ara
@ 2010-01-20 1:34 ` Ken Hori
0 siblings, 0 replies; 5+ messages in thread
From: Ken Hori @ 2010-01-20 1:34 UTC (permalink / raw)
To: Vicente Hernando Ara; +Cc: emacs-devel
[-- Attachment #1: Type: text/plain, Size: 3031 bytes --]
I don't have time to dig into it, but to give you a clue, the target line in
/proc/net/dev is:
eth0:3819769008 3075291 0 0 0 0 0 0
1353810812 2234060 0 0 0 0 0 0
(network-speed-get-rx-tx-bytes)
=> (["eth0" 3819769008 1353810812 0.0 0.0])
I don't think the last two numbers are correct.
On Tue, Jan 19, 2010 at 4:31 PM, Vicente Hernando Ara <bizenton@gmail.com>wrote:
> Hi Ken,
>
> this elisp program parses /proc/net/dev file searching for the line
> containing the interface you selected. Then it gets first and ninth
> numbers (for received and transmitted bytes) and performs a
> subtraction and a division to calculate speed)
>
> I would check that /proc/net/dev file to know if it changes adequately
> when you are online.
>
> I this gives us no clue I would add a (message "hello") to
> network-speed-update-handler and network-speed-get-rx-tx-bytes
> functions. network-speed-update-handler is the function called every
> network-speed-update-interval seconds and
> network-speed-get-rx-tx-bytes parses the file and store values in a
> list of vectors.
>
>
>
> On 20/01/2010, Ken Hori <fplemma@gmail.com> wrote:
> > interesting elisp. but the only thing that gets appended to modeline is
> >
> > [eth0 rx:0 B/s tx:0 B/s]
> >
> > there is no change whatsoever even though i am online (otherwise you
> wouldnt
> > receive this email).
> >
> >
> > On Tue, Jan 19, 2010 at 3:00 PM, Vicente Hernando Ara
> > <bizenton@gmail.com>wrote:
> >
> >> Hi to all the emacs community!
> >>
> >> I have written an elisp file(attached to this mail) that shows network
> >> speed in emacs mode line.
> >>
> >> Just to make it work:
> >>
> >> M-x load-file RET /path/to/network-speed.el
> >> M-x network-speed-start
> >>
> >> and to stop it showing in the mode line
> >> M-x network-speed-stop
> >>
> >> There are several customizable variables. e.g in my .emacs file :
> >> (custom-set-variables
> >> ....
> >> '(network-speed-update-interval 2) ; Shows network speed every 2
> >> seconds.
> >> '(network-speed-interface-list (list "ppp0" "eth0"))) ; Network
> >> interfaces to be shown in mode line.
> >> '(network-speed-precision 1) ; Number of digits to be shown after
> decimal
> >> point.
> >> '(network-speed-format-string " [%NI %AX %AB] ") ; or i.e: "[%NI
> rx:%RX
> >> tx:%TX]"
> >> '(network-speed-interface-list (list "ppp0" "eth0")) ; Network
> >> interfaces
> >> to be shown in mode line.
> >>
> >> network-speed-format-string can be customized to show:
> >> %NI : network interface name
> >> %RB: received bytes
> >> %TB: transmitted bytes
> >> %AB: all received + transmitted bytes.
> >> %RX: received byte speed.
> >> %TX: transmitted byte speed.
> >> %AX: total byte speed.
> >> %%%: escape secuence for % character.
> >>
> >> I hope you test it and enjoy!
> >> Any constructive criticism is welcomed.
> >> I also would be glad about signing FSF papers for this file if it is
> >> considered worthy.
> >>
> >> Kind regards,
> >> Vicente.
> >>
> >
>
[-- Attachment #2: Type: text/html, Size: 4106 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Showing network speed in emacs mode line.
2010-01-19 23:00 Showing network speed in emacs mode line Vicente Hernando Ara
2010-01-20 0:09 ` Ken Hori
@ 2010-01-20 1:52 ` Juri Linkov
1 sibling, 0 replies; 5+ messages in thread
From: Juri Linkov @ 2010-01-20 1:52 UTC (permalink / raw)
To: Vicente Hernando Ara; +Cc: emacs-devel
> I have written an elisp file(attached to this mail) that shows network
> speed in emacs mode line.
Thanks. I tried it out, but it displays only "*invalid*" in the mode line.
It seems that's because `global-mode-string' can be only a string,
not a list of strings. Maybe we should fix `mode-line-format' to allow
a list of strings?
> M-x load-file RET /path/to/network-speed.el
> M-x network-speed-start
>
> and to stop it showing in the mode line
> M-x network-speed-stop
I suggest you to create a minor mode like `display-battery-mode'.
--
Juri Linkov
http://www.jurta.org/emacs/
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2010-01-20 1:52 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-01-19 23:00 Showing network speed in emacs mode line Vicente Hernando Ara
2010-01-20 0:09 ` Ken Hori
2010-01-20 0:31 ` Vicente Hernando Ara
2010-01-20 1:34 ` Ken Hori
2010-01-20 1:52 ` Juri Linkov
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
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).