Instead of requiring a prompt to enter all numbers >10, go back to

0-9a-z and add A-Z and enter the prompt when M-0 to M-9 are pressed
(like in copy mode). Prompted by request from mcbride@, help from Thomas
Adam.
This commit is contained in:
Nicholas Marriott 2012-08-27 21:29:23 +00:00
parent d39c58c01c
commit 753775033a
2 changed files with 107 additions and 64 deletions

View File

@ -192,16 +192,16 @@ struct mode_key_tree mode_key_tree_vi_edit;
/* vi choice selection keys. */ /* vi choice selection keys. */
const struct mode_key_entry mode_key_vi_choice[] = { const struct mode_key_entry mode_key_vi_choice[] = {
{ '0', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '0' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '1', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '1' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '2', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '2' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '3', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '3' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '4', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '4' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '5', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '5' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '6', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '6' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '7', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '7' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '8', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '8' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '9', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '9' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '\002' /* C-b */, 0, MODEKEYCHOICE_PAGEUP }, { '\002' /* C-b */, 0, MODEKEYCHOICE_PAGEUP },
{ '\003' /* C-c */, 0, MODEKEYCHOICE_CANCEL }, { '\003' /* C-c */, 0, MODEKEYCHOICE_CANCEL },
{ '\005' /* C-e */, 0, MODEKEYCHOICE_SCROLLDOWN }, { '\005' /* C-e */, 0, MODEKEYCHOICE_SCROLLDOWN },
@ -330,16 +330,16 @@ struct mode_key_tree mode_key_tree_emacs_edit;
/* emacs choice selection keys. */ /* emacs choice selection keys. */
const struct mode_key_entry mode_key_emacs_choice[] = { const struct mode_key_entry mode_key_emacs_choice[] = {
{ '0', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '0' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '1', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '1' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '2', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '2' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '3', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '3' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '4', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '4' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '5', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '5' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '6', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '6' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '7', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '7' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '8', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '8' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '9', 0, MODEKEYCHOICE_STARTNUMBERPREFIX }, { '9' | KEYC_ESCAPE, 0, MODEKEYCHOICE_STARTNUMBERPREFIX },
{ '\003' /* C-c */, 0, MODEKEYCHOICE_CANCEL }, { '\003' /* C-c */, 0, MODEKEYCHOICE_CANCEL },
{ '\016' /* C-n */, 0, MODEKEYCHOICE_DOWN }, { '\016' /* C-n */, 0, MODEKEYCHOICE_DOWN },
{ '\020' /* C-p */, 0, MODEKEYCHOICE_UP }, { '\020' /* C-p */, 0, MODEKEYCHOICE_UP },

View File

@ -71,7 +71,8 @@ struct window_choose_mode_data {
void (*freefn)(struct window_choose_data *); void (*freefn)(struct window_choose_data *);
}; };
int window_choose_index_key(int); int window_choose_key_index(struct window_choose_mode_data *, u_int);
int window_choose_index_key(struct window_choose_mode_data *, int);
void window_choose_prompt_input(enum window_choose_input_type, void window_choose_prompt_input(enum window_choose_input_type,
const char *, struct window_pane *, int); const char *, struct window_pane *, int);
@ -89,7 +90,7 @@ window_choose_add(struct window_pane *wp, struct window_choose_data *wcd)
item->wcd = wcd; item->wcd = wcd;
item->pos = ARRAY_LENGTH(&data->list) - 1; item->pos = ARRAY_LENGTH(&data->list) - 1;
data->width = snprintf (tmp, sizeof tmp , "%u", item->pos); data->width = xsnprintf (tmp, sizeof tmp , "%u", item->pos);
} }
void void
@ -241,27 +242,48 @@ window_choose_key(struct window_pane *wp, unused struct session *sess, int key)
items = ARRAY_LENGTH(&data->list); items = ARRAY_LENGTH(&data->list);
if (data->input_type == WINDOW_CHOOSE_GOTO_ITEM) {
switch (mode_key_lookup(&data->mdata, key)) {
case MODEKEYCHOICE_CANCEL:
data->input_type = WINDOW_CHOOSE_NORMAL;
window_choose_redraw_screen(wp);
break;
case MODEKEYCHOICE_CHOOSE:
n = strtonum(data->input_str, 0, INT_MAX, NULL);
if (n > items - 1) {
data->input_type = WINDOW_CHOOSE_NORMAL;
window_choose_redraw_screen(wp);
break;
}
item = &ARRAY_ITEM(&data->list, n);
window_choose_fire_callback(wp, item->wcd);
window_pane_reset_mode(wp);
break;
case MODEKEYCHOICE_BACKSPACE:
input_len = strlen(data->input_str);
if (input_len > 0)
data->input_str[input_len - 1] = '\0';
window_choose_redraw_screen(wp);
break;
default:
if (key < '0' || key > '9')
break;
window_choose_prompt_input(WINDOW_CHOOSE_GOTO_ITEM,
"Goto Item", wp, key);
break;
}
return;
}
switch (mode_key_lookup(&data->mdata, key)) { switch (mode_key_lookup(&data->mdata, key)) {
case MODEKEYCHOICE_CANCEL: case MODEKEYCHOICE_CANCEL:
window_choose_fire_callback(wp, NULL); window_choose_fire_callback(wp, NULL);
window_pane_reset_mode(wp); window_pane_reset_mode(wp);
break; break;
case MODEKEYCHOICE_CHOOSE: case MODEKEYCHOICE_CHOOSE:
switch (data->input_type) { item = &ARRAY_ITEM(&data->list, data->selected);
case WINDOW_CHOOSE_NORMAL: window_choose_fire_callback(wp, item->wcd);
item = &ARRAY_ITEM(&data->list, data->selected); window_pane_reset_mode(wp);
window_choose_fire_callback(wp, item->wcd);
window_pane_reset_mode(wp);
break;
case WINDOW_CHOOSE_GOTO_ITEM:
n = strtonum(data->input_str, 0, INT_MAX, NULL);
if (n > items - 1)
break;
item = &ARRAY_ITEM(&data->list, n);
window_choose_fire_callback(wp, item->wcd);
window_pane_reset_mode(wp);
break;
}
break; break;
case MODEKEYCHOICE_UP: case MODEKEYCHOICE_UP:
if (items == 0) if (items == 0)
@ -366,29 +388,21 @@ window_choose_key(struct window_pane *wp, unused struct session *sess, int key)
window_choose_redraw_screen(wp); window_choose_redraw_screen(wp);
break; break;
case MODEKEYCHOICE_STARTNUMBERPREFIX: case MODEKEYCHOICE_STARTNUMBERPREFIX:
if (key < '0' && key > '9') key &= KEYC_MASK_KEY;
if (key < '0' || key > '9')
break; break;
window_choose_prompt_input(WINDOW_CHOOSE_GOTO_ITEM,
/* "Goto Item", wp, key);
* If there's less than ten items (0-9) then pressing a number
* will automatically select that item; otherwise, prompt for
* the item to go to.
*/
if (ARRAY_LENGTH(&data->list) - 1 <= 9) {
idx = window_choose_index_key(key);
if (idx < 0 || (u_int) idx >= ARRAY_LENGTH(&data->list))
break;
data->selected = idx;
item = &ARRAY_ITEM(&data->list, data->selected);
window_choose_fire_callback(wp, item->wcd);
window_pane_reset_mode(wp);
} else {
window_choose_prompt_input(
WINDOW_CHOOSE_GOTO_ITEM, "Goto item", wp, key);
}
break; break;
default: default:
idx = window_choose_index_key(data, key);
if (idx < 0 || (u_int) idx >= ARRAY_LENGTH(&data->list))
break;
data->selected = idx;
item = &ARRAY_ITEM(&data->list, data->selected);
window_choose_fire_callback(wp, item->wcd);
window_pane_reset_mode(wp);
break; break;
} }
} }
@ -430,8 +444,8 @@ window_choose_write_line(
struct screen *s = &data->screen; struct screen *s = &data->screen;
struct grid_cell gc; struct grid_cell gc;
size_t last, xoff = 0; size_t last, xoff = 0;
char hdr[32]; char hdr[32], label[32];
int utf8flag; int utf8flag, key;
if (data->callbackfn == NULL) if (data->callbackfn == NULL)
fatalx("called before callback assigned"); fatalx("called before callback assigned");
@ -448,10 +462,14 @@ window_choose_write_line(
if (item->wcd->wl != NULL && if (item->wcd->wl != NULL &&
item->wcd->wl->flags & WINLINK_ALERTFLAGS) item->wcd->wl->flags & WINLINK_ALERTFLAGS)
gc.attr |= GRID_ATTR_BRIGHT; gc.attr |= GRID_ATTR_BRIGHT;
screen_write_nputs(ctx, screen_size_x(s) - 1,
&gc, utf8flag, "(%*d) %s", data->width,
item->pos, item->name);
key = window_choose_key_index(data, data->top + py);
if (key != -1)
xsnprintf (label, sizeof label, "(%c)", key);
else
xsnprintf (label, sizeof label, "(%d)", item->pos);
screen_write_nputs(ctx, screen_size_x(s) - 1, &gc, utf8flag,
"%*s %s", data->width + 2, label, item->name);
} }
while (s->cx < screen_size_x(s)) while (s->cx < screen_size_x(s))
screen_write_putc(ctx, &gc, ' '); screen_write_putc(ctx, &gc, ' ');
@ -470,13 +488,38 @@ window_choose_write_line(
} }
int int
window_choose_index_key(int key) window_choose_key_index(struct window_choose_mode_data *data, u_int idx)
{ {
static const char keys[] = "0123456789"; static const char keys[] = "0123456789"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char *ptr; const char *ptr;
int mkey;
for (ptr = keys; *ptr != '\0'; ptr++) {
mkey = mode_key_lookup(&data->mdata, *ptr);
if (mkey != MODEKEY_NONE && mkey != MODEKEY_OTHER)
continue;
if (idx-- == 0)
return (*ptr);
}
return (-1);
}
int
window_choose_index_key(struct window_choose_mode_data *data, int key)
{
static const char keys[] = "0123456789"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const char *ptr;
int mkey;
u_int idx = 0; u_int idx = 0;
for (ptr = keys; *ptr != '\0'; ptr++) { for (ptr = keys; *ptr != '\0'; ptr++) {
mkey = mode_key_lookup(&data->mdata, *ptr);
if (mkey != MODEKEY_NONE && mkey != MODEKEY_OTHER)
continue;
if (key == *ptr) if (key == *ptr)
return (idx); return (idx);
idx++; idx++;