=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-find.c,v retrieving revision 1.8 retrieving revision 1.9 diff -c -r1.8 -r1.9 *** src/usr.bin/tmux/cmd-find.c 2015/06/04 11:43:51 1.8 --- src/usr.bin/tmux/cmd-find.c 2015/06/05 08:14:16 1.9 *************** *** 1,4 **** ! /* $OpenBSD: cmd-find.c,v 1.8 2015/06/04 11:43:51 nicm Exp $ */ /* * Copyright (c) 2015 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-find.c,v 1.9 2015/06/05 08:14:16 nicm Exp $ */ /* * Copyright (c) 2015 Nicholas Marriott *************** *** 30,35 **** --- 30,37 ---- #define CMD_FIND_QUIET 0x2 #define CMD_FIND_WINDOW_INDEX 0x4 #define CMD_FIND_DEFAULT_MARKED 0x8 + #define CMD_FIND_EXACT_SESSION 0x10 + #define CMD_FIND_EXACT_WINDOW 0x20 enum cmd_find_type { CMD_FIND_PANE, *************** *** 381,386 **** --- 383,392 ---- if (fs->s != NULL) return (0); + /* Stop now if exact only. */ + if (fs->flags & CMD_FIND_EXACT_SESSION) + return (-1); + /* Otherwise look for prefix. */ s = NULL; RB_FOREACH(s_loop, sessions, &sessions) { *************** *** 455,464 **** { struct winlink *wl; const char *errstr; ! int idx, n; struct session *s; log_debug("%s: %s", __func__, window); /* Check for window ids starting with @. */ if (*window == '@') { --- 461,471 ---- { struct winlink *wl; const char *errstr; ! int idx, n, exact; struct session *s; log_debug("%s: %s", __func__, window); + exact = (fs->flags & CMD_FIND_EXACT_WINDOW); /* Check for window ids starting with @. */ if (*window == '@') { *************** *** 469,475 **** } /* Try as an offset. */ ! if (window[0] == '+' || window[0] == '-') { if (window[1] != '\0') n = strtonum(window + 1, 1, INT_MAX, NULL); else --- 476,482 ---- } /* Try as an offset. */ ! if (!exact && window[0] == '+' || window[0] == '-') { if (window[1] != '\0') n = strtonum(window + 1, 1, INT_MAX, NULL); else *************** *** 499,541 **** } /* Try special characters. */ ! if (strcmp(window, "!") == 0) { ! fs->wl = TAILQ_FIRST(&fs->s->lastw); ! if (fs->wl == NULL) ! return (-1); ! fs->idx = fs->wl->idx; ! fs->w = fs->wl->window; ! return (0); ! } else if (strcmp(window, "^") == 0) { ! fs->wl = RB_MIN(winlinks, &fs->s->windows); ! if (fs->wl == NULL) ! return (-1); ! fs->idx = fs->wl->idx; ! fs->w = fs->wl->window; ! return (0); ! } else if (strcmp(window, "$") == 0) { ! fs->wl = RB_MAX(winlinks, &fs->s->windows); ! if (fs->wl == NULL) ! return (-1); ! fs->idx = fs->wl->idx; ! fs->w = fs->wl->window; ! return (0); ! } ! ! /* First see if this is a valid window index in this session. */ ! idx = strtonum(window, 0, INT_MAX, &errstr); ! if (errstr == NULL) { ! if (fs->flags & CMD_FIND_WINDOW_INDEX) { ! fs->idx = idx; return (0); ! } ! fs->wl = winlink_find_by_index(&fs->s->windows, idx); ! if (fs->wl != NULL) { fs->w = fs->wl->window; return (0); } } /* Look for exact matches, error if more than one. */ fs->wl = NULL; RB_FOREACH(wl, winlinks, &fs->s->windows) { --- 506,552 ---- } /* Try special characters. */ ! if (!exact) { ! if (strcmp(window, "!") == 0) { ! fs->wl = TAILQ_FIRST(&fs->s->lastw); ! if (fs->wl == NULL) ! return (-1); ! fs->idx = fs->wl->idx; ! fs->w = fs->wl->window; return (0); ! } else if (strcmp(window, "^") == 0) { ! fs->wl = RB_MIN(winlinks, &fs->s->windows); ! if (fs->wl == NULL) ! return (-1); ! fs->idx = fs->wl->idx; fs->w = fs->wl->window; return (0); + } else if (strcmp(window, "$") == 0) { + fs->wl = RB_MAX(winlinks, &fs->s->windows); + if (fs->wl == NULL) + return (-1); + fs->idx = fs->wl->idx; + fs->w = fs->wl->window; + return (0); } } + /* First see if this is a valid window index in this session. */ + if (window[0] != '+' && window[0] != '-') { + idx = strtonum(window, 0, INT_MAX, &errstr); + if (errstr == NULL) { + if (fs->flags & CMD_FIND_WINDOW_INDEX) { + fs->idx = idx; + return (0); + } + fs->wl = winlink_find_by_index(&fs->s->windows, idx); + if (fs->wl != NULL) { + fs->w = fs->wl->window; + return (0); + } + } + } + /* Look for exact matches, error if more than one. */ fs->wl = NULL; RB_FOREACH(wl, winlinks, &fs->s->windows) { *************** *** 551,556 **** --- 562,572 ---- return (0); } + + /* Stop now if exact only. */ + if (exact) + return (-1); + /* Try as the start of a window name, error if multiple. */ fs->wl = NULL; RB_FOREACH(wl, winlinks, &fs->s->windows) { *************** *** 866,871 **** --- 882,897 ---- break; } } + } + + /* Set exact match flags. */ + if (session != NULL && *session == '=') { + session++; + fs.flags |= CMD_FIND_EXACT_SESSION; + } + if (window != NULL && *window == '=') { + window++; + fs.flags |= CMD_FIND_EXACT_WINDOW; } /* Empty is the same as NULL. */