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