dmenu-prefixcompletion-4.8.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dmenu-prefixcompletion-4.8.diff (2645B)
---
1 From 39df3b74610c0ddae2e6f49685f49808f91bcc91 Mon Sep 17 00:00:00 2001
2 From: Felix Van der Jeugt <felix.vanderjeugt@gmail.com>
3 Date: Wed, 19 Oct 2016 22:18:21 +0200
4 Subject: [PATCH] tabcomplete with longest common prefix
5
6 when hitting tab, the current input will be set to the longest common prefix
7 of the current selection instead of the first item of the selection
8 ---
9 dmenu.c | 32 ++++++++++++++------------------
10 1 file changed, 14 insertions(+), 18 deletions(-)
11
12 diff --git a/dmenu.c b/dmenu.c
13 index 5e9c367..6ab0893 100644
14 --- a/dmenu.c
15 +++ b/dmenu.c
16 @@ -218,7 +218,7 @@ match(void)
17 char buf[sizeof text], *s;
18 int i, tokc = 0;
19 size_t len, textsize;
20 - struct item *item, *lprefix, *lsubstr, *prefixend, *substrend;
21 + struct item *item, *lprefix, *prefixend;
22
23 strcpy(buf, text);
24 /* separate input text into tokens to be matched individually */
25 @@ -227,8 +227,8 @@ match(void)
26 die("cannot realloc %u bytes:", tokn * sizeof *tokv);
27 len = tokc ? strlen(tokv[0]) : 0;
28
29 - matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL;
30 - textsize = strlen(text) + 1;
31 + matches = lprefix = matchend = prefixend = NULL;
32 + textsize = strlen(text);
33 for (item = items; item && item->text; item++) {
34 for (i = 0; i < tokc; i++)
35 if (!fstrstr(item->text, tokv[i]))
36 @@ -240,8 +240,6 @@ match(void)
37 appenditem(item, &matches, &matchend);
38 else if (!fstrncmp(tokv[0], item->text, len))
39 appenditem(item, &lprefix, &prefixend);
40 - else
41 - appenditem(item, &lsubstr, &substrend);
42 }
43 if (lprefix) {
44 if (matches) {
45 @@ -251,14 +249,6 @@ match(void)
46 matches = lprefix;
47 matchend = prefixend;
48 }
49 - if (lsubstr) {
50 - if (matches) {
51 - matchend->right = lsubstr;
52 - lsubstr->left = matchend;
53 - } else
54 - matches = lsubstr;
55 - matchend = substrend;
56 - }
57 curr = sel = matches;
58 calcoffsets();
59 }
60 @@ -308,6 +298,7 @@ keypress(XKeyEvent *ev)
61 {
62 char buf[32];
63 int len;
64 + struct item * item;
65 KeySym ksym = NoSymbol;
66 Status status;
67
68 @@ -481,12 +472,17 @@ keypress(XKeyEvent *ev)
69 }
70 break;
71 case XK_Tab:
72 - if (!sel)
73 - return;
74 - strncpy(text, sel->text, sizeof text - 1);
75 + if (!matches) break; /* cannot complete no matches */
76 + strncpy(text, matches->text, sizeof text - 1);
77 text[sizeof text - 1] = '\0';
78 - cursor = strlen(text);
79 - match();
80 + len = cursor = strlen(text); /* length of longest common prefix */
81 + for (item = matches; item && item->text; item = item->right) {
82 + cursor = 0;
83 + while (cursor < len && text[cursor] == item->text[cursor])
84 + cursor++;
85 + len = cursor;
86 + }
87 + memset(text + len, '\0', strlen(text) - len);
88 break;
89 }
90 drawmenu();
91 --
92 2.16.2
93