The branch, master has been updated
       via  696b5a628f0f31f4c3566b5c0ab51fbd9f9f9880 (commit)
       via  562af864bd8ab06c416075b5742ce3bbcf6d0610 (commit)
       via  0a1a88d63caf3a0e8b4440686e73e1f0f690e03c (commit)
       via  4c42381410891c43b1326e95f150dfcf637b1e69 (commit)
       via  900f6fc17e6764377a8e293ce742fb41f1add9bd (commit)
       via  30bacf6f3038a867b53143150944f0997558114b (commit)
       via  8a5ceac3a9a21ec70c480d284dc1fc6907af2ce0 (commit)
       via  f5bc85591a1f7c26bf030f5781d63985b2ee4d23 (commit)
       via  7afe417a60a3b80ba16cd758b62e3f500350fb3e (commit)
       via  45dfc5a074e2ceae11a6d4aeae597bee1e028503 (commit)
       via  f0b69c771173583eee8f1457c080746ea6144c5f (commit)
      from  e44bdcce4c661b52d07f30962aafa800d9ca5e28 (commit)

- Log -----------------------------------------------------------------
commit 696b5a628f0f31f4c3566b5c0ab51fbd9f9f9880
Merge: 562af86 e44bdcc
Author: Thomas Adam <[email protected]>
Commit: Thomas Adam <[email protected]>

    Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code



commit 562af864bd8ab06c416075b5742ce3bbcf6d0610
Merge: b6aef24 0a1a88d
Author: Thomas Adam <[email protected]>
Commit: Thomas Adam <[email protected]>

    Merge branch 'obsd-master'
    
    Conflicts:
        Makefile
        cmd-list-commands.c
        cmd-suspend-client.c
        job.c
        tmux.h
        xmalloc.c

 Makefile.am            |    3 -
 arguments.c            |    1 +
 array.h                |    4 +-
 client.c               |   13 ++--
 cmd-attach-session.c   |    1 -
 cmd-bind-key.c         |    1 -
 cmd-break-pane.c       |    3 +-
 cmd-capture-pane.c     |    3 +-
 cmd-choose-buffer.c    |    4 +-
 cmd-choose-client.c    |    7 ++-
 cmd-choose-tree.c      |   12 +++-
 cmd-clear-history.c    |    1 -
 cmd-clock-mode.c       |    1 -
 cmd-command-prompt.c   |   30 --------
 cmd-confirm-before.c   |   22 +-----
 cmd-copy-mode.c        |   10 ---
 cmd-delete-buffer.c    |    1 -
 cmd-detach-client.c    |   18 +++++-
 cmd-display-message.c  |    6 ++-
 cmd-display-panes.c    |    1 -
 cmd-find-window.c      |    6 ++-
 cmd-has-session.c      |    1 -
 cmd-if-shell.c         |    1 -
 cmd-join-pane.c        |   17 -----
 cmd-kill-pane.c        |    1 -
 cmd-kill-server.c      |    2 -
 cmd-kill-session.c     |    1 -
 cmd-kill-window.c      |    1 -
 cmd-link-window.c      |    1 -
 cmd-list-buffers.c     |    4 +-
 cmd-list-clients.c     |    6 ++-
 cmd-list-commands.c    |   54 --------------
 cmd-list-keys.c        |   33 +++++++++-
 cmd-list-panes.c       |    1 -
 cmd-list-sessions.c    |    9 ++-
 cmd-list-windows.c     |   17 ++++-
 cmd-load-buffer.c      |    1 -
 cmd-lock-server.c      |    3 -
 cmd-move-window.c      |    1 -
 cmd-new-session.c      |   17 ++++-
 cmd-new-window.c       |    3 +-
 cmd-paste-buffer.c     |    1 -
 cmd-pipe-pane.c        |    1 -
 cmd-queue.c            |    4 +-
 cmd-refresh-client.c   |    1 -
 cmd-rename-session.c   |    1 -
 cmd-rename-window.c    |    1 -
 cmd-resize-pane.c      |   48 -------------
 cmd-respawn-pane.c     |    1 -
 cmd-respawn-window.c   |    1 -
 cmd-rotate-window.c    |   10 ---
 cmd-run-shell.c        |    1 -
 cmd-save-buffer.c      |    4 +-
 cmd-select-layout.c    |   29 --------
 cmd-select-pane.c      |   19 -----
 cmd-select-window.c    |   19 -----
 cmd-send-keys.c        |    2 -
 cmd-set-buffer.c       |    3 +-
 cmd-set-environment.c  |    1 -
 cmd-set-option.c       |    2 -
 cmd-show-environment.c |    1 -
 cmd-show-messages.c    |    2 -
 cmd-show-options.c     |    2 -
 cmd-source-file.c      |    1 -
 cmd-split-window.c     |   12 +---
 cmd-string.c           |   19 +++---
 cmd-suspend-client.c   |   55 ---------------
 cmd-swap-pane.c        |   12 ---
 cmd-swap-window.c      |    1 -
 cmd-switch-client.c    |   19 -----
 cmd-unbind-key.c       |    1 -
 cmd-unlink-window.c    |    1 -
 cmd-wait-for.c         |    1 -
 cmd.c                  |   99 +++++++++++++++------------
 control.c              |    2 +-
 format.c               |    9 ++-
 grid.c                 |   15 +++--
 input.c                |    4 +-
 job.c                  |    1 +
 key-bindings.c         |  180 +++++++++++++++++++++++-------------------------
 log.c                  |    6 +-
 options.c              |    2 +-
 osdep-cygwin.c         |    2 +-
 osdep-linux.c          |    3 +-
 paste.c                |    2 +-
 screen-write.c         |   28 ++++----
 screen.c               |   10 ++--
 server-client.c        |    1 +
 server-fn.c            |    2 +-
 signal.c               |    2 +
 status.c               |   15 +++--
 style.c                |    2 +
 tmux.1                 |   17 ++---
 tmux.c                 |    7 +-
 tmux.h                 |  126 +++++++---------------------------
 tty-acs.c              |    2 +-
 utf8.c                 |    8 +-
 window-choose.c        |    2 +-
 window-copy.c          |   18 ++++--
 xmalloc.c              |   26 +++++--
 100 files changed, 432 insertions(+), 757 deletions(-)

diff --cc Makefile.am
index 04107ab,0000000..81ef1b2
mode 100644,000000..100644
--- a/Makefile.am
+++ b/Makefile.am
@@@ -1,270 -1,0 +1,267 @@@
 +# $Id$
 +
 +# Obvious program stuff.
 +bin_PROGRAMS = tmux
 +CLEANFILES = tmux.1.mdoc tmux.1.man
 +
 +# Distribution tarball options.
 +EXTRA_DIST = \
 +      CHANGES FAQ README TODO COPYING examples compat \
 +      array.h compat.h tmux.h osdep-*.c mdoc2man.awk tmux.1
 +dist-hook:
 +      make clean
 +      grep "^#found_debug=" configure
 +      find $(distdir) -name .svn -type d|xargs rm -Rf
 +
 +# Preprocessor flags.
 +CPPFLAGS += @XOPEN_DEFINES@ -DTMUX_CONF="\"$(sysconfdir)/tmux.conf\""
 +
 +# glibc as usual does things ass-backwards and hides useful things by default,
 +# so everyone has to add this.
 +if IS_GLIBC
 +CFLAGS += -D_GNU_SOURCE
 +endif
 +
 +# Set flags for gcc. gcc4 whines abouts silly stuff so it needs slightly
 +# different flags.
 +if IS_GCC
 +CFLAGS += -std=gnu99 -O2
 +if IS_DEBUG
 +CFLAGS += -g
 +CFLAGS += -Wno-long-long -Wall -W -Wnested-externs -Wformat=2
 +CFLAGS += -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations
 +CFLAGS += -Wwrite-strings -Wshadow -Wpointer-arith -Wsign-compare
 +CFLAGS += -Wundef -Wbad-function-cast -Winline -Wcast-align
 +CFLAGS += -Wdeclaration-after-statement
 +CPPFLAGS += -DDEBUG
 +endif
 +if IS_GCC4
 +CPPFLAGS += -iquote. -I/usr/local/include
 +if IS_DEBUG
 +CFLAGS += -Wno-pointer-sign
 +endif
 +else
 +CPPFLAGS += -I. -I- -I/usr/local/include
 +endif
 +endif
 +
 +# Set flags for Solaris.
 +if IS_SUNOS
 +if IS_GCC
 +CPPFLAGS += -D_XPG6 -D__EXTENSIONS__ -D_POSIX_PTHREAD_SEMANTICS
 +else
 +CPPFLAGS += -D_XPG4_2 -D__EXTENSIONS__ -D_POSIX_PTHREAD_SEMANTICS
 +endif
 +endif
 +
 +# Set flags for Sun CC.
 +if IS_SUNCC
 +CFLAGS += -erroff=E_EMPTY_DECLARATION
 +endif
 +
 +# List of sources.
 +dist_tmux_SOURCES = \
 +      arguments.c \
 +      attributes.c \
 +      cfg.c \
 +      client.c \
 +      cmd-attach-session.c \
 +      cmd-bind-key.c \
 +      cmd-break-pane.c \
 +      cmd-capture-pane.c \
 +      cmd-choose-buffer.c \
 +      cmd-choose-client.c \
 +      cmd-choose-tree.c \
 +      cmd-clear-history.c \
 +      cmd-clock-mode.c \
 +      cmd-command-prompt.c \
 +      cmd-confirm-before.c \
 +      cmd-copy-mode.c \
 +      cmd-delete-buffer.c \
 +      cmd-detach-client.c \
 +      cmd-display-message.c \
 +      cmd-display-panes.c \
 +      cmd-find-window.c \
-       cmd-has-session.c \
 +      cmd-if-shell.c \
 +      cmd-join-pane.c \
 +      cmd-kill-pane.c \
 +      cmd-kill-server.c \
 +      cmd-kill-session.c \
 +      cmd-kill-window.c \
 +      cmd-link-window.c \
 +      cmd-list-buffers.c \
 +      cmd-list-clients.c \
-       cmd-list-commands.c \
 +      cmd-list-keys.c \
 +      cmd-list-panes.c \
 +      cmd-list-sessions.c \
 +      cmd-list-windows.c \
 +      cmd-list.c \
 +      cmd-load-buffer.c \
 +      cmd-lock-server.c \
 +      cmd-move-window.c \
 +      cmd-new-session.c \
 +      cmd-new-window.c \
 +      cmd-paste-buffer.c \
 +      cmd-pipe-pane.c \
 +      cmd-queue.c \
 +      cmd-refresh-client.c \
 +      cmd-rename-session.c \
 +      cmd-rename-window.c \
 +      cmd-resize-pane.c \
 +      cmd-respawn-pane.c \
 +      cmd-respawn-window.c \
 +      cmd-rotate-window.c \
 +      cmd-run-shell.c \
 +      cmd-save-buffer.c \
 +      cmd-select-layout.c \
 +      cmd-select-pane.c \
 +      cmd-select-window.c \
 +      cmd-send-keys.c \
 +      cmd-set-buffer.c \
 +      cmd-set-environment.c \
 +      cmd-set-option.c \
 +      cmd-show-environment.c \
 +      cmd-show-messages.c \
 +      cmd-show-options.c \
 +      cmd-source-file.c \
 +      cmd-split-window.c \
 +      cmd-string.c \
-       cmd-suspend-client.c \
 +      cmd-swap-pane.c \
 +      cmd-swap-window.c \
 +      cmd-switch-client.c \
 +      cmd-unbind-key.c \
 +      cmd-unlink-window.c \
 +      cmd-wait-for.c \
 +      cmd.c \
 +      colour.c \
 +      control.c \
 +      control-notify.c \
 +      environ.c \
 +      format.c \
 +      grid-cell.c \
 +      grid-view.c \
 +      grid.c \
 +      input-keys.c \
 +      input.c \
 +      job.c \
 +      key-bindings.c \
 +      key-string.c \
 +      layout-custom.c \
 +      layout-set.c \
 +      layout.c \
 +      log.c \
 +      mode-key.c \
 +      names.c \
 +      notify.c \
 +      options-table.c \
 +      options.c \
 +      paste.c \
 +      resize.c \
 +      screen-redraw.c \
 +      screen-write.c \
 +      screen.c \
 +      server-client.c \
 +      server-fn.c \
 +      server-window.c \
 +      server.c \
 +      session.c \
 +      signal.c \
 +      status.c \
 +      style.c \
 +      tmux.c \
 +      tty-acs.c \
 +      tty-keys.c \
 +      tty-term.c \
 +      tty.c \
 +      utf8.c \
 +      window-choose.c \
 +      window-clock.c \
 +      window-copy.c \
 +      window.c \
 +      xmalloc.c \
 +      xterm-keys.c
 +nodist_tmux_SOURCES = osdep-@[email protected]
 +
 +# Pile in all the compat/ stuff that is needed.
 +if NO_FORKPTY
 +nodist_tmux_SOURCES += compat/forkpty-@[email protected]
 +endif
 +if NO_IMSG
 +nodist_tmux_SOURCES += compat/imsg.c compat/imsg-buffer.c
 +endif
 +if NO_CLOSEFROM
 +nodist_tmux_SOURCES += compat/closefrom.c
 +endif
 +if NO_DAEMON
 +nodist_tmux_SOURCES += compat/daemon.c
 +endif
 +if NO_SETENV
 +nodist_tmux_SOURCES += compat/setenv.c
 +endif
 +if NO_STRLCAT
 +nodist_tmux_SOURCES += compat/strlcat.c
 +endif
 +if NO_STRLCPY
 +nodist_tmux_SOURCES += compat/strlcpy.c
 +endif
 +if NO_ASPRINTF
 +nodist_tmux_SOURCES += compat/asprintf.c
 +endif
 +if NO_FGETLN
 +nodist_tmux_SOURCES += compat/fgetln.c
 +endif
 +if NO_FPARSELN
 +nodist_tmux_SOURCES += compat/fparseln.c
 +endif
 +if NO_GETOPT
 +nodist_tmux_SOURCES += compat/getopt.c
 +endif
 +if NO_STRCASESTR
 +nodist_tmux_SOURCES += compat/strcasestr.c
 +endif
 +if NO_STRSEP
 +nodist_tmux_SOURCES += compat/strsep.c
 +endif
 +if NO_VIS
 +nodist_tmux_SOURCES += compat/vis.c compat/unvis.c
 +endif
 +if NO_STRTONUM
 +nodist_tmux_SOURCES += compat/strtonum.c
 +endif
 +if NO_B64_NTOP
 +nodist_tmux_SOURCES += compat/b64_ntop.c
 +endif
 +if NO_CFMAKERAW
 +nodist_tmux_SOURCES += compat/cfmakeraw.c
 +endif
 +if NO_OPENAT
 +nodist_tmux_SOURCES += compat/openat.c
 +endif
 +
 +# Install tmux.1 in the right format.
 +install-exec-hook:
 +      if test x@MANFORMAT@ = xmdoc; then \
 +              sed -e "s|@SYSCONFDIR@|$(sysconfdir)|g" $(srcdir)/tmux.1 \
 +                      >$(srcdir)/tmux.1.mdoc; \
 +      else \
 +              sed -e "s|@SYSCONFDIR@|$(sysconfdir)|g" $(srcdir)/tmux.1| \
 +                      $(AWK) -f$(srcdir)/mdoc2man.awk >$(srcdir)/tmux.1.man; \
 +      fi
 +      $(mkdir_p) $(DESTDIR)$(mandir)/man1
 +      $(INSTALL_DATA) $(srcdir)/tmux.1.@MANFORMAT@ \
 +              $(DESTDIR)$(mandir)/man1/tmux.1
 +
 +# Update SF web site.
 +upload-index.html: update-index.html
 +      scp www/index.html www/main.css www/images/*.png \
 +              ${USER},[email protected]:/home/groups/t/tm/tmux/htdocs
 +      rm -f www/index.html www/images/small-*
 +
 +update-index.html:
 +      (cd www/images && \
 +              rm -f small-* && \
 +              for i in *.png; do \
 +                      convert "$$i" -resize 200x150 "small-$$i"; \
 +              done \
 +      )
 +      sed "s/%%RELEASE%%/${RELEASE}/g" www/index.html.in >www/index.html
diff --cc format.c
index baf23ec,b5e5149..105212a
--- a/format.c
+++ b/format.c
@@@ -17,6 -17,6 +17,7 @@@
   */
  
  #include <sys/types.h>
