tmuxで、フォーマット変数にロードアベレージを追加するパッチ

tmux 1.9a用。AIXHP-UXは未対応です。

---
 format.c          |  7 ++++++-
 osdep-aix.c       |  6 ++++++
 osdep-darwin.c    | 11 +++++++++++
 osdep-dragonfly.c | 11 +++++++++++
 osdep-freebsd.c   | 11 +++++++++++
 osdep-hpux.c      |  6 ++++++
 osdep-linux.c     | 17 +++++++++++++++++
 osdep-netbsd.c    | 11 +++++++++++
 osdep-openbsd.c   | 11 +++++++++++
 osdep-sunos.c     | 11 +++++++++++
 osdep-unknown.c   |  6 ++++++
 tmux.1            |  1 +
 tmux.h            |  1 +
 13 files changed, 109 insertions(+), 1 deletion(-)

diff --git a/format.c b/format.c
index 10ac613..396df52 100644
--- a/format.c
+++ b/format.c
@@ -62,7 +62,7 @@ const char *format_upper[] = {
 	"window_index",	/* I */
 	NULL,		/* J */
 	NULL,		/* K */
-	NULL,		/* L */
+	"load_average",	/* L */
 	NULL,		/* M */
 	NULL,		/* N */
 	NULL,		/* O */
@@ -115,6 +115,7 @@ format_create(void)
 {
 	struct format_tree	*ft;
 	char			 host[MAXHOSTNAMELEN], *ptr;
+	double			 la[3];
 
 	ft = xmalloc(sizeof *ft);
 	RB_INIT(ft);
@@ -126,6 +127,10 @@ format_create(void)
 		format_add(ft, "host_short", "%s", host);
 	}
 
+	if (osdep_getloadavg(la) == 0) {
+		format_add(ft, "load_average", "%.2f %.2f %.2f", la[0], la[1], la[2]);
+	}
+
 	return (ft);
 }
 
diff --git a/osdep-aix.c b/osdep-aix.c
index 8d59081..fe1660a 100644
--- a/osdep-aix.c
+++ b/osdep-aix.c
@@ -39,3 +39,9 @@ osdep_event_init(void)
 {
 	return (event_init());
 }
+
+int
+osdep_getloadavg(double la[3])
+{
+	return (1);
+}
diff --git a/osdep-darwin.c b/osdep-darwin.c
index dc60b09..6c01204 100644
--- a/osdep-darwin.c
+++ b/osdep-darwin.c
@@ -27,6 +27,7 @@
 char			*osdep_get_name(int, char *);
 char			*osdep_get_cwd(int);
 struct event_base	*osdep_event_init(void);
+int			 osdep_getloadavg(double [3]);
 
 #define unused __attribute__ ((unused))
 
@@ -78,3 +79,13 @@ osdep_event_init(void)
 	setenv("EVENT_NOPOLL", "1", 1);
 	return (event_init());
 }
+
+int
+osdep_getloadavg(double la[3])
+{
+	if (getloadavg(la, 3) != 3) {
+		return (1);
+	}
+
+	return (0);
+}
diff --git a/osdep-dragonfly.c b/osdep-dragonfly.c
index ad417d9..f22a001 100644
--- a/osdep-dragonfly.c
+++ b/osdep-dragonfly.c
@@ -33,6 +33,7 @@ struct kinfo_proc	*cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
 char			*osdep_get_name(int, char *);
 char			*osdep_get_cwd(int);
 struct event_base	*osdep_event_init(void);
+int			 osdep_getloadavg(double [3]);
 
 #ifndef nitems
 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
@@ -131,3 +132,13 @@ osdep_event_init(void)
 {
 	return (event_init());
 }
+
+int
+osdep_getloadavg(double la[3])
+{
+	if (getloadavg(la, 3) != 3) {
+		return (1);
+	}
+
+	return (0);
+}
diff --git a/osdep-freebsd.c b/osdep-freebsd.c
index d596eab..b44265e 100644
--- a/osdep-freebsd.c
+++ b/osdep-freebsd.c
@@ -35,6 +35,7 @@ struct kinfo_proc	*cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
 char			*osdep_get_name(int, char *);
 char			*osdep_get_cwd(int);
 struct event_base	*osdep_event_init(void);
+int			 osdep_getloadavg(double [3]);
 
 #ifndef nitems
 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
@@ -168,3 +169,13 @@ osdep_event_init(void)
 	setenv("EVENT_NOKQUEUE", "1", 1);
 	return (event_init());
 }
+
+int
+osdep_getloadavg(double la[3])
+{
+	if (getloadavg(la, 3) != 3) {
+		return (1);
+	}
+
+	return (0);
+}
diff --git a/osdep-hpux.c b/osdep-hpux.c
index 352e375..332b6be 100644
--- a/osdep-hpux.c
+++ b/osdep-hpux.c
@@ -39,3 +39,9 @@ osdep_event_init(void)
 {
 	return (event_init());
 }