++#include <sys/param.h>
  
  #include <ctype.h>
  #include <errno.h>
diff --cc job.c
index 47f25d0,c04a70b..d01472b
--- a/job.c
+++ b/job.c
@@@ -23,6 -23,8 +23,7 @@@
  #include <stdlib.h>
  #include <string.h>
  #include <unistd.h>
++#include <signal.h>
  
  #include "tmux.h"
  
diff --cc osdep-cygwin.c
index 01d2d0c,0000000..f28df37
mode 100644,000000..100644
--- a/osdep-cygwin.c
+++ b/osdep-cygwin.c
@@@ -1,88 -1,0 +1,88 @@@
 +/* $Id$ */
 +
 +/*
 + * Copyright (c) 2009 Nicholas Marriott <[email protected]>
 + *
 + * Permission to use, copy, modify, and distribute this software for any
 + * purpose with or without fee is hereby granted, provided that the above
 + * copyright notice and this permission notice appear in all copies.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
 + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 + */
 +
 +#include <sys/types.h>
 +#include <sys/stat.h>
 +
 +#include <event.h>
 +#include <stdio.h>
 +#include <stdlib.h>
 +#include <unistd.h>
 +
 +#include "tmux.h"
 +
 +char *
 +osdep_get_name(int fd, unused char *tty)
 +{
 +      FILE    *f;
 +      char    *path, *buf;
 +      size_t   len;
 +      int      ch;
 +      pid_t    pgrp;
 +
 +      if ((pgrp = tcgetpgrp(fd)) == -1)
 +              return (NULL);
 +
 +      xasprintf(&path, "/proc/%lld/cmdline", (long long) pgrp);
 +      if ((f = fopen(path, "r")) == NULL) {
 +              free(path);
 +              return (NULL);
 +      }
 +      free(path);
 +
 +      len = 0;
 +      buf = NULL;
 +      while ((ch = fgetc(f)) != EOF) {
 +              if (ch == '\0')
 +                      break;
-               buf = xrealloc(buf, 1, len + 2);
++              buf = xrealloc(buf, len + 2);
 +              buf[len++] = ch;
 +      }
 +      if (buf != NULL)
 +              buf[len] = '\0';
 +
 +      fclose(f);
 +      return (buf);
 +}
 +
 +char *
 +osdep_get_cwd(int fd)
 +{
 +      static char      target[MAXPATHLEN + 1];
 +      char            *path;
 +      pid_t            pgrp;
 +      ssize_t          n;
 +
 +      if ((pgrp = tcgetpgrp(fd)) == -1)
 +              return (NULL);
 +
 +      xasprintf(&path, "/proc/%lld/cwd", (long long) pgrp);
 +      n = readlink(path, target, MAXPATHLEN);
 +      free(path);
 +      if (n > 0) {
 +              target[n] = '\0';
 +              return (target);
 +      }
 +      return (NULL);
 +}
 +
 +struct event_base *
 +osdep_event_init(void)
 +{
 +      return (event_init());
 +}
diff --cc osdep-linux.c
index 46aea68,0000000..1850d51
mode 100644,000000..100644
--- a/osdep-linux.c
+++ b/osdep-linux.c
@@@ -1,97 -1,0 +1,98 @@@
 +/* $Id$ */
 +
 +/*
 + * Copyright (c) 2009 Nicholas Marriott <[email protected]>
 + *
 + * Permission to use, copy, modify, and distribute this software for any
 + * purpose with or without fee is hereby granted, provided that the above
 + * copyright notice and this permission notice appear in all copies.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
 + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 + */
 +
 +#include <sys/types.h>
 +#include <sys/stat.h>
++#include <sys/param.h>
 +
 +#include <event.h>
 +#include <stdio.h>
 +#include <stdlib.h>
 +#include <unistd.h>
 +
 +#include "tmux.h"
 +
 +char *
 +osdep_get_name(int fd, unused char *tty)
 +{
 +      FILE    *f;
 +      char    *path, *buf;
 +      size_t   len;
 +      int      ch;
 +      pid_t    pgrp;
 +
 +      if ((pgrp = tcgetpgrp(fd)) == -1)
 +              return (NULL);
 +
 +      xasprintf(&path, "/proc/%lld/cmdline", (long long) pgrp);
 +      if ((f = fopen(path, "r")) == NULL) {
 +              free(path);
 +              return (NULL);
 +      }
 +      free(path);
 +
 +      len = 0;
 +      buf = NULL;
 +      while ((ch = fgetc(f)) != EOF) {
 +              if (ch == '\0')
 +                      break;
-               buf = xrealloc(buf, 1, len + 2);
++              buf = xrealloc(buf, len + 2);
 +              buf[len++] = ch;
 +      }
 +      if (buf != NULL)
 +              buf[len] = '\0';
 +
 +      fclose(f);
 +      return (buf);
 +}
 +
 +char *
 +osdep_get_cwd(int fd)
 +{
 +      static char      target[MAXPATHLEN + 1];
 +      char            *path;
 +      pid_t            pgrp, sid;
 +      ssize_t          n;
 +
 +      if ((pgrp = tcgetpgrp(fd)) == -1)
 +              return (NULL);
 +
 +      xasprintf(&path, "/proc/%lld/cwd", (long long) pgrp);
 +      n = readlink(path, target, MAXPATHLEN);
 +      free(path);
 +
 +      if (n == -1 && ioctl(fd, TIOCGSID, &sid) != -1) {
 +              xasprintf(&path, "/proc/%lld/cwd", (long long) sid);
 +              n = readlink(path, target, MAXPATHLEN);
 +              free(path);
 +      }
 +
 +      if (n > 0) {
 +              target[n] = '\0';
 +              return (target);
 +      }
 +      return (NULL);
 +}
 +
 +struct event_base *
 +osdep_event_init(void)
 +{
 +      /* On Linux, epoll doesn't work on /dev/null (yes, really). */
 +      setenv("EVENT_NOEPOLL", "1", 1);
 +      return (event_init());
 +}
diff --cc tmux.c
index 631e850,fabcee5..7669d12
--- a/tmux.c
+++ b/tmux.c
@@@ -22,7 -22,9 +22,8 @@@
  #include <errno.h>
  #include <event.h>
  #include <fcntl.h>
+ #include <getopt.h>
  #include <locale.h>
 -#include <paths.h>
  #include <pwd.h>
  #include <stdlib.h>
  #include <string.h>
diff --cc tmux.h
index 5ffc07c,1180398..f35c4e5
--- a/tmux.h
+++ b/tmux.h
@@@ -21,14 -21,17 +21,12 @@@
  
  #define PROTOCOL_VERSION 8
  
- #include <sys/param.h>
  #include <sys/time.h>
 -#include <sys/queue.h>
 -#include <sys/tree.h>
  #include <sys/uio.h>
  
 -#include <bitstring.h>
  #include <event.h>
 -#include <imsg.h>
  #include <limits.h>
- #include <signal.h>
  #include <stdarg.h>
 -#include <stdint.h>
  #include <stdio.h>
  #include <termios.h>
  


commit 0a1a88d63caf3a0e8b4440686e73e1f0f690e03c
Author: nicm <nicm>
Commit: nicm <nicm>

    Better format for printf format attributes.
---
 cmd-queue.c    |    4 ++--
 control.c      |    2 +-
 log.c          |    6 +++---
 options.c      |    2 +-
 screen-write.c |   26 +++++++++++++-------------
 status.c       |    2 +-
 tmux.h         |   46 +++++++++++++++++++++-------------------------
 xmalloc.c      |    4 ++--
 8 files changed, 44 insertions(+), 48 deletions(-)

diff --git a/cmd-queue.c b/cmd-queue.c
index 77460b2..6495d3f 100644
--- a/cmd-queue.c
+++ b/cmd-queue.c
@@ -57,7 +57,7 @@ cmdq_free(struct cmd_q *cmdq)
 }
 
 /* Show message from command. */
-void printflike2
+void
 cmdq_print(struct cmd_q *cmdq, const char *fmt, ...)
 {
        struct client   *c = cmdq->client;
@@ -87,7 +87,7 @@ cmdq_print(struct cmd_q *cmdq, const char *fmt, ...)
 }
 
 /* Show error from command. */