+
+int
+osdep_getloadavg(double la[3])
+{
+	return (1);
+}
diff --git a/osdep-linux.c b/osdep-linux.c
index ccac267..ed46e71 100644
--- a/osdep-linux.c
+++ b/osdep-linux.c
@@ -18,6 +18,7 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/sysinfo.h>
 
 #include <event.h>
 #include <stdio.h>
@@ -88,3 +89,19 @@ osdep_event_init(void)
 	setenv("EVENT_NOEPOLL", "1", 1);
 	return (event_init());
 }
+
+int
+osdep_getloadavg(double la[3])
+{
+	struct sysinfo sinfo;
+
+	if (sysinfo(&sinfo) != 0) {
+		return (1);
+	}
+
+	la[0] = sinfo.loads[0] / (double) (1 << SI_LOAD_SHIFT);
+	la[1] = sinfo.loads[1] / (double) (1 << SI_LOAD_SHIFT);
+	la[2] = sinfo.loads[2] / (double) (1 << SI_LOAD_SHIFT);
+
+	return (0);
+}
diff --git a/osdep-netbsd.c b/osdep-netbsd.c
index f16d0dc..4e7fa1b 100644
--- a/osdep-netbsd.c
+++ b/osdep-netbsd.c
@@ -36,6 +36,7 @@ struct kinfo_proc2	*cmp_procs(struct kinfo_proc2 *, struct kinfo_proc2 *);
 char			*osdep_get_name(int, char *);
 char			*osdep_get_cwd(int);
 struct event_base	*osdep_event_init(void);
+int			 osdep_getloadavg(double [3]);
 
 struct kinfo_proc2 *
 cmp_procs(struct kinfo_proc2 *p1, struct kinfo_proc2 *p2)
@@ -135,3 +136,13 @@ osdep_event_init(void)
 {
 	return (event_init());
 }
+
+int
+osdep_getloadavg(double la[3])
+{
+	if (getloadavg(la, 3) != 3) {
+		return (1);
+	}
+
+	return (0);
+}
diff --git a/osdep-openbsd.c b/osdep-openbsd.c
index 0a4c144..4badcbf 100644
--- a/osdep-openbsd.c
+++ b/osdep-openbsd.c
@@ -40,6 +40,7 @@ struct kinfo_proc	*cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
 char			*osdep_get_name(int, char *);
 char			*osdep_get_cwd(int);
 struct event_base	*osdep_event_init(void);
+int			 osdep_getloadavg(double [3]);
 
 struct kinfo_proc *
 cmp_procs(struct kinfo_proc *p1, struct kinfo_proc *p2)
@@ -154,3 +155,13 @@ osdep_event_init(void)
 {
 	return (event_init());
 }
+
+int
+osdep_getloadavg(double la[3])
+{
+	if (getloadavg(la, 3) != 3) {
+		return (1);
+	}
+
+	return (0);
+}
diff --git a/osdep-sunos.c b/osdep-sunos.c
index fd644f5..78716a8 100644
--- a/osdep-sunos.c
+++ b/osdep-sunos.c
@@ -18,6 +18,7 @@
 
 #include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/loadavg.h>
 
 #include <event.h>
 #include <fcntl.h>
@@ -90,3 +91,13 @@ osdep_event_init(void)
 {
 	return (event_init());
 }
+
+int
+osdep_getloadavg(double la[3])
+{
+	if (getloadavg(la, 3) != 3) {
+		return (1);
+	}
+
+	return (0);
+}
diff --git a/osdep-unknown.c b/osdep-unknown.c
index 41f435b..0d5f9b5 100644
--- a/osdep-unknown.c
+++ b/osdep-unknown.c
@@ -39,3 +39,9 @@ osdep_event_init(void)
 {
 	return (event_init());
 }
+
+int
+osdep_getloadavg(double la[3])
+{
+	return (1);
+}
diff --git a/tmux.1 b/tmux.1
index 51d927a..160a10c 100644
--- a/tmux.1
+++ b/tmux.1
@@ -3117,6 +3117,7 @@ The following variables are available, where appropriate:
 .It Li "keypad_cursor_flag" Ta "" Ta "Pane keypad cursor flag"
 .It Li "keypad_flag" Ta "" Ta "Pane keypad flag"
 .It Li "line" Ta "" Ta "Line number in the list"
+.It Li "load_average" Ta "#L" Ta "System load averages"
 .It Li "mouse_any_flag" Ta "" Ta "Pane mouse any flag"
 .It Li "mouse_button_flag" Ta "" Ta "Pane mouse button flag"
 .It Li "mouse_standard_flag" Ta "" Ta "Pane mouse standard flag"
diff --git a/tmux.h b/tmux.h
index 7d5f230..1a7db34 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2322,6 +2322,7 @@ u_int	utf8_split2(u_int, u_char *);
 char		*osdep_get_name(int, char *);
 char		*osdep_get_cwd(int);
 struct event_base *osdep_event_init(void);
+int		 osdep_getloadavg(double [3]);
 
 /* log.c */
 void		 log_open(int, const char *);
-- 


2015/7/16追記:

GitHub:kidmin/tmux でぼちぼち。pull requestを送るつもりはないですが、upstreamからは気が向いたら同期してます。