-void printflike2
+void
 cmdq_error(struct cmd_q *cmdq, const char *fmt, ...)
 {
        struct client   *c = cmdq->client;
diff --git a/control.c b/control.c
index 8e24fd0..0ace6c1 100644
--- a/control.c
+++ b/control.c
@@ -27,7 +27,7 @@
 #include "tmux.h"
 
 /* Write a line. */
-void printflike2
+void
 control_write(struct client *c, const char *fmt, ...)
 {
        va_list          ap;
diff --git a/log.c b/log.c
index f329107..b266d5a 100644
--- a/log.c
+++ b/log.c
@@ -80,7 +80,7 @@ log_vwrite(const char *msg, va_list ap)
 }
 
 /* Log a debug message. */
-void printflike1
+void
 log_debug(const char *msg, ...)
 {
        va_list ap;
@@ -91,7 +91,7 @@ log_debug(const char *msg, ...)
 }
 
 /* Log a critical error with error string and die. */
-__dead void printflike1
+__dead void
 log_fatal(const char *msg, ...)
 {
        char    *fmt;
@@ -105,7 +105,7 @@ log_fatal(const char *msg, ...)
 }
 
 /* Log a critical error and die. */
-__dead void printflike1
+__dead void
 log_fatalx(const char *msg, ...)
 {
        char    *fmt;
diff --git a/options.c b/options.c
index 699dd9b..67f8abd 100644
--- a/options.c
+++ b/options.c
@@ -99,7 +99,7 @@ options_remove(struct options *oo, const char *name)
        free(o);
 }
 
-struct options_entry *printflike3
+struct options_entry *
 options_set_string(struct options *oo, const char *name, const char *fmt, ...)
 {
        struct options_entry    *o;
diff --git a/screen-write.c b/screen-write.c
index 094ea81..37e2b54 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -25,13 +25,13 @@
 
 void   screen_write_initctx(struct screen_write_ctx *, struct tty_ctx *, int);
 void   screen_write_overwrite(struct screen_write_ctx *, u_int);
-int    screen_write_combine(
-           struct screen_write_ctx *, const struct utf8_data *);
+int    screen_write_combine(struct screen_write_ctx *,
+           const struct utf8_data *);
 
 /* Initialise writing with a window. */
 void
-screen_write_start(
-    struct screen_write_ctx *ctx, struct window_pane *wp, struct screen *s)
+screen_write_start(struct screen_write_ctx *ctx, struct window_pane *wp,
+    struct screen *s)
 {
        ctx->wp = wp;
        if (wp != NULL && s == NULL)
@@ -73,7 +73,7 @@ screen_write_putc(struct screen_write_ctx *ctx, struct 
grid_cell *gc,
 }
 
 /* Calculate string length, with embedded formatting. */
-size_t printflike2
+size_t
 screen_write_cstrlen(int utf8flag, const char *fmt, ...)
 {
        va_list ap;
@@ -108,7 +108,7 @@ screen_write_cstrlen(int utf8flag, const char *fmt, ...)
 }
 
 /* Calculate string length. */
-size_t printflike2
+size_t
 screen_write_strlen(int utf8flag, const char *fmt, ...)
 {
        va_list                 ap;
@@ -145,9 +145,9 @@ screen_write_strlen(int utf8flag, const char *fmt, ...)
 }
 
 /* Write simple string (no UTF-8 or maximum length). */
-void printflike3
-screen_write_puts(
-    struct screen_write_ctx *ctx, struct grid_cell *gc, const char *fmt, ...)
+void
+screen_write_puts(struct screen_write_ctx *ctx, struct grid_cell *gc,
+    const char *fmt, ...)
 {
        va_list ap;
 
@@ -157,9 +157,9 @@ screen_write_puts(
 }
 
 /* Write string with length limit (-1 for unlimited). */
-void printflike5
-screen_write_nputs(struct screen_write_ctx *ctx,
-    ssize_t maxlen, struct grid_cell *gc, int utf8flag, const char *fmt, ...)
+void
+screen_write_nputs(struct screen_write_ctx *ctx, ssize_t maxlen,
+    struct grid_cell *gc, int utf8flag, const char *fmt, ...)
 {
        va_list ap;
 
@@ -221,7 +221,7 @@ screen_write_vnputs(struct screen_write_ctx *ctx, ssize_t 
maxlen,
 }
 
 /* Write string, similar to nputs, but with embedded formatting (#[]). */
-void printflike5
+void
 screen_write_cnputs(struct screen_write_ctx *ctx,
     ssize_t maxlen, struct grid_cell *gc, int utf8flag, const char *fmt, ...)
 {
diff --git a/status.c b/status.c
index 70e0551..287039e 100644
--- a/status.c
+++ b/status.c
@@ -651,7 +651,7 @@ status_print(
 }
 
 /* Set a status line message. */
-void printflike2
+void
 status_message_set(struct client *c, const char *fmt, ...)
 {
        struct timeval           tv;
diff --git a/tmux.h b/tmux.h
index 7ad6e62..1180398 100644
--- a/tmux.h
+++ b/tmux.h
@@ -69,11 +69,7 @@ extern char   **environ;
 #define unused __attribute__ ((unused))
 
 /* Attribute to make gcc check printf-like arguments. */
-#define printflike1 __attribute__ ((format (printf, 1, 2)))
-#define printflike2 __attribute__ ((format (printf, 2, 3)))
-#define printflike3 __attribute__ ((format (printf, 3, 4)))
-#define printflike4 __attribute__ ((format (printf, 4, 5)))
-#define printflike5 __attribute__ ((format (printf, 5, 6)))
+#define printflike(a, b) __attribute__ ((format (printf, a, b)))
 
 /* Number of items in array. */
 #ifndef nitems
@@ -1515,8 +1511,8 @@ int                format_cmp(struct format_entry *, 
struct format_entry *);
 RB_PROTOTYPE(format_tree, format_entry, entry, format_cmp);
 struct format_tree *format_create(void);
 void            format_free(struct format_tree *);
-void printflike3 format_add(struct format_tree *, const char *, const char *,
-                    ...);
+void printflike(3, 4) format_add(struct format_tree *, const char *,
+                    const char *, ...);
 const char     *format_find(struct format_tree *, const char *);
 char           *format_expand(struct format_tree *, const char *);
 void            format_session(struct format_tree *, struct session *);
@@ -1569,7 +1565,7 @@ void      options_free(struct options *);
 struct options_entry *options_find1(struct options *, const char *);
 struct options_entry *options_find(struct options *, const char *);
 void   options_remove(struct options *, const char *);
-struct options_entry *printflike3 options_set_string(struct options *,
+struct options_entry *printflike(3, 4) options_set_string(struct options *,
            const char *, const char *, ...);
 char   *options_get_string(struct options *, const char *);
 struct options_entry *options_set_number(struct options *, const char *,
@@ -1836,8 +1832,8 @@ size_t             cmd_list_print(struct cmd_list *, char 
*, size_t);
 /* cmd-queue.c */
 struct cmd_q   *cmdq_new(struct client *);
 int             cmdq_free(struct cmd_q *);
-void printflike2 cmdq_print(struct cmd_q *, const char *, ...);
-void printflike2 cmdq_error(struct cmd_q *, const char *, ...);
+void printflike(2, 3) cmdq_print(struct cmd_q *, const char *, ...);
+void printflike(2, 3) cmdq_error(struct cmd_q *, const char *, ...);
 int             cmdq_guard(struct cmd_q *, const char *, int);
 void            cmdq_run(struct cmd_q *, struct cmd_list *);
 void            cmdq_append(struct cmd_q *, struct cmd_list *);
@@ -1932,9 +1928,9 @@ void       status_free_jobs(struct status_out_tree *);
 void    status_update_jobs(struct client *);
 void    status_set_window_at(struct client *, u_int);
 int     status_redraw(struct client *);
-char   *status_replace(struct client *, struct session *,
-            struct winlink *, struct window_pane *, const char *, time_t, int);
-void printflike2 status_message_set(struct client *, const char *, ...);
+char   *status_replace(struct client *, struct session *, struct winlink *,
+            struct window_pane *, const char *, time_t, int);
+void printflike(2, 3) status_message_set(struct client *, const char *, ...);
 void    status_message_clear(struct client *);
 int     status_message_redraw(struct client *);
 void    status_prompt_set(struct client *, const char *, const char *,
@@ -2024,13 +2020,13 @@ void     screen_write_start(
             struct screen_write_ctx *, struct window_pane *, struct screen *);
 void    screen_write_stop(struct screen_write_ctx *);
 void    screen_write_reset(struct screen_write_ctx *);
-size_t printflike2 screen_write_cstrlen(int, const char *, ...);
-void printflike5 screen_write_cnputs(struct screen_write_ctx *,
+size_t printflike(2, 3) screen_write_cstrlen(int, const char *, ...);
+void printflike(5, 6) screen_write_cnputs(struct screen_write_ctx *,
             ssize_t, struct grid_cell *, int, const char *, ...);
-size_t printflike2 screen_write_strlen(int, const char *, ...);
-void printflike3 screen_write_puts(struct screen_write_ctx *,
+size_t printflike(2, 3) screen_write_strlen(int, const char *, ...);
+void printflike(3, 4) screen_write_puts(struct screen_write_ctx *,
             struct grid_cell *, const char *, ...);
-void printflike5 screen_write_nputs(struct screen_write_ctx *,
+void printflike(5, 6) screen_write_nputs(struct screen_write_ctx *,
             ssize_t, struct grid_cell *, int, const char *, ...);
 void    screen_write_vnputs(struct screen_write_ctx *,
             ssize_t, struct grid_cell *, int, const char *, va_list);
@@ -2214,7 +2210,7 @@ extern const char window_clock_table[14][5][5];
 extern const struct window_mode window_copy_mode;
 void            window_copy_init_from_pane(struct window_pane *);
 void            window_copy_init_for_output(struct window_pane *);
-void printflike2 window_copy_add(struct window_pane *, const char *, ...);
+void printflike(2, 3) window_copy_add(struct window_pane *, const char *, ...);
 void            window_copy_vadd(struct window_pane *, const char *, va_list);
 void            window_copy_pageup(struct window_pane *);
 
@@ -2253,7 +2249,7 @@ void      clear_signals(int);
 
 /* control.c */
 void   control_callback(struct client *, int, void *);
-void printflike2 control_write(struct client *, const char *, ...);
+void printflike(2, 3) control_write(struct client *, const char *, ...);
 void   control_write_buffer(struct client *, struct evbuffer *);
 
 /* control-notify.c */
@@ -2324,9 +2320,9 @@ char   *get_proc_name(int, char *);
 /* log.c */
 void            log_open(const char *);
 void            log_close(void);
-void printflike1 log_debug(const char *, ...);
-__dead void printflike1 log_fatal(const char *, ...);
-__dead void printflike1 log_fatalx(const char *, ...);
+void printflike(1, 2) log_debug(const char *, ...);
+__dead void printflike(1, 2) log_fatal(const char *, ...);
+__dead void printflike(1, 2) log_fatalx(const char *, ...);
 
 /* xmalloc.c */
 char           *xstrdup(const char *);
@@ -2334,9 +2330,9 @@ void              *xcalloc(size_t, size_t);
 void           *xmalloc(size_t);
 void           *xrealloc(void *, size_t);
 void           *xreallocarray(void *, size_t, size_t);
-int printflike2         xasprintf(char **, const char *, ...);
+int printflike(2, 3) xasprintf(char **, const char *, ...);
 int             xvasprintf(char **, const char *, va_list);
-int printflike3         xsnprintf(char *, size_t, const char *, ...);
+int printflike(3, 4) xsnprintf(char *, size_t, const char *, ...);
 int             xvsnprintf(char *, size_t, const char *, va_list);
 
 /* style.c */
diff --git a/xmalloc.c b/xmalloc.c
index b7331ea..b1570a3 100644
--- a/xmalloc.c
+++ b/xmalloc.c
@@ -94,7 +94,7 @@ xreallocarray(void *oldptr, size_t nmemb, size_t size)
        return (newptr);
 }
 
-int printflike2
+int
 xasprintf(char **ret, const char *fmt, ...)
 {
        va_list ap;
@@ -119,7 +119,7 @@ xvasprintf(char **ret, const char *fmt, va_list ap)
        return (i);
 }
 
-int printflike3
+int
 xsnprintf(char *buf, size_t len, const char *fmt, ...)
 {
        va_list ap;


commit 4c42381410891c43b1326e95f150dfcf637b1e69
Author: nicm <nicm>
Commit: nicm <nicm>

    Move template defines back into .c files.
---
 cmd-break-pane.c      |    2 +
 cmd-choose-buffer.c   |    3 ++
 cmd-choose-client.c   |    6 ++++
 cmd-choose-tree.c     |    9 ++++++
 cmd-display-message.c |    5 +++
 cmd-find-window.c     |    5 +++
 cmd-list-buffers.c    |    3 ++
 cmd-list-clients.c    |    5 +++
 cmd-list-sessions.c   |    8 +++++
 cmd-list-windows.c    |   16 +++++++++-
 cmd-new-session.c     |   16 +++++++++++
 cmd-new-window.c      |    2 +
 cmd-split-window.c    |    2 +
 tmux.h                |   72 -------------------------------------------------
 14 files changed, 80 insertions(+), 74 deletions(-)

diff --git a/cmd-break-pane.c b/cmd-break-pane.c
index 5e7ecd0..0025167 100644
--- a/cmd-break-pane.c
+++ b/cmd-break-pane.c
@@ -26,6 +26,8 @@
  * Break pane off into a window.
  */
 
+#define BREAK_PANE_TEMPLATE "#{session_name}:#{window_index}.#{pane_index}"
+
 enum cmd_retval         cmd_break_pane_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_break_pane_entry = {
diff --git a/cmd-choose-buffer.c b/cmd-choose-buffer.c
index de4855a..19f5fba 100644
--- a/cmd-choose-buffer.c
+++ b/cmd-choose-buffer.c
@@ -27,6 +27,9 @@
  * Enter choice mode to choose a buffer.
  */
 
+#define CHOOSE_BUFFER_TEMPLATE                                         \
+       "#{buffer_name}: #{buffer_size} bytes: #{buffer_sample}"
+
 enum cmd_retval         cmd_choose_buffer_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_choose_buffer_entry = {
diff --git a/cmd-choose-client.c b/cmd-choose-client.c
index be3d405..5a1892f 100644
--- a/cmd-choose-client.c
+++ b/cmd-choose-client.c
@@ -27,6 +27,12 @@
  * Enter choice mode to choose a client.
  */
 
+#define CHOOSE_CLIENT_TEMPLATE                                 \
+       "#{client_tty}: #{session_name} "                       \
+       "[#{client_width}x#{client_height} #{client_termname}]" \
+       "#{?client_utf8, (utf8),}#{?client_readonly, (ro),} "   \
+       "(last used #{client_activity_string})"
+
 enum cmd_retval         cmd_choose_client_exec(struct cmd *, struct cmd_q *);
 
 void   cmd_choose_client_callback(struct window_choose_data *);
diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c
index eee49cc..823d042 100644
--- a/cmd-choose-tree.c
+++ b/cmd-choose-tree.c
@@ -32,6 +32,15 @@
  * Enter choice mode to choose a session and/or window.
  */
 
+#define CHOOSE_TREE_SESSION_TEMPLATE                           \
+       "#{session_name}: #{session_windows} windows"           \
+       "#{?session_grouped, (group ,}"                         \
+       "#{session_group}#{?session_grouped,),}"                \
+       "#{?session_attached, (attached),}"
+#define CHOOSE_TREE_WINDOW_TEMPLATE                            \
+       "#{window_index}: #{window_name}#{window_flags} "       \
+       "\"#{pane_title}\""
+
 enum cmd_retval        cmd_choose_tree_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_choose_tree_entry = {
diff --git a/cmd-display-message.c b/cmd-display-message.c
index dc4290e..f3547b0 100644
--- a/cmd-display-message.c
+++ b/cmd-display-message.c
@@ -27,6 +27,11 @@
  * Displays a message in the status line.
  */
 
+#define DISPLAY_MESSAGE_TEMPLATE                       \
+       "[#{session_name}] #{window_index}:"            \
+       "#{window_name}, current pane #{pane_index} "   \
+       "- (%H:%M %d-%b-%y)"
+
 enum cmd_retval         cmd_display_message_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_display_message_entry = {
diff --git a/cmd-find-window.c b/cmd-find-window.c
index f1fc5f5..deacf99 100644
--- a/cmd-find-window.c
+++ b/cmd-find-window.c
@@ -28,6 +28,11 @@
  * Find window containing text.
  */
 
+#define FIND_WINDOW_TEMPLATE                                   \
+       "#{window_index}: #{window_name} "                      \
+       "[#{window_width}x#{window_height}] "                   \
+       "(#{window_panes} panes) #{window_find_matches}"
+
 enum cmd_retval         cmd_find_window_exec(struct cmd *, struct cmd_q *);
 
 void   cmd_find_window_callback(struct window_choose_data *);
diff --git a/cmd-list-buffers.c b/cmd-list-buffers.c
index 25f7e8b..8eb1610 100644
--- a/cmd-list-buffers.c
+++ b/cmd-list-buffers.c
@@ -27,6 +27,9 @@
  * List paste buffers.
  */
 
+#define LIST_BUFFERS_TEMPLATE                                          \
+       "#{buffer_name}: #{buffer_size} bytes: \"#{buffer_sample}\""
+
 enum cmd_retval         cmd_list_buffers_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_list_buffers_entry = {
diff --git a/cmd-list-clients.c b/cmd-list-clients.c
index 0cfbdfa..292be72 100644
--- a/cmd-list-clients.c
+++ b/cmd-list-clients.c
@@ -28,6 +28,11 @@
  * List all clients.
  */
 
+#define LIST_CLIENTS_TEMPLATE                                  \
+       "#{client_tty}: #{session_name} "                       \
+       "[#{client_width}x#{client_height} #{client_termname}]" \
+       "#{?client_utf8, (utf8),} #{?client_readonly, (ro),}"
+
 enum cmd_retval        cmd_list_clients_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_list_clients_entry = {
diff --git a/cmd-list-sessions.c b/cmd-list-sessions.c
index f0a7c53..ea8f3e3 100644
--- a/cmd-list-sessions.c
+++ b/cmd-list-sessions.c
@@ -28,6 +28,14 @@
  * List all sessions.
  */
 
+#define LIST_SESSIONS_TEMPLATE                         \
+       "#{session_name}: #{session_windows} windows "  \
+       "(created #{session_created_string}) "          \
+       "[#{session_width}x#{session_height}]"          \
+       "#{?session_grouped, (group ,}"                 \
+       "#{session_group}#{?session_grouped,),}"        \
+       "#{?session_attached, (attached),}"
+
 enum cmd_retval         cmd_list_sessions_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_list_sessions_entry = {
diff --git a/cmd-list-windows.c b/cmd-list-windows.c
index 1317ecb..5f73e8d 100644
--- a/cmd-list-windows.c
+++ b/cmd-list-windows.c
@@ -27,11 +27,23 @@
  * List windows on given session.
  */
 
+#define LIST_WINDOWS_TEMPLATE                                  \
+       "#{window_index}: #{window_name}#{window_flags} "       \
+       "(#{window_panes} panes) "                              \
+       "[#{window_width}x#{window_height}] "                   \
+       "[layout #{window_layout}] #{window_id}"                \
+       "#{?window_active, (active),}";
+#define LIST_WINDOWS_WITH_SESSION_TEMPLATE                     \
+       "#{session_name}:"                                      \
+       "#{window_index}: #{window_name}#{window_flags} "       \
+       "(#{window_panes} panes) "                              \
+       "[#{window_width}x#{window_height}] "
+
 enum cmd_retval         cmd_list_windows_exec(struct cmd *, struct cmd_q *);
 
 void   cmd_list_windows_server(struct cmd *, struct cmd_q *);
-void   cmd_list_windows_session(
-           struct cmd *, struct session *, struct cmd_q *, int);
+void   cmd_list_windows_session(struct cmd *, struct session *,
+           struct cmd_q *, int);
 
 const struct cmd_entry cmd_list_windows_entry = {
        "list-windows", "lsw",
diff --git a/cmd-new-session.c b/cmd-new-session.c
index e42947e..e244f88 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -31,6 +31,8 @@
  * Create a new session and attach to the current terminal unless -d is given.
  */
 
+#define NEW_SESSION_TEMPLATE "#{session_name}:"
+
 enum cmd_retval         cmd_new_session_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_new_session_entry = {
@@ -43,6 +45,14 @@ const struct cmd_entry cmd_new_session_entry = {
        cmd_new_session_exec
 };
 
+const struct cmd_entry cmd_has_session_entry = {
+       "has-session", "has",
+       "t:", 0, 0,
+       CMD_TARGET_SESSION_USAGE,
+       0,
+       cmd_new_session_exec
+};
+
 enum cmd_retval
 cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
 {
@@ -61,6 +71,12 @@ cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
        struct format_tree      *ft;
        struct environ_entry    *envent;
 
+       if (self->entry == &cmd_has_session_entry) {
+               if (cmd_find_session(cmdq, args_get(args, 't'), 0) == NULL)
+                       return (CMD_RETURN_ERROR);
+               return (CMD_RETURN_NORMAL);
+       }
+
        if (args_has(args, 't') && (args->argc != 0 || args_has(args, 'n'))) {
                cmdq_error(cmdq, "command or window name given with target");
                return (CMD_RETURN_ERROR);
diff --git a/cmd-new-window.c b/cmd-new-window.c
index 09693c8..7f14b21 100644
--- a/cmd-new-window.c
+++ b/cmd-new-window.c
@@ -30,6 +30,8 @@
  * Create a new window.
  */
 
+#define NEW_WINDOW_TEMPLATE "#{session_name}:#{window_index}.#{pane_index}"
+
 enum cmd_retval        cmd_new_window_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_new_window_entry = {
diff --git a/cmd-split-window.c b/cmd-split-window.c
index 797332c..b05a2fa 100644
--- a/cmd-split-window.c
+++ b/cmd-split-window.c
@@ -31,6 +31,8 @@
  * Split a window (add a new pane).
  */
 
+#define SPLIT_WINDOW_TEMPLATE "#{session_name}:#{window_index}.#{pane_index}"
+
 enum cmd_retval         cmd_split_window_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_split_window_entry = {
diff --git a/tmux.h b/tmux.h
index 2b2cd4a..7ad6e62 100644
--- a/tmux.h
+++ b/tmux.h
@@ -80,78 +80,6 @@ extern char   **environ;
 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
 #endif
 
-/* Default template for choose-buffer. */
-#define CHOOSE_BUFFER_TEMPLATE                                 \
-       "#{buffer_name}: #{buffer_size} bytes: #{buffer_sample}"
-
-/* Default template for choose-client. */
-#define CHOOSE_CLIENT_TEMPLATE                                 \
-       "#{client_tty}: #{session_name} "                       \
-       "[#{client_width}x#{client_height} #{client_termname}]" \
-       "#{?client_utf8, (utf8),}#{?client_readonly, (ro),} "   \
-       "(last used #{client_activity_string})"
-
-/* Default templates for choose-tree. */
-#define CHOOSE_TREE_SESSION_TEMPLATE                           \
-       "#{session_name}: #{session_windows} windows"           \
-       "#{?session_grouped, (group ,}"                         \
-       "#{session_group}#{?session_grouped,),}"                \
-       "#{?session_attached, (attached),}"
-#define CHOOSE_TREE_WINDOW_TEMPLATE                            \
-       "#{window_index}: #{window_name}#{window_flags} "       \
-       "\"#{pane_title}\""
-
-/* Default template for display-message. */
-#define DISPLAY_MESSAGE_TEMPLATE                               \
-       "[#{session_name}] #{window_index}:"                    \
-       "#{window_name}, current pane #{pane_index} "           \
-       "- (%H:%M %d-%b-%y)"
-
-/* Default template for find-window. */
-#define FIND_WINDOW_TEMPLATE                                   \
-       "#{window_index}: #{window_name} "                      \
-       "[#{window_width}x#{window_height}] "                   \
-       "(#{window_panes} panes) #{window_find_matches}"
-
-/* Default template for list-buffers. */
-#define LIST_BUFFERS_TEMPLATE                                  \
-       "#{buffer_name}: #{buffer_size} bytes: "                \
-       "\"#{buffer_sample}\""
-
-/* Default template for list-clients. */
-#define LIST_CLIENTS_TEMPLATE                                  \
-       "#{client_tty}: #{session_name} "                       \
-       "[#{client_width}x#{client_height} #{client_termname}]" \
-       "#{?client_utf8, (utf8),} #{?client_readonly, (ro),}"
-
-/* Default template for list-sessions. */
-#define LIST_SESSIONS_TEMPLATE                                 \
-       "#{session_name}: #{session_windows} windows "          \
-       "(created #{session_created_string}) "                  \
-       "[#{session_width}x#{session_height}]"                  \
-       "#{?session_grouped, (group ,}"                         \
-       "#{session_group}#{?session_grouped,),}"                \
-       "#{?session_attached, (attached),}"
-
-/* Default templates for list-windows. */
-#define LIST_WINDOWS_TEMPLATE                                  \
-       "#{window_index}: #{window_name}#{window_flags} "       \
-       "(#{window_panes} panes) "                              \
-       "[#{window_width}x#{window_height}] "                   \
-       "[layout #{window_layout}] #{window_id}"                \
-       "#{?window_active, (active),}";
-#define LIST_WINDOWS_WITH_SESSION_TEMPLATE                     \
-       "#{session_name}:"                                      \
-       "#{window_index}: #{window_name}#{window_flags} "       \
-       "(#{window_panes} panes) "                              \
-       "[#{window_width}x#{window_height}] "
-
-/* Default templates for break-pane, new-window and split-window. */
-#define BREAK_PANE_TEMPLATE "#{session_name}:#{window_index}.#{pane_index}"
-#define NEW_SESSION_TEMPLATE "#{session_name}:"
-#define NEW_WINDOW_TEMPLATE BREAK_PANE_TEMPLATE
-#define SPLIT_WINDOW_TEMPLATE BREAK_PANE_TEMPLATE
-
 /* Bell option values. */
 #define BELL_NONE 0
 #define BELL_ANY 1


commit 900f6fc17e6764377a8e293ce742fb41f1add9bd
Author: nicm <nicm>
Commit: nicm <nicm>

    Tidy up some includes.
---
 arguments.c          |    1 +
 client.c             |    1 +
 cmd-confirm-before.c |    2 ++
 cmd-list-keys.c      |    2 +-
 job.c                |    1 +
 screen.c             |    6 +++---
 server-fn.c          |    2 +-
 signal.c             |    2 ++
 style.c              |    2 ++
 tmux.c               |    7 ++++---
 tmux.h               |    5 +----
 xmalloc.c            |    4 +---
 12 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/arguments.c b/arguments.c
index ca6cc76..05ff97e 100644
--- a/arguments.c
+++ b/arguments.c
@@ -18,6 +18,7 @@
 
 #include <sys/types.h>
 
+#include <getopt.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
diff --git a/client.c b/client.c
index a790f32..5458dfc 100644
--- a/client.c
+++ b/client.c
@@ -26,6 +26,7 @@
 #include <errno.h>
 #include <event.h>
 #include <fcntl.h>
+#include <signal.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c
index 7f76467..0bf5844 100644
--- a/cmd-confirm-before.c
+++ b/cmd-confirm-before.c
@@ -16,6 +16,8 @@
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <sys/types.h>
+
 #include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index 6fbaf14..0733ee2 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -165,7 +165,7 @@ enum cmd_retval
 cmd_list_keys_commands(unused struct cmd *self, struct cmd_q *cmdq)
 {
        const struct cmd_entry  **entryp;
-       struct cmd_entry         *entry;
+       const struct cmd_entry   *entry;
 
        for (entryp = cmd_table; *entryp != NULL; entryp++) {
                entry = *entryp;
diff --git a/job.c b/job.c
index a8e6d33..c04a70b 100644
--- a/job.c
+++ b/job.c
@@ -21,6 +21,7 @@
 
 #include <fcntl.h>
 #include <paths.h>
+#include <signal.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
diff --git a/screen.c b/screen.c
index e555022..5ef18a2 100644
--- a/screen.c
+++ b/screen.c
@@ -31,12 +31,12 @@ void        screen_resize_y(struct screen *, u_int);
 void
 screen_init(struct screen *s, u_int sx, u_int sy, u_int hlimit)
 {
-       char hn[MAXHOSTNAMELEN];
+       char host[HOST_NAME_MAX];
 
        s->grid = grid_create(sx, sy, hlimit);
 
-       if (gethostname(hn, MAXHOSTNAMELEN) == 0)
-               s->title = xstrdup(hn);
+       if (gethostname(host, HOST_NAME_MAX) == 0)
+               s->title = xstrdup(host);
        else
                s->title = xstrdup("");
 
diff --git a/server-fn.c b/server-fn.c
index 5b25c92..310f16e 100644
--- a/server-fn.c
+++ b/server-fn.c
@@ -31,7 +31,7 @@ void          server_callback_identify(int, short, void *);
 void
 server_fill_environ(struct session *s, struct environ *env)
 {
-       char    var[MAXPATHLEN], *term;
+       char    var[PATH_MAX], *term;
        u_int   idx;
        long    pid;
 
diff --git a/signal.c b/signal.c
index f9546dc..7e6268a 100644
--- a/signal.c
+++ b/signal.c
@@ -17,6 +17,8 @@
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <sys/types.h>
+
 #include <string.h>
 #include <signal.h>
 
diff --git a/style.c b/style.c
index 2a049fb..6df2ed0 100644
--- a/style.c
+++ b/style.c
@@ -17,6 +17,8 @@
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <sys/types.h>
+
 #include <string.h>
 
 #include "tmux.h"
diff --git a/tmux.c b/tmux.c
index fd2d517..fabcee5 100644
--- a/tmux.c
+++ b/tmux.c
@@ -22,6 +22,7 @@
 #include <errno.h>
 #include <event.h>
 #include <fcntl.h>
+#include <getopt.h>
 #include <locale.h>
 #include <paths.h>
 #include <pwd.h>
@@ -46,7 +47,7 @@ char          *cfg_file;
 char           *shell_cmd;
 int             debug_level;
 time_t          start_time;
-char            socket_path[MAXPATHLEN];
+char            socket_path[PATH_MAX];
 int             login_shell;
 char           *environ_path;
 
@@ -124,7 +125,7 @@ areshell(const char *shell)
 char *
 makesocketpath(const char *label)
 {
-       char            base[MAXPATHLEN], realbase[MAXPATHLEN], *path, *s;
+       char            base[PATH_MAX], realbase[PATH_MAX], *path, *s;
        struct stat     sb;
        u_int           uid;
 
@@ -202,7 +203,7 @@ int
 main(int argc, char **argv)
 {
        struct passwd   *pw;
-       char            *s, *path, *label, **var, tmp[MAXPATHLEN];
+       char            *s, *path, *label, **var, tmp[PATH_MAX];
        char             in[256];
        const char      *home;
        long long        pid;
diff --git a/tmux.h b/tmux.h
index 0a677a3..2b2cd4a 100644
--- a/tmux.h
+++ b/tmux.h
@@ -21,7 +21,6 @@
 
 #define PROTOCOL_VERSION 8
 
-#include <sys/param.h>
 #include <sys/time.h>
 #include <sys/queue.h>
 #include <sys/tree.h>
@@ -29,10 +28,8 @@
 
 #include <bitstring.h>
 #include <event.h>
-#include <getopt.h>
 #include <imsg.h>
 #include <limits.h>
-#include <signal.h>
 #include <stdarg.h>
 #include <stdint.h>
 #include <stdio.h>
@@ -1565,7 +1562,7 @@ extern char       *cfg_file;
 extern char    *shell_cmd;
 extern int      debug_level;
 extern time_t   start_time;
-extern char     socket_path[MAXPATHLEN];
+extern char     socket_path[PATH_MAX];
 extern int      login_shell;
 extern char    *environ_path;
 void            logfile(const char *);
diff --git a/xmalloc.c b/xmalloc.c
index 49a0eff..b7331ea 100644
--- a/xmalloc.c
+++ b/xmalloc.c
@@ -16,10 +16,8 @@
  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <sys/param.h>
+#include <sys/types.h>
 
-#include <errno.h>
-#include <libgen.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>


commit 30bacf6f3038a867b53143150944f0997558114b
Author: nicm <nicm>
Commit: nicm <nicm>

    Move suspend-client code into detach-client.
---
 Makefile             |    2 -
 cmd-detach-client.c  |   17 +++++++++++++++
 cmd-suspend-client.c |   54 --------------------------------------------------
 3 files changed, 17 insertions(+), 56 deletions(-)

diff --git a/Makefile b/Makefile
index 5f57e38..692ec55 100644
--- a/Makefile
+++ b/Makefile
@@ -22,7 +22,6 @@ SRCS= arguments.c \
        cmd-display-message.c \
        cmd-display-panes.c \
        cmd-find-window.c \
-       cmd-has-session.c \
        cmd-if-shell.c \
        cmd-join-pane.c \
        cmd-kill-pane.c \
@@ -66,7 +65,6 @@ SRCS= arguments.c \
        cmd-source-file.c \
        cmd-split-window.c \
        cmd-string.c \
-       cmd-suspend-client.c \
        cmd-swap-pane.c \
        cmd-swap-window.c \
        cmd-switch-client.c \
diff --git a/cmd-detach-client.c b/cmd-detach-client.c
index d60cf47..600554a 100644
--- a/cmd-detach-client.c
+++ b/cmd-detach-client.c
@@ -36,6 +36,14 @@ const struct cmd_entry cmd_detach_client_entry = {
        cmd_detach_client_exec
 };
 
+const struct cmd_entry cmd_suspend_client_entry = {
+       "suspend-client", "suspendc",
+       "t:", 0, 0,
+       CMD_TARGET_CLIENT_USAGE,
+       0,
+       cmd_detach_client_exec
+};
+
 enum cmd_retval
 cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
 {
@@ -45,6 +53,15 @@ cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
        enum msgtype     msgtype;
        u_int            i;
 
+       if (self->entry == &cmd_suspend_client_entry) {
+               if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
+                       return (CMD_RETURN_ERROR);
+               tty_stop_tty(&c->tty);
+               c->flags |= CLIENT_SUSPENDED;
+               server_write_client(c, MSG_SUSPEND, NULL, 0);
+               return (CMD_RETURN_NORMAL);
+       }
+
        if (args_has(args, 'P'))
                msgtype = MSG_DETACHKILL;
        else
diff --git a/cmd-suspend-client.c b/cmd-suspend-client.c
deleted file mode 100644
index 63ed874..0000000
--- a/cmd-suspend-client.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* $OpenBSD$ */
-
-/*
- * Copyright (c) 2009 Nicholas Marriott <[email protected]>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
- * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <sys/types.h>
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "tmux.h"
-
-/*
- * Suspend client with SIGTSTP.
- */
-
-enum cmd_retval         cmd_suspend_client_exec(struct cmd *, struct cmd_q *);
-
-const struct cmd_entry cmd_suspend_client_entry = {
-       "suspend-client", "suspendc",
-       "t:", 0, 0,
-       CMD_TARGET_CLIENT_USAGE,
-       0,
-       cmd_suspend_client_exec
-};
-
-enum cmd_retval
-cmd_suspend_client_exec(struct cmd *self, struct cmd_q *cmdq)
-{
-       struct args     *args = self->args;
-       struct client   *c;
-
-       if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
-               return (CMD_RETURN_ERROR);
-
-       tty_stop_tty(&c->tty);
-       c->flags |= CLIENT_SUSPENDED;
-       server_write_client(c, MSG_SUSPEND, NULL, 0);
-
-       return (CMD_RETURN_NORMAL);
-}


commit 8a5ceac3a9a21ec70c480d284dc1fc6907af2ce0
Author: nicm <nicm>
Commit: nicm <nicm>

    Argh, meant to remove this file...
---
 cmd-list-commands.c |   45 ---------------------------------------------
 1 files changed, 0 insertions(+), 45 deletions(-)

diff --git a/cmd-list-commands.c b/cmd-list-commands.c
deleted file mode 100644
index 3caaebb..0000000
--- a/cmd-list-commands.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $OpenBSD$ */
-
-/*
- * Copyright (c) 2007 Nicholas Marriott <[email protected]>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
- * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <sys/types.h>
-
-#include "tmux.h"
-
-/*
- * List all commands with usages.
- */
-
-enum cmd_retval         cmd_list_commands_exec(struct cmd *, struct cmd_q *);
-
-enum cmd_retval
-cmd_list_commands_exec(unused struct cmd *self, struct cmd_q *cmdq)
-{
-       const struct cmd_entry        **entryp;
-
-       for (entryp = cmd_table; *entryp != NULL; entryp++) {
-               if ((*entryp)->alias != NULL) {
-                       cmdq_print(cmdq, "%s (%s) %s", (*entryp)->name,
-                           (*entryp)->alias, (*entryp)->usage);
-               } else {
-                       cmdq_print(cmdq, "%s %s", (*entryp)->name,
-                           (*entryp)->usage);
-               }
-       }
-
-       return (CMD_RETURN_NORMAL);
-}


commit f5bc85591a1f7c26bf030f5781d63985b2ee4d23
Author: nicm <nicm>
Commit: nicm <nicm>

    Move list-commands into list-keys.
---
 Makefile            |    1 -
 cmd-list-commands.c |    8 --------
 cmd-list-keys.c     |   32 ++++++++++++++++++++++++++++++++
 3 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/Makefile b/Makefile
index d8d7505..5f57e38 100644
--- a/Makefile
+++ b/Makefile
@@ -32,7 +32,6 @@ SRCS= arguments.c \
        cmd-link-window.c \
        cmd-list-buffers.c \
        cmd-list-clients.c \
-       cmd-list-commands.c \
        cmd-list-keys.c \
        cmd-list-panes.c \
        cmd-list-sessions.c \
diff --git a/cmd-list-commands.c b/cmd-list-commands.c
index 520fecc..3caaebb 100644
--- a/cmd-list-commands.c
+++ b/cmd-list-commands.c
@@ -26,14 +26,6 @@
 
 enum cmd_retval         cmd_list_commands_exec(struct cmd *, struct cmd_q *);
 
-const struct cmd_entry cmd_list_commands_entry = {
-       "list-commands", "lscm",
-       "", 0, 0,
-       "",
-       0,
-       cmd_list_commands_exec
-};
-
 enum cmd_retval
 cmd_list_commands_exec(unused struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index 0d64f1b..6fbaf14 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -27,7 +27,9 @@
  */
 
 enum cmd_retval         cmd_list_keys_exec(struct cmd *, struct cmd_q *);
+
 enum cmd_retval         cmd_list_keys_table(struct cmd *, struct cmd_q *);
+enum cmd_retval         cmd_list_keys_commands(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_list_keys_entry = {
        "list-keys", "lsk",
@@ -37,6 +39,14 @@ const struct cmd_entry cmd_list_keys_entry = {
        cmd_list_keys_exec
 };
 
+const struct cmd_entry cmd_list_commands_entry = {
+       "list-commands", "lscm",
+       "", 0, 0,
+       "",
+       0,
+       cmd_list_keys_exec
+};
+
 enum cmd_retval
 cmd_list_keys_exec(struct cmd *self, struct cmd_q *cmdq)
 {
@@ -47,6 +57,9 @@ cmd_list_keys_exec(struct cmd *self, struct cmd_q *cmdq)
        size_t                   used;
        int                      width, keywidth;
 
+       if (self->entry == &cmd_list_commands_entry)
+               return (cmd_list_keys_commands(self, cmdq));
+
        if (args_has(args, 't'))
                return (cmd_list_keys_table(self, cmdq));
 
@@ -147,3 +160,22 @@ cmd_list_keys_table(struct cmd *self, struct cmd_q *cmdq)
 
        return (CMD_RETURN_NORMAL);
 }
+
+enum cmd_retval
+cmd_list_keys_commands(unused struct cmd *self, struct cmd_q *cmdq)
+{
+       const struct cmd_entry  **entryp;
+       struct cmd_entry         *entry;
+
+       for (entryp = cmd_table; *entryp != NULL; entryp++) {
+               entry = *entryp;
+               if (entry->alias == NULL) {
+                       cmdq_print(cmdq, "%s %s", entry->name, entry->usage);
+                       continue;
+               }
+               cmdq_print(cmdq, "%s (%s) %s", entry->name, entry->alias,
+                   entry->usage);
+       }
+
+       return (CMD_RETURN_NORMAL);
+}


commit 7afe417a60a3b80ba16cd758b62e3f500350fb3e
Author: nicm <nicm>
Commit: nicm <nicm>

    Missed a couple of cmd_entry struct members from previous.
---
 cmd-respawn-pane.c  |    1 -
 cmd-select-layout.c |    1 +
 2 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/cmd-respawn-pane.c b/cmd-respawn-pane.c
index c2dcf9e..4703153 100644
--- a/cmd-respawn-pane.c
+++ b/cmd-respawn-pane.c
@@ -35,7 +35,6 @@ const struct cmd_entry cmd_respawn_pane_entry = {
        "kt:", 0, -1,
        "[-k] " CMD_TARGET_PANE_USAGE " [command]",
        0,
-       NULL,
        cmd_respawn_pane_exec
 };
 
diff --git a/cmd-select-layout.c b/cmd-select-layout.c
index 5f00774..77137b7 100644
--- a/cmd-select-layout.c
+++ b/cmd-select-layout.c
@@ -30,6 +30,7 @@ const struct cmd_entry cmd_select_layout_entry = {
        "select-layout", "selectl",
        "npt:", 0, 1,
        "[-np] " CMD_TARGET_WINDOW_USAGE " [layout-name]",
+       0,
        cmd_select_layout_exec
 };
 


commit 45dfc5a074e2ceae11a6d4aeae597bee1e028503
Author: nicm <nicm>
Commit: nicm <nicm>

    Instead of setting up the default keys by building the key struct
    directly with a helper function in the cmd_entry, include a table of
    bind-key commands and pass them through the command parser and a
    temporary cmd_q.
    
    As well as being smaller, this will allow default bindings to be command
    sequences which will probably be needed soon.
---
 cmd-attach-session.c   |    1 -
 cmd-bind-key.c         |    1 -
 cmd-break-pane.c       |    1 -
 cmd-capture-pane.c     |    1 -
 cmd-choose-buffer.c    |    1 -
 cmd-choose-client.c    |    1 -
 cmd-choose-tree.c      |    3 -
 cmd-clear-history.c    |    1 -
 cmd-clock-mode.c       |    1 -
 cmd-command-prompt.c   |   30 --------
 cmd-confirm-before.c   |   20 -----
 cmd-copy-mode.c        |   10 ---
 cmd-delete-buffer.c    |    1 -
 cmd-detach-client.c    |    1 -
 cmd-display-message.c  |    1 -
 cmd-display-panes.c    |    1 -
 cmd-find-window.c      |    1 -
 cmd-has-session.c      |    1 -
 cmd-if-shell.c         |    1 -
 cmd-join-pane.c        |   17 -----
 cmd-kill-pane.c        |    1 -
 cmd-kill-server.c      |    2 -
 cmd-kill-session.c     |    1 -
 cmd-kill-window.c      |    1 -
 cmd-link-window.c      |    1 -
 cmd-list-buffers.c     |    1 -
 cmd-list-clients.c     |    1 -
 cmd-list-commands.c    |    1 -
 cmd-list-keys.c        |    1 -
 cmd-list-panes.c       |    1 -
 cmd-list-sessions.c    |    1 -
 cmd-list-windows.c     |    1 -
 cmd-load-buffer.c      |    1 -
 cmd-lock-server.c      |    3 -
 cmd-move-window.c      |    1 -
 cmd-new-session.c      |    1 -
 cmd-new-window.c       |    1 -
 cmd-paste-buffer.c     |    1 -
 cmd-pipe-pane.c        |    1 -
 cmd-refresh-client.c   |    1 -
 cmd-rename-session.c   |    1 -
 cmd-rename-window.c    |    1 -
 cmd-resize-pane.c      |   48 -------------
 cmd-respawn-window.c   |    1 -
 cmd-rotate-window.c    |   10 ---
 cmd-run-shell.c        |    1 -
 cmd-save-buffer.c      |    2 -
 cmd-select-layout.c    |   30 --------
 cmd-select-pane.c      |   19 -----
 cmd-select-window.c    |   19 -----
 cmd-send-keys.c        |    2 -
 cmd-set-buffer.c       |    1 -
 cmd-set-environment.c  |    1 -
 cmd-set-option.c       |    2 -
 cmd-show-environment.c |    1 -
 cmd-show-messages.c    |    2 -
 cmd-show-options.c     |    2 -
 cmd-source-file.c      |    1 -
 cmd-split-window.c     |   10 ---
 cmd-suspend-client.c   |    1 -
 cmd-swap-pane.c        |   12 ---
 cmd-swap-window.c      |    1 -
 cmd-switch-client.c    |   19 -----
 cmd-unbind-key.c       |    1 -
 cmd-unlink-window.c    |    1 -
 cmd-wait-for.c         |    1 -
 key-bindings.c         |  180 +++++++++++++++++++++++-------------------------
 tmux.h                 |    1 -
 68 files changed, 86 insertions(+), 403 deletions(-)

diff --git a/cmd-attach-session.c b/cmd-attach-session.c
index 94f01e4..160f2a8 100644
--- a/cmd-attach-session.c
+++ b/cmd-attach-session.c
@@ -37,7 +37,6 @@ const struct cmd_entry cmd_attach_session_entry = {
        "c:drt:", 0, 0,
        "[-dr] [-c working-directory] " CMD_TARGET_SESSION_USAGE,
        CMD_CANTNEST|CMD_STARTSERVER,
-       NULL,
        cmd_attach_session_exec
 };
 
diff --git a/cmd-bind-key.c b/cmd-bind-key.c
index dce0bbf..5d68d48 100644
--- a/cmd-bind-key.c
+++ b/cmd-bind-key.c
@@ -36,7 +36,6 @@ const struct cmd_entry cmd_bind_key_entry = {
        "cnrt:", 1, -1,
        "[-cnr] [-t mode-table] key command [arguments]",
        0,
-       NULL,
        cmd_bind_key_exec
 };
 
diff --git a/cmd-break-pane.c b/cmd-break-pane.c
index 85c5d4d..5e7ecd0 100644
--- a/cmd-break-pane.c
+++ b/cmd-break-pane.c
@@ -33,7 +33,6 @@ const struct cmd_entry cmd_break_pane_entry = {
        "dPF:t:", 0, 0,
        "[-dP] [-F format] " CMD_TARGET_PANE_USAGE,
        0,
-       NULL,
        cmd_break_pane_exec
 };
 
diff --git a/cmd-capture-pane.c b/cmd-capture-pane.c
index 50bddc7..ce60b4c 100644
--- a/cmd-capture-pane.c
+++ b/cmd-capture-pane.c
@@ -41,7 +41,6 @@ const struct cmd_entry cmd_capture_pane_entry = {
        "[-aCeJpPq] " CMD_BUFFER_USAGE " [-E end-line] [-S start-line]"
        CMD_TARGET_PANE_USAGE,
        0,
-       NULL,
        cmd_capture_pane_exec
 };
 
diff --git a/cmd-choose-buffer.c b/cmd-choose-buffer.c
index 42caa7c..de4855a 100644
--- a/cmd-choose-buffer.c
+++ b/cmd-choose-buffer.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_choose_buffer_entry = {
        "F:t:", 0, 1,
        CMD_TARGET_WINDOW_USAGE " [-F format] [template]",
        0,
-       NULL,
        cmd_choose_buffer_exec
 };
 
diff --git a/cmd-choose-client.c b/cmd-choose-client.c
index 47ff197..be3d405 100644
--- a/cmd-choose-client.c
+++ b/cmd-choose-client.c
@@ -36,7 +36,6 @@ const struct cmd_entry cmd_choose_client_entry = {
        "F:t:", 0, 1,
        CMD_TARGET_WINDOW_USAGE " [-F format] [template]",
        0,
-       NULL,
        cmd_choose_client_exec
 };
 
diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c
index 257908e..eee49cc 100644
--- a/cmd-choose-tree.c
+++ b/cmd-choose-tree.c
@@ -40,7 +40,6 @@ const struct cmd_entry cmd_choose_tree_entry = {
        "[-suw] [-b session-template] [-c window template] [-S format] " \
        "[-W format] " CMD_TARGET_WINDOW_USAGE,
        0,
-       NULL,
        cmd_choose_tree_exec
 };
 
@@ -49,7 +48,6 @@ const struct cmd_entry cmd_choose_session_entry = {
        "F:t:", 0, 1,
        CMD_TARGET_WINDOW_USAGE " [-F format] [template]",
        0,
-       NULL,
        cmd_choose_tree_exec
 };
 
@@ -58,7 +56,6 @@ const struct cmd_entry cmd_choose_window_entry = {
        "F:t:", 0, 1,
        CMD_TARGET_WINDOW_USAGE "[-F format] [template]",
        0,
-       NULL,
        cmd_choose_tree_exec
 };
 
diff --git a/cmd-clear-history.c b/cmd-clear-history.c
index 69885f0..e134288 100644
--- a/cmd-clear-history.c
+++ b/cmd-clear-history.c
@@ -31,7 +31,6 @@ const struct cmd_entry cmd_clear_history_entry = {
        "t:", 0, 0,
        CMD_TARGET_PANE_USAGE,
        0,
-       NULL,
        cmd_clear_history_exec
 };
 
diff --git a/cmd-clock-mode.c b/cmd-clock-mode.c
index 09f16e1..8083581 100644
--- a/cmd-clock-mode.c
+++ b/cmd-clock-mode.c
@@ -31,7 +31,6 @@ const struct cmd_entry cmd_clock_mode_entry = {
        "t:", 0, 0,
        CMD_TARGET_PANE_USAGE,
        0,
-       NULL,
        cmd_clock_mode_exec
 };
 
diff --git a/cmd-command-prompt.c b/cmd-command-prompt.c
index fc625f5..22b1d84 100644
--- a/cmd-command-prompt.c
+++ b/cmd-command-prompt.c
@@ -29,7 +29,6 @@
  * Prompt for command in client.
  */
 
-void   cmd_command_prompt_key_binding(struct cmd *, int);
 enum cmd_retval        cmd_command_prompt_exec(struct cmd *, struct cmd_q *);
 
 int    cmd_command_prompt_callback(void *, const char *);
@@ -40,7 +39,6 @@ const struct cmd_entry cmd_command_prompt_entry = {
        "I:p:t:", 0, 1,
        "[-I inputs] [-p prompts] " CMD_TARGET_CLIENT_USAGE " [template]",
        0,
-       cmd_command_prompt_key_binding,
        cmd_command_prompt_exec
 };
 
@@ -54,34 +52,6 @@ struct cmd_command_prompt_cdata {
        int              idx;
 };
 
-void
-cmd_command_prompt_key_binding(struct cmd *self, int key)
-{
-       switch (key) {
-       case '$':
-               self->args = args_create(1, "rename-session '%%'");
-               args_set(self->args, 'I', "#S");
-               break;
-       case ',':
-               self->args = args_create(1, "rename-window '%%'");
-               args_set(self->args, 'I', "#W");
-               break;
-       case '.':
-               self->args = args_create(1, "move-window -t '%%'");
-               break;
-       case 'f':
-               self->args = args_create(1, "find-window '%%'");
-               break;
-       case '\'':
-               self->args = args_create(1, "select-window -t ':%%'");
-               args_set(self->args, 'p', "index");
-               break;
-       default:
-               self->args = args_create(0);
-               break;
-       }
-}
-
 enum cmd_retval
 cmd_command_prompt_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-confirm-before.c b/cmd-confirm-before.c
index 5b8151c..7f76467 100644
--- a/cmd-confirm-before.c
+++ b/cmd-confirm-before.c
@@ -26,7 +26,6 @@
  * Asks for confirmation before executing a command.
  */
 
-void            cmd_confirm_before_key_binding(struct cmd *, int);
 enum cmd_retval         cmd_confirm_before_exec(struct cmd *, struct cmd_q *);
 
 int             cmd_confirm_before_callback(void *, const char *);
@@ -37,7 +36,6 @@ const struct cmd_entry cmd_confirm_before_entry = {
        "p:t:", 1, 1,
        "[-p prompt] " CMD_TARGET_CLIENT_USAGE " command",
        0,
-       cmd_confirm_before_key_binding,
        cmd_confirm_before_exec
 };
 
@@ -46,24 +44,6 @@ struct cmd_confirm_before_data {
        struct client   *client;
 };
 
-void
-cmd_confirm_before_key_binding(struct cmd *self, int key)
-{
-       switch (key) {
-       case '&':
-               self->args = args_create(1, "kill-window");
-               args_set(self->args, 'p', "kill-window #W? (y/n)");
-               break;
-       case 'x':
-               self->args = args_create(1, "kill-pane");
-               args_set(self->args, 'p', "kill-pane #P? (y/n)");
-               break;
-       default:
-               self->args = args_create(0);
-               break;
-       }
-}
-
 enum cmd_retval
 cmd_confirm_before_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-copy-mode.c b/cmd-copy-mode.c
index bc9cfd6..8933529 100644
--- a/cmd-copy-mode.c
+++ b/cmd-copy-mode.c
@@ -24,7 +24,6 @@
  * Enter copy mode.
  */
 
-void            cmd_copy_mode_key_binding(struct cmd *, int);
 enum cmd_retval         cmd_copy_mode_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_copy_mode_entry = {
@@ -32,18 +31,9 @@ const struct cmd_entry cmd_copy_mode_entry = {
        "t:u", 0, 0,
        "[-u] " CMD_TARGET_PANE_USAGE,
        0,
-       cmd_copy_mode_key_binding,
        cmd_copy_mode_exec
 };
 
-void
-cmd_copy_mode_key_binding(struct cmd *self, int key)
-{
-       self->args = args_create(0);
-       if (key == KEYC_PPAGE)
-               args_set(self->args, 'u', NULL);
-}
-
 enum cmd_retval
 cmd_copy_mode_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-delete-buffer.c b/cmd-delete-buffer.c
index 755d7ea..42268b7 100644
--- a/cmd-delete-buffer.c
+++ b/cmd-delete-buffer.c
@@ -33,7 +33,6 @@ const struct cmd_entry cmd_delete_buffer_entry = {
        "b:", 0, 0,
        CMD_BUFFER_USAGE,
        0,
-       NULL,
        cmd_delete_buffer_exec
 };
 
diff --git a/cmd-detach-client.c b/cmd-detach-client.c
index d40ef5a..d60cf47 100644
--- a/cmd-detach-client.c
+++ b/cmd-detach-client.c
@@ -33,7 +33,6 @@ const struct cmd_entry cmd_detach_client_entry = {
        "as:t:P", 0, 0,
        "[-P] [-a] [-s target-session] " CMD_TARGET_CLIENT_USAGE,
        CMD_READONLY,
-       NULL,
        cmd_detach_client_exec
 };
 
diff --git a/cmd-display-message.c b/cmd-display-message.c
index b60d732..dc4290e 100644
--- a/cmd-display-message.c
+++ b/cmd-display-message.c
@@ -35,7 +35,6 @@ const struct cmd_entry cmd_display_message_entry = {
        "[-p] [-c target-client] [-F format] " CMD_TARGET_PANE_USAGE
        " [message]",
        0,
-       NULL,
        cmd_display_message_exec
 };
 
diff --git a/cmd-display-panes.c b/cmd-display-panes.c
index 9160f4e..9ce8971 100644
--- a/cmd-display-panes.c
+++ b/cmd-display-panes.c
@@ -31,7 +31,6 @@ const struct cmd_entry cmd_display_panes_entry = {
        "t:", 0, 0,
        CMD_TARGET_CLIENT_USAGE,
        0,
-       NULL,
        cmd_display_panes_exec
 };
 
diff --git a/cmd-find-window.c b/cmd-find-window.c
index ccf7f0f..f1fc5f5 100644
--- a/cmd-find-window.c
+++ b/cmd-find-window.c
@@ -47,7 +47,6 @@ const struct cmd_entry cmd_find_window_entry = {
        "F:CNt:T", 1, 4,
        "[-CNT] [-F format] " CMD_TARGET_WINDOW_USAGE " match-string",
        0,
-       NULL,
        cmd_find_window_exec
 };
 
diff --git a/cmd-has-session.c b/cmd-has-session.c
index d7ef9be..a873b20 100644
--- a/cmd-has-session.c
+++ b/cmd-has-session.c
@@ -31,7 +31,6 @@ const struct cmd_entry cmd_has_session_entry = {
        "t:", 0, 0,
        CMD_TARGET_SESSION_USAGE,
        0,
-       NULL,
        cmd_has_session_exec
 };
 
diff --git a/cmd-if-shell.c b/cmd-if-shell.c
index 4193944..da0220c 100644
--- a/cmd-if-shell.c
+++ b/cmd-if-shell.c
@@ -40,7 +40,6 @@ const struct cmd_entry cmd_if_shell_entry = {
        "bt:", 2, 3,
        "[-b] " CMD_TARGET_PANE_USAGE " shell-command command [command]",
        0,
-       NULL,
        cmd_if_shell_exec
 };
 
diff --git a/cmd-join-pane.c b/cmd-join-pane.c
index 7d7b1ee..943cdce 100644
--- a/cmd-join-pane.c
+++ b/cmd-join-pane.c
@@ -29,7 +29,6 @@
  * Join or move a pane into another (like split/swap/kill).
  */
 
-void            cmd_join_pane_key_binding(struct cmd *, int);
 enum cmd_retval         cmd_join_pane_exec(struct cmd *, struct cmd_q *);
 
 enum cmd_retval         join_pane(struct cmd *, struct cmd_q *, int);
@@ -39,7 +38,6 @@ const struct cmd_entry cmd_join_pane_entry = {
        "bdhvp:l:s:t:", 0, 0,
        "[-bdhv] [-p percentage|-l size] [-s src-pane] [-t dst-pane]",
        0,
-       cmd_join_pane_key_binding,
        cmd_join_pane_exec
 };
 
@@ -48,24 +46,9 @@ const struct cmd_entry cmd_move_pane_entry = {
        "bdhvp:l:s:t:", 0, 0,
        "[-bdhv] [-p percentage|-l size] [-s src-pane] [-t dst-pane]",
        0,
-       NULL,
        cmd_join_pane_exec
 };
 
-void
-cmd_join_pane_key_binding(struct cmd *self, int key)
-{
-       switch (key) {
-       case '%':
-               self->args = args_create(0);
-               args_set(self->args, 'h', NULL);
-               break;
-       default:
-               self->args = args_create(0);
-               break;
-       }
-}
-
 enum cmd_retval
 cmd_join_pane_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-kill-pane.c b/cmd-kill-pane.c
index 64fd11e..f4735fd 100644
--- a/cmd-kill-pane.c
+++ b/cmd-kill-pane.c
@@ -33,7 +33,6 @@ const struct cmd_entry cmd_kill_pane_entry = {
        "at:", 0, 0,
        "[-a] " CMD_TARGET_PANE_USAGE,
        0,
-       NULL,
        cmd_kill_pane_exec
 };
 
diff --git a/cmd-kill-server.c b/cmd-kill-server.c
index 6f0b749..07d9430 100644
--- a/cmd-kill-server.c
+++ b/cmd-kill-server.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_kill_server_entry = {
        "", 0, 0,
        "",
        0,
-       NULL,
        cmd_kill_server_exec
 };
 
@@ -43,7 +42,6 @@ const struct cmd_entry cmd_start_server_entry = {
        "", 0, 0,
        "",
        CMD_STARTSERVER,
-       NULL,
        cmd_kill_server_exec
 };
 
diff --git a/cmd-kill-session.c b/cmd-kill-session.c
index 097189e..d7e2a21 100644
--- a/cmd-kill-session.c
+++ b/cmd-kill-session.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_kill_session_entry = {
        "at:", 0, 0,
        "[-a] " CMD_TARGET_SESSION_USAGE,
        0,
-       NULL,
        cmd_kill_session_exec
 };
 
diff --git a/cmd-kill-window.c b/cmd-kill-window.c
index 2f92426..dd4d7f5 100644
--- a/cmd-kill-window.c
+++ b/cmd-kill-window.c
@@ -31,7 +31,6 @@ const struct cmd_entry cmd_kill_window_entry = {
        "at:", 0, 0,
        "[-a] " CMD_TARGET_WINDOW_USAGE,
        0,
-       NULL,
        cmd_kill_window_exec
 };
 
diff --git a/cmd-link-window.c b/cmd-link-window.c
index 8bd63b7..ee5b62a 100644
--- a/cmd-link-window.c
+++ b/cmd-link-window.c
@@ -33,7 +33,6 @@ const struct cmd_entry cmd_link_window_entry = {
        "dks:t:", 0, 0,
        "[-dk] " CMD_SRCDST_WINDOW_USAGE,
        0,
-       NULL,
        cmd_link_window_exec
 };
 
diff --git a/cmd-list-buffers.c b/cmd-list-buffers.c
index 9d79072..25f7e8b 100644
--- a/cmd-list-buffers.c
+++ b/cmd-list-buffers.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_list_buffers_entry = {
        "F:", 0, 0,
        "[-F format]",
        0,
-       NULL,
        cmd_list_buffers_exec
 };
 
diff --git a/cmd-list-clients.c b/cmd-list-clients.c
index 98c564a..0cfbdfa 100644
--- a/cmd-list-clients.c
+++ b/cmd-list-clients.c
@@ -35,7 +35,6 @@ const struct cmd_entry cmd_list_clients_entry = {
        "F:t:", 0, 0,
        "[-F format] " CMD_TARGET_SESSION_USAGE,
        CMD_READONLY,
-       NULL,
        cmd_list_clients_exec
 };
 
diff --git a/cmd-list-commands.c b/cmd-list-commands.c
index 287df42..520fecc 100644
--- a/cmd-list-commands.c
+++ b/cmd-list-commands.c
@@ -31,7 +31,6 @@ const struct cmd_entry cmd_list_commands_entry = {
        "", 0, 0,
        "",
        0,
-       NULL,
        cmd_list_commands_exec
 };
 
diff --git a/cmd-list-keys.c b/cmd-list-keys.c
index 65e4469..0d64f1b 100644
--- a/cmd-list-keys.c
+++ b/cmd-list-keys.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_list_keys_entry = {
        "t:", 0, 0,
        "[-t key-table]",
        0,
-       NULL,
        cmd_list_keys_exec
 };
 
diff --git a/cmd-list-panes.c b/cmd-list-panes.c
index 07884ff..7f62177 100644
--- a/cmd-list-panes.c
+++ b/cmd-list-panes.c
@@ -40,7 +40,6 @@ const struct cmd_entry cmd_list_panes_entry = {
        "asF:t:", 0, 0,
        "[-as] [-F format] " CMD_TARGET_WINDOW_USAGE,
        0,
-       NULL,
        cmd_list_panes_exec
 };
 
diff --git a/cmd-list-sessions.c b/cmd-list-sessions.c
index d401608..f0a7c53 100644
--- a/cmd-list-sessions.c
+++ b/cmd-list-sessions.c
@@ -35,7 +35,6 @@ const struct cmd_entry cmd_list_sessions_entry = {
        "F:", 0, 0,
        "[-F format]",
        0,
-       NULL,
        cmd_list_sessions_exec
 };
 
diff --git a/cmd-list-windows.c b/cmd-list-windows.c
index bc56816..1317ecb 100644
--- a/cmd-list-windows.c
+++ b/cmd-list-windows.c
@@ -38,7 +38,6 @@ const struct cmd_entry cmd_list_windows_entry = {
        "F:at:", 0, 0,
        "[-a] [-F format] " CMD_TARGET_SESSION_USAGE,
        0,
-       NULL,
        cmd_list_windows_exec
 };
 
diff --git a/cmd-load-buffer.c b/cmd-load-buffer.c
index 26d6297..785a701 100644
--- a/cmd-load-buffer.c
+++ b/cmd-load-buffer.c
@@ -39,7 +39,6 @@ const struct cmd_entry cmd_load_buffer_entry = {
        "b:", 1, 1,
        CMD_BUFFER_USAGE " path",
        0,
-       NULL,
        cmd_load_buffer_exec
 };
 
diff --git a/cmd-lock-server.c b/cmd-lock-server.c
index 757c2e3..de76475 100644
--- a/cmd-lock-server.c
+++ b/cmd-lock-server.c
@@ -31,7 +31,6 @@ const struct cmd_entry cmd_lock_server_entry = {
        "", 0, 0,
        "",
        0,
-       NULL,
        cmd_lock_server_exec
 };
 
@@ -40,7 +39,6 @@ const struct cmd_entry cmd_lock_session_entry = {
        "t:", 0, 0,
        CMD_TARGET_SESSION_USAGE,
        0,
-       NULL,
        cmd_lock_server_exec
 };
 
@@ -49,7 +47,6 @@ const struct cmd_entry cmd_lock_client_entry = {
        "t:", 0, 0,
        CMD_TARGET_CLIENT_USAGE,
        0,
-       NULL,
        cmd_lock_server_exec
 };
 
diff --git a/cmd-move-window.c b/cmd-move-window.c
index bb160e5..eef96f1 100644
--- a/cmd-move-window.c
+++ b/cmd-move-window.c
@@ -33,7 +33,6 @@ const struct cmd_entry cmd_move_window_entry = {
        "dkrs:t:", 0, 0,
        "[-dkr] " CMD_SRCDST_WINDOW_USAGE,
        0,
-       NULL,
        cmd_move_window_exec
 };
 
diff --git a/cmd-new-session.c b/cmd-new-session.c
index 802cb6c..e42947e 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -40,7 +40,6 @@ const struct cmd_entry cmd_new_session_entry = {
        "[-s session-name] " CMD_TARGET_SESSION_USAGE " [-x width] "
        "[-y height] [command]",
        CMD_STARTSERVER|CMD_CANTNEST,
-       NULL,
        cmd_new_session_exec
 };
 
diff --git a/cmd-new-window.c b/cmd-new-window.c
index 00fa53f..09693c8 100644
--- a/cmd-new-window.c
+++ b/cmd-new-window.c
@@ -38,7 +38,6 @@ const struct cmd_entry cmd_new_window_entry = {
        "[-adkP] [-c start-directory] [-F format] [-n window-name] "
        CMD_TARGET_WINDOW_USAGE " [command]",
        0,
-       NULL,
        cmd_new_window_exec
 };
 
diff --git a/cmd-paste-buffer.c b/cmd-paste-buffer.c
index 9462b28..08ac6fa 100644
--- a/cmd-paste-buffer.c
+++ b/cmd-paste-buffer.c
@@ -38,7 +38,6 @@ const struct cmd_entry cmd_paste_buffer_entry = {
        "db:prs:t:", 0, 0,
        "[-dpr] [-s separator] " CMD_BUFFER_USAGE " " CMD_TARGET_PANE_USAGE,
        0,
-       NULL,
        cmd_paste_buffer_exec
 };
 
diff --git a/cmd-pipe-pane.c b/cmd-pipe-pane.c
index 9b29e56..3158765 100644
--- a/cmd-pipe-pane.c
+++ b/cmd-pipe-pane.c
@@ -41,7 +41,6 @@ const struct cmd_entry cmd_pipe_pane_entry = {
        "ot:", 0, 1,
        "[-o] " CMD_TARGET_PANE_USAGE " [command]",
        0,
-       NULL,
        cmd_pipe_pane_exec
 };
 
diff --git a/cmd-refresh-client.c b/cmd-refresh-client.c
index d3dae49..f693872 100644
--- a/cmd-refresh-client.c
+++ b/cmd-refresh-client.c
@@ -31,7 +31,6 @@ const struct cmd_entry cmd_refresh_client_entry = {
        "C:St:", 0, 0,
        "[-S] [-C size] " CMD_TARGET_CLIENT_USAGE,
        0,
-       NULL,
        cmd_refresh_client_exec
 };
 
diff --git a/cmd-rename-session.c b/cmd-rename-session.c
index ba8f958..481154c 100644
--- a/cmd-rename-session.c
+++ b/cmd-rename-session.c
@@ -33,7 +33,6 @@ const struct cmd_entry cmd_rename_session_entry = {
        "t:", 1, 1,
        CMD_TARGET_SESSION_USAGE " new-name",
        0,
-       NULL,
        cmd_rename_session_exec
 };
 
diff --git a/cmd-rename-window.c b/cmd-rename-window.c
index bdd3fbe..2f677a4 100644
--- a/cmd-rename-window.c
+++ b/cmd-rename-window.c
@@ -33,7 +33,6 @@ const struct cmd_entry cmd_rename_window_entry = {
        "t:", 1, 1,
        CMD_TARGET_WINDOW_USAGE " new-name",
        0,
-       NULL,
        cmd_rename_window_exec
 };
 
diff --git a/cmd-resize-pane.c b/cmd-resize-pane.c
index e54c076..42f0f39 100644
--- a/cmd-resize-pane.c
+++ b/cmd-resize-pane.c
@@ -26,7 +26,6 @@
  * Increase or decrease pane size.
  */
 
-void            cmd_resize_pane_key_binding(struct cmd *, int);
 enum cmd_retval         cmd_resize_pane_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_resize_pane_entry = {
@@ -34,56 +33,9 @@ const struct cmd_entry cmd_resize_pane_entry = {
        "DLRt:Ux:y:Z", 0, 1,
        "[-DLRUZ] [-x width] [-y height] " CMD_TARGET_PANE_USAGE " 
[adjustment]",
        0,
-       cmd_resize_pane_key_binding,
        cmd_resize_pane_exec
 };
 
-void
-cmd_resize_pane_key_binding(struct cmd *self, int key)
-{
-       switch (key) {
-       case KEYC_UP | KEYC_CTRL:
-               self->args = args_create(0);
-               args_set(self->args, 'U', NULL);
-               break;
-       case KEYC_DOWN | KEYC_CTRL:
-               self->args = args_create(0);
-               args_set(self->args, 'D', NULL);
-               break;
-       case KEYC_LEFT | KEYC_CTRL:
-               self->args = args_create(0);
-               args_set(self->args, 'L', NULL);
-               break;
-       case KEYC_RIGHT | KEYC_CTRL:
-               self->args = args_create(0);
-               args_set(self->args, 'R', NULL);
-               break;
-       case KEYC_UP | KEYC_ESCAPE:
-               self->args = args_create(1, "5");
-               args_set(self->args, 'U', NULL);
-               break;
-       case KEYC_DOWN | KEYC_ESCAPE:
-               self->args = args_create(1, "5");
-               args_set(self->args, 'D', NULL);
-               break;
-       case KEYC_LEFT | KEYC_ESCAPE:
-               self->args = args_create(1, "5");
-               args_set(self->args, 'L', NULL);
-               break;
-       case KEYC_RIGHT | KEYC_ESCAPE:
-               self->args = args_create(1, "5");
-               args_set(self->args, 'R', NULL);
-               break;
-       case 'z':
-               self->args = args_create(0);
-               args_set(self->args, 'Z', NULL);
-               break;
-       default:
-               self->args = args_create(0);
-               break;
-       }
-}
-
 enum cmd_retval
 cmd_resize_pane_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-respawn-window.c b/cmd-respawn-window.c
index 5f59cb8..06102ed 100644
--- a/cmd-respawn-window.c
+++ b/cmd-respawn-window.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_respawn_window_entry = {
        "kt:", 0, -1,
        "[-k] " CMD_TARGET_WINDOW_USAGE " [command]",
        0,
-       NULL,
        cmd_respawn_window_exec
 };
 
diff --git a/cmd-rotate-window.c b/cmd-rotate-window.c
index 6005ae5..859ff04 100644
--- a/cmd-rotate-window.c
+++ b/cmd-rotate-window.c
@@ -24,7 +24,6 @@
  * Rotate the panes in a window.
  */
 
-void            cmd_rotate_window_key_binding(struct cmd *, int);
 enum cmd_retval         cmd_rotate_window_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_rotate_window_entry = {
@@ -32,18 +31,9 @@ const struct cmd_entry cmd_rotate_window_entry = {
        "Dt:U", 0, 0,
        "[-DU] " CMD_TARGET_WINDOW_USAGE,
        0,
-       cmd_rotate_window_key_binding,
        cmd_rotate_window_exec
 };
 
-void
-cmd_rotate_window_key_binding(struct cmd *self, int key)
-{
-       self->args = args_create(0);
-       if (key == ('o' | KEYC_ESCAPE))
-               args_set(self->args, 'D', NULL);
-}
-
 enum cmd_retval
 cmd_rotate_window_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-run-shell.c b/cmd-run-shell.c
index 8799e0a..b47c282 100644
--- a/cmd-run-shell.c
+++ b/cmd-run-shell.c
@@ -40,7 +40,6 @@ const struct cmd_entry cmd_run_shell_entry = {
        "bt:", 1, 1,
        "[-b] " CMD_TARGET_PANE_USAGE " shell-command",
        0,
-       NULL,
        cmd_run_shell_exec
 };
 
diff --git a/cmd-save-buffer.c b/cmd-save-buffer.c
index db80e48..368c517 100644
--- a/cmd-save-buffer.c
+++ b/cmd-save-buffer.c
@@ -39,7 +39,6 @@ const struct cmd_entry cmd_save_buffer_entry = {
        "ab:", 1, 1,
        "[-a] " CMD_BUFFER_USAGE " path",
        0,
-       NULL,
        cmd_save_buffer_exec
 };
 
@@ -48,7 +47,6 @@ const struct cmd_entry cmd_show_buffer_entry = {
        "b:", 0, 0,
        CMD_BUFFER_USAGE,
        0,
-       NULL,
        cmd_save_buffer_exec
 };
 
diff --git a/cmd-select-layout.c b/cmd-select-layout.c
index a5f5519..5f00774 100644
--- a/cmd-select-layout.c
+++ b/cmd-select-layout.c
@@ -24,15 +24,12 @@
  * Switch window to selected layout.
  */
 
-void            cmd_select_layout_key_binding(struct cmd *, int);
 enum cmd_retval         cmd_select_layout_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_select_layout_entry = {
        "select-layout", "selectl",
        "npt:", 0, 1,
        "[-np] " CMD_TARGET_WINDOW_USAGE " [layout-name]",
-       0,
-       cmd_select_layout_key_binding,
        cmd_select_layout_exec
 };
 
@@ -41,7 +38,6 @@ const struct cmd_entry cmd_next_layout_entry = {
        "t:", 0, 0,
        CMD_TARGET_WINDOW_USAGE,
        0,
-       NULL,
        cmd_select_layout_exec
 };
 
@@ -50,35 +46,9 @@ const struct cmd_entry cmd_previous_layout_entry = {
        "t:", 0, 0,
        CMD_TARGET_WINDOW_USAGE,
        0,
-       NULL,
        cmd_select_layout_exec
 };
 
-void
-cmd_select_layout_key_binding(struct cmd *self, int key)
-{
-       switch (key) {
-       case '1' | KEYC_ESCAPE:
-               self->args = args_create(1, "even-horizontal");
-               break;
-       case '2' | KEYC_ESCAPE:
-               self->args = args_create(1, "even-vertical");
-               break;
-       case '3' | KEYC_ESCAPE:
-               self->args = args_create(1, "main-horizontal");
-               break;
-       case '4' | KEYC_ESCAPE:
-               self->args = args_create(1, "main-vertical");
-               break;
-       case '5' | KEYC_ESCAPE:
-               self->args = args_create(1, "tiled");
-               break;
-       default:
-               self->args = args_create(0);
-               break;
-       }
-}
-
 enum cmd_retval
 cmd_select_layout_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-select-pane.c b/cmd-select-pane.c
index a491c43..99594ae 100644
--- a/cmd-select-pane.c
+++ b/cmd-select-pane.c
@@ -24,7 +24,6 @@
  * Select pane.
  */
 
-void            cmd_select_pane_key_binding(struct cmd *, int);
 enum cmd_retval         cmd_select_pane_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_select_pane_entry = {
@@ -32,7 +31,6 @@ const struct cmd_entry cmd_select_pane_entry = {
        "DdeLlRt:U", 0, 0,
        "[-DdeLlRU] " CMD_TARGET_PANE_USAGE,
        0,
-       cmd_select_pane_key_binding,
        cmd_select_pane_exec
 };
 
@@ -41,26 +39,9 @@ const struct cmd_entry cmd_last_pane_entry = {
        "det:", 0, 0,
        "[-de] " CMD_TARGET_WINDOW_USAGE,
        0,
-       NULL,
        cmd_select_pane_exec
 };
 
-void
-cmd_select_pane_key_binding(struct cmd *self, int key)
-{
-       self->args = args_create(0);
-       if (key == KEYC_UP)
-               args_set(self->args, 'U', NULL);
-       if (key == KEYC_DOWN)
-               args_set(self->args, 'D', NULL);
-       if (key == KEYC_LEFT)
-               args_set(self->args, 'L', NULL);
-       if (key == KEYC_RIGHT)
-               args_set(self->args, 'R', NULL);
-       if (key == 'o')
-               args_set(self->args, 't', ":.+");
-}
-
 enum cmd_retval
 cmd_select_pane_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-select-window.c b/cmd-select-window.c
index 744bdf7..f530f1f 100644
--- a/cmd-select-window.c
+++ b/cmd-select-window.c
@@ -26,7 +26,6 @@
  * Select window by index.
  */
 
-void            cmd_select_window_key_binding(struct cmd *, int);
 enum cmd_retval         cmd_select_window_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_select_window_entry = {
@@ -34,7 +33,6 @@ const struct cmd_entry cmd_select_window_entry = {
        "lnpTt:", 0, 0,
        "[-lnpT] " CMD_TARGET_WINDOW_USAGE,
        0,
-       cmd_select_window_key_binding,
        cmd_select_window_exec
 };
 
@@ -43,7 +41,6 @@ const struct cmd_entry cmd_next_window_entry = {
        "at:", 0, 0,
        "[-a] " CMD_TARGET_SESSION_USAGE,
        0,
-       cmd_select_window_key_binding,
        cmd_select_window_exec
 };
 
@@ -52,7 +49,6 @@ const struct cmd_entry cmd_previous_window_entry = {
        "at:", 0, 0,
        "[-a] " CMD_TARGET_SESSION_USAGE,
        0,
-       cmd_select_window_key_binding,
        cmd_select_window_exec
 };
 
@@ -61,24 +57,9 @@ const struct cmd_entry cmd_last_window_entry = {
        "t:", 0, 0,
        CMD_TARGET_SESSION_USAGE,
        0,
-       NULL,
        cmd_select_window_exec
 };
 
-void
-cmd_select_window_key_binding(struct cmd *self, int key)
-{
-       char    tmp[16];
-
-       self->args = args_create(0);
-       if (key >= '0' && key <= '9') {
-               xsnprintf(tmp, sizeof tmp, ":%d", key - '0');
-               args_set(self->args, 't', tmp);
-       }
-       if (key == ('n' | KEYC_ESCAPE) || key == ('p' | KEYC_ESCAPE))
-               args_set(self->args, 'a', NULL);
-}
-
 enum cmd_retval
 cmd_select_window_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-send-keys.c b/cmd-send-keys.c
index ef61d2b..7a4d97d 100644
--- a/cmd-send-keys.c
+++ b/cmd-send-keys.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_send_keys_entry = {
        "lRt:", 0, -1,
        "[-lR] " CMD_TARGET_PANE_USAGE " key ...",
        0,
-       NULL,
        cmd_send_keys_exec
 };
 
@@ -43,7 +42,6 @@ const struct cmd_entry cmd_send_prefix_entry = {
        "2t:", 0, 0,
        "[-2] " CMD_TARGET_PANE_USAGE,
        0,
-       NULL,
        cmd_send_keys_exec
 };
 
diff --git a/cmd-set-buffer.c b/cmd-set-buffer.c
index 88bd0c1..0ec362b 100644
--- a/cmd-set-buffer.c
+++ b/cmd-set-buffer.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_set_buffer_entry = {
        "ab:n:", 0, 1,
        "[-a] " CMD_BUFFER_USAGE " [-n new-buffer-name] data",
        0,
-       NULL,
        cmd_set_buffer_exec
 };
 
diff --git a/cmd-set-environment.c b/cmd-set-environment.c
index 7a446fc..83e63b4 100644
--- a/cmd-set-environment.c
+++ b/cmd-set-environment.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_set_environment_entry = {
        "grt:u", 1, 2,
        "[-gru] " CMD_TARGET_SESSION_USAGE " name [value]",
        0,
-       NULL,
        cmd_set_environment_exec
 };
 
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 5cea493..01d691d 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -69,7 +69,6 @@ const struct cmd_entry cmd_set_option_entry = {
        "agoqst:uw", 1, 2,
        "[-agosquw] [-t target-session|target-window] option [value]",
        0,
-       NULL,
        cmd_set_option_exec
 };
 
@@ -78,7 +77,6 @@ const struct cmd_entry cmd_set_window_option_entry = {
        "agoqt:u", 1, 2,
        "[-agoqu] " CMD_TARGET_WINDOW_USAGE " option [value]",
        0,
-       NULL,
        cmd_set_option_exec
 };
 
diff --git a/cmd-show-environment.c b/cmd-show-environment.c
index 4ba111b..7737752 100644
--- a/cmd-show-environment.c
+++ b/cmd-show-environment.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_show_environment_entry = {
        "gt:", 0, 1,
        "[-g] " CMD_TARGET_SESSION_USAGE " [name]",
        0,
-       NULL,
        cmd_show_environment_exec
 };
 
diff --git a/cmd-show-messages.c b/cmd-show-messages.c
index 45358fd..3b7baa8 100644
--- a/cmd-show-messages.c
+++ b/cmd-show-messages.c
@@ -36,7 +36,6 @@ const struct cmd_entry cmd_show_messages_entry = {
        "IJTt:", 0, 0,
        "[-IJT] " CMD_TARGET_CLIENT_USAGE,
        0,
-       NULL,
        cmd_show_messages_exec
 };
 
@@ -45,7 +44,6 @@ const struct cmd_entry cmd_server_info_entry = {
        "", 0, 0,
        "",
        0,
-       NULL,
        cmd_show_messages_exec
 };
 
diff --git a/cmd-show-options.c b/cmd-show-options.c
index b2c6ec3..a5011e7 100644
--- a/cmd-show-options.c
+++ b/cmd-show-options.c
@@ -39,7 +39,6 @@ const struct cmd_entry cmd_show_options_entry = {
        "gqst:vw", 0, 1,
        "[-gqsvw] [-t target-session|target-window] [option]",
        0,
-       NULL,
        cmd_show_options_exec
 };
 
@@ -48,7 +47,6 @@ const struct cmd_entry cmd_show_window_options_entry = {
        "gvt:", 0, 1,
        "[-gv] " CMD_TARGET_WINDOW_USAGE " [option]",
        0,
-       NULL,
        cmd_show_options_exec
 };
 
diff --git a/cmd-source-file.c b/cmd-source-file.c
index 8fcfe2f..8610d80 100644
--- a/cmd-source-file.c
+++ b/cmd-source-file.c
@@ -36,7 +36,6 @@ const struct cmd_entry cmd_source_file_entry = {
        "", 1, 1,
        "path",
        0,
-       NULL,
        cmd_source_file_exec
 };
 
diff --git a/cmd-split-window.c b/cmd-split-window.c
index 8a608bd..797332c 100644
--- a/cmd-split-window.c
+++ b/cmd-split-window.c
@@ -31,7 +31,6 @@
  * Split a window (add a new pane).
  */
 
-void            cmd_split_window_key_binding(struct cmd *, int);
 enum cmd_retval         cmd_split_window_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_split_window_entry = {
@@ -40,18 +39,9 @@ const struct cmd_entry cmd_split_window_entry = {
        "[-dhvP] [-c start-directory] [-F format] [-p percentage|-l size] "
        CMD_TARGET_PANE_USAGE " [command]",
        0,
-       cmd_split_window_key_binding,
        cmd_split_window_exec
 };
 
-void
-cmd_split_window_key_binding(struct cmd *self, int key)
-{
-       self->args = args_create(0);
-       if (key == '%')
-               args_set(self->args, 'h', NULL);
-}
-
 enum cmd_retval
 cmd_split_window_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-suspend-client.c b/cmd-suspend-client.c
index 5d1e7fe..63ed874 100644
--- a/cmd-suspend-client.c
+++ b/cmd-suspend-client.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_suspend_client_entry = {
        "t:", 0, 0,
        CMD_TARGET_CLIENT_USAGE,
        0,
-       NULL,
        cmd_suspend_client_exec
 };
 
diff --git a/cmd-swap-pane.c b/cmd-swap-pane.c
index e8170bb..918a2e4 100644
--- a/cmd-swap-pane.c
+++ b/cmd-swap-pane.c
@@ -26,7 +26,6 @@
  * Swap two panes.
  */
 
-void            cmd_swap_pane_key_binding(struct cmd *, int);
 enum cmd_retval         cmd_swap_pane_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_swap_pane_entry = {
@@ -34,20 +33,9 @@ const struct cmd_entry cmd_swap_pane_entry = {
        "dDs:t:U", 0, 0,
        "[-dDU] " CMD_SRCDST_PANE_USAGE,
        0,
-       cmd_swap_pane_key_binding,
        cmd_swap_pane_exec
 };
 
-void
-cmd_swap_pane_key_binding(struct cmd *self, int key)
-{
-       self->args = args_create(0);
-       if (key == '{')
-               args_set(self->args, 'U', NULL);
-       else if (key == '}')
-               args_set(self->args, 'D', NULL);
-}
-
 enum cmd_retval
 cmd_swap_pane_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-swap-window.c b/cmd-swap-window.c
index 00bf6d4..655b910 100644
--- a/cmd-swap-window.c
+++ b/cmd-swap-window.c
@@ -33,7 +33,6 @@ const struct cmd_entry cmd_swap_window_entry = {
        "ds:t:", 0, 0,
        "[-d] " CMD_SRCDST_WINDOW_USAGE,
        0,
-       NULL,
        cmd_swap_window_exec
 };
 
diff --git a/cmd-switch-client.c b/cmd-switch-client.c
index 872570b..439f593 100644
--- a/cmd-switch-client.c
+++ b/cmd-switch-client.c
@@ -27,7 +27,6 @@
  * Switch client to a different session.
  */
 
-void            cmd_switch_client_key_binding(struct cmd *, int);
 enum cmd_retval         cmd_switch_client_exec(struct cmd *, struct cmd_q *);
 
 const struct cmd_entry cmd_switch_client_entry = {
@@ -35,27 +34,9 @@ const struct cmd_entry cmd_switch_client_entry = {
        "lc:npt:r", 0, 0,
        "[-lnpr] [-c target-client] [-t target-session]",
        CMD_READONLY,
-       cmd_switch_client_key_binding,
        cmd_switch_client_exec
 };
 
-void
-cmd_switch_client_key_binding(struct cmd *self, int key)
-{
-       self->args = args_create(0);
-       switch (key) {
-       case '(':
-               args_set(self->args, 'p', NULL);
-               break;
-       case ')':
-               args_set(self->args, 'n', NULL);
-               break;
-       case 'L':
-               args_set(self->args, 'l', NULL);
-               break;
-       }
-}
-
 enum cmd_retval
 cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq)
 {
diff --git a/cmd-unbind-key.c b/cmd-unbind-key.c
index 92657c2..710210c 100644
--- a/cmd-unbind-key.c
+++ b/cmd-unbind-key.c
@@ -34,7 +34,6 @@ const struct cmd_entry cmd_unbind_key_entry = {
        "acnt:", 0, 1,
        "[-acn] [-t mode-table] key",
        0,
-       NULL,
        cmd_unbind_key_exec
 };
 
diff --git a/cmd-unlink-window.c b/cmd-unlink-window.c
index d4c77f2..adc7016 100644
--- a/cmd-unlink-window.c
+++ b/cmd-unlink-window.c
@@ -31,7 +31,6 @@ const struct cmd_entry cmd_unlink_window_entry = {
        "kt:", 0, 0,
        "[-k] " CMD_TARGET_WINDOW_USAGE,
        0,
-       NULL,
        cmd_unlink_window_exec
 };
 
diff --git a/cmd-wait-for.c b/cmd-wait-for.c
index 48a6fe3..a3e8585 100644
--- a/cmd-wait-for.c
+++ b/cmd-wait-for.c
@@ -35,7 +35,6 @@ const struct cmd_entry cmd_wait_for_entry = {
        "LSU", 1, 1,
        "[-L|-S|-U] channel",
        0,
-       NULL,
        cmd_wait_for_exec
 };
 
diff --git a/key-bindings.c b/key-bindings.c
index 55c8aeb..13ba9f2 100644
--- a/key-bindings.c
+++ b/key-bindings.c
@@ -84,107 +84,99 @@ key_bindings_remove(int key)
 void
 key_bindings_init(void)
 {
-       static const struct {
-               int                      key;
-               int                      can_repeat;
-               const struct cmd_entry  *entry;
-       } table[] = {
-               { ' ',                    0, &cmd_next_layout_entry },
-               { '!',                    0, &cmd_break_pane_entry },
-               { '"',                    0, &cmd_split_window_entry },
-               { '#',                    0, &cmd_list_buffers_entry },
-               { '$',                    0, &cmd_command_prompt_entry },
-               { '%',                    0, &cmd_split_window_entry },
-               { '&',                    0, &cmd_confirm_before_entry },
-               { '(',                    0, &cmd_switch_client_entry },
-               { ')',                    0, &cmd_switch_client_entry },
-               { ',',                    0, &cmd_command_prompt_entry },
-               { '-',                    0, &cmd_delete_buffer_entry },
-               { '.',                    0, &cmd_command_prompt_entry },
-               { '0',                    0, &cmd_select_window_entry },
-               { '1',                    0, &cmd_select_window_entry },
-               { '2',                    0, &cmd_select_window_entry },
-               { '3',                    0, &cmd_select_window_entry },
-               { '4',                    0, &cmd_select_window_entry },
-               { '5',                    0, &cmd_select_window_entry },
-               { '6',                    0, &cmd_select_window_entry },
-               { '7',                    0, &cmd_select_window_entry },
-               { '8',                    0, &cmd_select_window_entry },
-               { '9',                    0, &cmd_select_window_entry },
-               { ':',                    0, &cmd_command_prompt_entry },
-               { ';',                    0, &cmd_last_pane_entry },
-               { '=',                    0, &cmd_choose_buffer_entry },
-               { '?',                    0, &cmd_list_keys_entry },
-               { 'D',                    0, &cmd_choose_client_entry },
-               { 'L',                    0, &cmd_switch_client_entry },
-               { '[',                    0, &cmd_copy_mode_entry },
-               { '\'',                   0, &cmd_command_prompt_entry },
-               { '\002', /* C-b */       0, &cmd_send_prefix_entry },
-               { '\017', /* C-o */       0, &cmd_rotate_window_entry },
-               { '\032', /* C-z */       0, &cmd_suspend_client_entry },
-               { ']',                    0, &cmd_paste_buffer_entry },
-               { 'c',                    0, &cmd_new_window_entry },
-               { 'd',                    0, &cmd_detach_client_entry },
-               { 'f',                    0, &cmd_command_prompt_entry },
-               { 'i',                    0, &cmd_display_message_entry },
-               { 'l',                    0, &cmd_last_window_entry },
-               { 'n',                    0, &cmd_next_window_entry },
-               { 'o',                    0, &cmd_select_pane_entry },
-               { 'p',                    0, &cmd_previous_window_entry },
-               { 'q',                    0, &cmd_display_panes_entry },
-               { 'r',                    0, &cmd_refresh_client_entry },
-               { 's',                    0, &cmd_choose_tree_entry },
-               { 't',                    0, &cmd_clock_mode_entry },
-               { 'w',                    0, &cmd_choose_window_entry },
-               { 'x',                    0, &cmd_confirm_before_entry },
-               { 'z',                    0, &cmd_resize_pane_entry },
-               { '{',                    0, &cmd_swap_pane_entry },
-               { '}',                    0, &cmd_swap_pane_entry },
-               { '~',                    0, &cmd_show_messages_entry },
-               { '1' | KEYC_ESCAPE,      0, &cmd_select_layout_entry },
-               { '2' | KEYC_ESCAPE,      0, &cmd_select_layout_entry },
-               { '3' | KEYC_ESCAPE,      0, &cmd_select_layout_entry },
-               { '4' | KEYC_ESCAPE,      0, &cmd_select_layout_entry },
-               { '5' | KEYC_ESCAPE,      0, &cmd_select_layout_entry },
-               { KEYC_PPAGE,             0, &cmd_copy_mode_entry },
-               { 'n' | KEYC_ESCAPE,      0, &cmd_next_window_entry },
-               { 'o' | KEYC_ESCAPE,      0, &cmd_rotate_window_entry },
-               { 'p' | KEYC_ESCAPE,      0, &cmd_previous_window_entry },
-               { KEYC_UP,                1, &cmd_select_pane_entry },
-               { KEYC_DOWN,              1, &cmd_select_pane_entry },
-               { KEYC_LEFT,              1, &cmd_select_pane_entry },
-               { KEYC_RIGHT,             1, &cmd_select_pane_entry },
-               { KEYC_UP | KEYC_ESCAPE,  1, &cmd_resize_pane_entry },
-               { KEYC_DOWN | KEYC_ESCAPE,  1, &cmd_resize_pane_entry },
-               { KEYC_LEFT | KEYC_ESCAPE,  1, &cmd_resize_pane_entry },
-               { KEYC_RIGHT | KEYC_ESCAPE, 1, &cmd_resize_pane_entry },
-               { KEYC_UP | KEYC_CTRL,    1, &cmd_resize_pane_entry },
-               { KEYC_DOWN | KEYC_CTRL,  1, &cmd_resize_pane_entry },
-               { KEYC_LEFT | KEYC_CTRL,  1, &cmd_resize_pane_entry },
-               { KEYC_RIGHT | KEYC_CTRL, 1, &cmd_resize_pane_entry },
+       static const char* defaults[] = {
+               "bind C-b send-prefix",
+               "bind C-o rotate-window",
+               "bind C-z suspend-client",
+               "bind Space next-layout",
+               "bind ! break-pane",
+               "bind '\"' split-window",
+               "bind '#' list-buffers",
+               "bind '$' command-prompt -I'#S' \"rename-session '%%'\"",
+               "bind % split-window -h",
+               "bind & confirm-before -p\"kill-window #W? (y/n)\" kill-window",
+               "bind \"'\" command-prompt -pindex \"select-window -t ':%%'\"",
+               "bind ( switch-client -p",
+               "bind ) switch-client -n",
+               "bind , command-prompt -I'#W' \"rename-window '%%'\"",
+               "bind - delete-buffer",
+               "bind . command-prompt \"move-window -t '%%'\"",
+               "bind 0 select-window -t:0",
+               "bind 1 select-window -t:1",
+               "bind 2 select-window -t:2",
+               "bind 3 select-window -t:3",
+               "bind 4 select-window -t:4",
+               "bind 5 select-window -t:5",
+               "bind 6 select-window -t:6",
+               "bind 7 select-window -t:7",
+               "bind 8 select-window -t:8",
+               "bind 9 select-window -t:9",
+               "bind : command-prompt",
+               "bind \\; last-pane",
+               "bind = choose-buffer",
+               "bind ? list-keys",
+               "bind D choose-client",
+               "bind L switch-client -l",
+               "bind [ copy-mode",
+               "bind ] paste-buffer",
+               "bind c new-window",
+               "bind d detach-client",
+               "bind f command-prompt \"find-window '%%'\"",
+               "bind i display-message",
+               "bind l last-window",
+               "bind n next-window",
+               "bind o select-pane -t:.+",
+               "bind p previous-window",
+               "bind q display-panes",
+               "bind r refresh-client",
+               "bind s choose-tree",
+               "bind t clock-mode",
+               "bind w choose-window",
+               "bind x confirm-before -p\"kill-pane #P? (y/n)\" kill-pane",
+               "bind z resize-pane -Z",
+               "bind { swap-pane -U",
+               "bind } swap-pane -D",
+               "bind '~' show-messages",
+               "bind PPage copy-mode -u",
+               "bind -r Up select-pane -U",
+               "bind -r Down select-pane -D",
+               "bind -r Left select-pane -L",
+               "bind -r Right select-pane -R",
+               "bind M-1 select-layout even-horizontal",
+               "bind M-2 select-layout even-vertical",
+               "bind M-3 select-layout main-horizontal",
+               "bind M-4 select-layout main-vertical",
+               "bind M-5 select-layout tiled",
+               "bind M-n next-window -a",
+               "bind M-o rotate-window -D",
+               "bind M-p previous-window -a",
+               "bind -r M-Up resize-pane -U 5",
+               "bind -r M-Down resize-pane -D 5",
+               "bind -r M-Left resize-pane -L 5",
+               "bind -r M-Right resize-pane -R 5",
+               "bind -r C-Up resize-pane -U",
+               "bind -r C-Down resize-pane -D",
+               "bind -r C-Left resize-pane -L",
+               "bind -r C-Right resize-pane -R",
        };
        u_int            i;
-       struct cmd      *cmd;
        struct cmd_list *cmdlist;
+       char*            cause;
+       int              error;
+       struct cmd_q    *cmdq;
 
        RB_INIT(&key_bindings);
 
-       for (i = 0; i < nitems(table); i++) {
-               cmdlist = xcalloc(1, sizeof *cmdlist);
-               cmdlist->references = 1;
-               TAILQ_INIT(&cmdlist->list);
-
-               cmd = xcalloc(1, sizeof *cmd);
-               cmd->entry = table[i].entry;
-               if (cmd->entry->key_binding != NULL)
-                       cmd->entry->key_binding(cmd, table[i].key);
-               else
-                       cmd->args = args_create(0);
-               TAILQ_INSERT_HEAD(&cmdlist->list, cmd, qentry);
-
-               key_bindings_add(
-                   table[i].key | KEYC_PREFIX, table[i].can_repeat, cmdlist);
+       cmdq = cmdq_new (NULL);
+       for (i = 0; i < nitems(defaults); i++) {
+               error = cmd_string_parse(defaults[i], &cmdlist,
+                   "<default-keys>", i, &cause);
+               if (error != 0)
+                       fatalx("bad default key");
+               cmdq_run (cmdq, cmdlist);
+               cmd_list_free (cmdlist);
        }
+       cmdq_free (cmdq);
 }
 
 void
diff --git a/tmux.h b/tmux.h
index d119742..0a677a3 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1492,7 +1492,6 @@ struct cmd_entry {
 #define CMD_READONLY 0x4
        int              flags;
 
-       void             (*key_binding)(struct cmd *, int);
        enum cmd_retval  (*exec)(struct cmd *, struct cmd_q *);
 };
 


commit f0b69c771173583eee8f1457c080746ea6144c5f
Author: nicm <nicm>
Commit: nicm <nicm>

    Fix description of Ss and Se.
---
 tmux.1 |    8 +++-----
 1 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/tmux.1 b/tmux.1
index bb7f5aa..0c738f3 100644
--- a/tmux.1
+++ b/tmux.1
@@ -3648,7 +3648,7 @@ to change the cursor colour from inside
 $ printf '\e033]12;red\e033\e\e'
 .Ed
 .It Em \&Ss , Se
-Change the cursor style.
+Set or reset the cursor style.
 If set, a sequence such as this may be used
 to change the cursor to an underline:
 .Bd -literal -offset indent
@@ -3656,10 +3656,8 @@ $ printf '\e033[4 q'
 .Ed
 .Pp
 If
-.Em Csr
-is set, it will be used to reset the cursor style instead
-of
-.Em Cs .
+.Em Se
+is not set, \&Ss with argument 0 will be used to reset the cursor style 
instead.
 .It Em \&Ms
 This sequence can be used by
 .Nm


-----------------------------------------------------------------------

Summary of changes:
 Makefile.am            |    3 -
 arguments.c            |    1 +
 client.c               |    1 +
 cmd-attach-session.c   |    1 -
 cmd-bind-key.c         |    1 -
 cmd-break-pane.c       |    3 +-
 cmd-capture-pane.c     |    1 -
 cmd-choose-buffer.c    |    4 +-
 cmd-choose-client.c    |    7 ++-
 cmd-choose-tree.c      |   12 +++-
 cmd-clear-history.c    |    1 -
 cmd-clock-mode.c       |    1 -
 cmd-command-prompt.c   |   30 --------
 cmd-confirm-before.c   |   22 +-----
 cmd-copy-mode.c        |   10 ---
 cmd-delete-buffer.c    |    1 -
 cmd-detach-client.c    |   18 +++++-
 cmd-display-message.c  |    6 ++-
 cmd-display-panes.c    |    1 -
 cmd-find-window.c      |    6 ++-
 cmd-has-session.c      |    1 -
 cmd-if-shell.c         |    1 -
 cmd-join-pane.c        |   17 -----
 cmd-kill-pane.c        |    1 -
 cmd-kill-server.c      |    2 -
 cmd-kill-session.c     |    1 -
 cmd-kill-window.c      |    1 -
 cmd-link-window.c      |    1 -
 cmd-list-buffers.c     |    4 +-
 cmd-list-clients.c     |    6 ++-
 cmd-list-commands.c    |   54 --------------
 cmd-list-keys.c        |   33 +++++++++-
 cmd-list-panes.c       |    1 -
 cmd-list-sessions.c    |    9 ++-
 cmd-list-windows.c     |   17 ++++-
 cmd-load-buffer.c      |    1 -
 cmd-lock-server.c      |    3 -
 cmd-move-window.c      |    1 -
 cmd-new-session.c      |   17 ++++-
 cmd-new-window.c       |    3 +-
 cmd-paste-buffer.c     |    1 -
 cmd-pipe-pane.c        |    1 -
 cmd-queue.c            |    4 +-
 cmd-refresh-client.c   |    1 -
 cmd-rename-session.c   |    1 -
 cmd-rename-window.c    |    1 -
 cmd-resize-pane.c      |   48 -------------
 cmd-respawn-pane.c     |    1 -
 cmd-respawn-window.c   |    1 -
 cmd-rotate-window.c    |   10 ---
 cmd-run-shell.c        |    1 -
 cmd-save-buffer.c      |    2 -
 cmd-select-layout.c    |   29 --------
 cmd-select-pane.c      |   19 -----
 cmd-select-window.c    |   19 -----
 cmd-send-keys.c        |    2 -
 cmd-set-buffer.c       |    1 -
 cmd-set-environment.c  |    1 -
 cmd-set-option.c       |    2 -
 cmd-show-environment.c |    1 -
 cmd-show-messages.c    |    2 -
 cmd-show-options.c     |    2 -
 cmd-source-file.c      |    1 -
 cmd-split-window.c     |   12 +---
 cmd-suspend-client.c   |   55 ---------------
 cmd-swap-pane.c        |   12 ---
 cmd-swap-window.c      |    1 -
 cmd-switch-client.c    |   19 -----
 cmd-unbind-key.c       |    1 -
 cmd-unlink-window.c    |    1 -
 cmd-wait-for.c         |    1 -
 control.c              |    2 +-
 format.c               |    1 +
 job.c                  |    1 +
 key-bindings.c         |  180 +++++++++++++++++++++++-------------------------
 log.c                  |    6 +-
 options.c              |    2 +-
 osdep-linux.c          |    1 +
 screen-write.c         |   26 ++++----
 screen.c               |    6 +-
 server-fn.c            |    2 +-
 signal.c               |    2 +
 status.c               |    2 +-
 style.c                |    2 +
 tmux.1                 |    8 +--
 tmux.c                 |    7 +-
 tmux.h                 |  123 ++++++---------------------------
 xmalloc.c              |    9 +--
 88 files changed, 284 insertions(+), 653 deletions(-)
 delete mode 100644 cmd-list-commands.c
 delete mode 100644 cmd-suspend-client.c


hooks/post-receive
-- 
tmux

------------------------------------------------------------------------------
Comprehensive Server Monitoring with Site24x7.
Monitor 10 servers for $9/Month.
Get alerted through email, SMS, voice calls or mobile push notifications.
Take corrective actions from your mobile device.
http://p.sf.net/sfu/Zoho
_______________________________________________
tmux-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to