From 43eee8da713a7c7c3788238a6a5f301ae4672a79 Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Tue, 7 Aug 2018 22:40:05 -0400 Subject: Implement cycling tab complete Not properly hooked up to the UI yet. --- tab.c | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) (limited to 'tab.c') diff --git a/tab.c b/tab.c index 56fe649..45670ad 100644 --- a/tab.c +++ b/tab.c @@ -40,12 +40,16 @@ static void remove(struct Entry *entry) { if (head == entry) head = entry->next; } +static void touch(struct Entry *entry) { + if (head == entry) return; + remove(entry); + prepend(entry); +} + void tabTouch(const char *word) { for (struct Entry *entry = head; entry; entry = entry->next) { if (strcmp(entry->word, word)) continue; - if (head == entry) return; - remove(entry); - prepend(entry); + touch(entry); return; } @@ -55,18 +59,43 @@ void tabTouch(const char *word) { prepend(entry); } +void tabReplace(const char *prev, const char *next) { + tabTouch(prev); + free(head->word); + head->word = strdup(next); +} + +static struct Entry *match; + void tabRemove(const char *word) { for (struct Entry *entry = head; entry; entry = entry->next) { if (strcmp(entry->word, word)) continue; remove(entry); + if (match == entry) match = entry->next; free(entry->word); free(entry); return; } } -void tabReplace(const char *prev, const char *next) { - tabTouch(prev); - free(head->word); - head->word = strdup(next); +const char *tabNext(const char *prefix) { + size_t len = strlen(prefix); + struct Entry *start = (match ? match->next : head); + for (struct Entry *entry = start; entry; entry = entry->next) { + if (strncasecmp(entry->word, prefix, len)) continue; + match = entry; + return entry->word; + } + if (!match) return NULL; + match = NULL; + return tabNext(prefix); +} + +void tabAccept(void) { + if (match) touch(match); + match = NULL; +} + +void tabReject(void) { + match = NULL; } -- cgit 1.4.1 de06d9f2b7c&showmsg=1&follow=1'>root/txt (unfollow)
Commit message (Collapse)Author
2019-04-07Add AmatkaJune McEnroe
2019-04-03Add Space OperaJune McEnroe
2019-03-22Add An Unkindness of GhostsJune McEnroe
2019-03-14Highlight line continuations in line commentsJune McEnroe
2019-03-14Add The Long Way to a Small Angry PlanetJune McEnroe
2019-03-10Add Bleachers Tiny Desk ConcertJune McEnroe
2019-02-28Add Station ElevenJune McEnroe
2019-02-27Use getsubopt(3) to parse -o options in hiJune McEnroe
2019-02-27Add type and ulimit shell keywordsJune McEnroe
2019-02-27Fix make target pattern whitespace in hiJune McEnroe
2019-02-27Delete extraneous <pre> in html.shJune McEnroe
2019-02-24Use setopt in upJune McEnroe
2019-02-24Add setoptJune McEnroe
2019-02-20Match make targets as TagJune McEnroe
2019-02-20Use $PWD in html.sh to pass absolute path to manJune McEnroe
2019-02-20Factor out html.sh and produce html for all sourcesJune McEnroe
Except for gfx-cocoa because I don't have an Objective-C highlighter. Also hypothetically the .h rule could match up headers with .3 manual pages if I cared to write them.
2019-02-20Add Dirk Gently's Holistic Detective AgencyJune McEnroe
2019-02-20Move /opt/pkg after /usr in PATHJune McEnroe
Installing mandoc from pkgsrc also installs a man executable which is horribly broken. Keep using the system man.
2019-02-20Set man_hard_wrap in nvimJune McEnroe
Vendoring man.vim until <https://github.com/neovim/neovim/pull/9633> is merged and appears in a release.
2019-02-18Use hi -o anchor in upJune McEnroe
2019-02-18Don't match nested parentheses in Tag for CJune McEnroe
Fixes mistaken highlight of: pngWrite(file, (uint8_t []) { 0, 0, 0 }, 3);
2019-02-18Match whitespace between * [] {}June McEnroe
2019-02-18Fix function-like #define regexJune McEnroe
A define like #define FOO (1) is not function-like.
2019-02-18Match Tag in RustJune McEnroe
2019-02-18Match sh functions as TagJune McEnroe
2019-02-18Match Sh and Ss as Tag in mdocJune McEnroe
2019-02-18Match statics and typedefs as TagJune McEnroe
2019-02-18Clean up htmlHeaderJune McEnroe
2019-02-18Remove hi line numberingJune McEnroe
Tags are much better for referring to specific parts of a file and line numbering is better done by a post-processing tool such as cat -n or producing a two-column HTML <table>.
2019-02-18Add Tag class to hiJune McEnroe
2019-02-17Generate HTML with hi -n -f html -o anchorJune McEnroe
Running hi twice to insert stuff between the head and the content is a bit of a hack but oh well.
2019-02-17Add hi -f html -o anchor for line number linksJune McEnroe
2019-02-17Simplify temp trap in upJune McEnroe
2019-02-17Add line numbers to hiJune McEnroe
Renames previous -n option to -m to stay consistent with cat -n. Prefixing lines with line numbers affects where the first tab indent ends up relative to the text above it. Not sure if it's worth fixing somehow.
2019-02-17Always split spans after newlinesJune McEnroe
Simplifies ANSI and IRC output code, and prepares for line numbered output.
2019-02-15Color format specifiers light cyan in vimJune McEnroe
2019-02-15Highlight Interp as yellowJune McEnroe
2019-02-15Highlight strings in sh command substitutionsJune McEnroe
2019-02-15Add nmap gpJune McEnroe
2019-02-14Avoid newline when copying URL to pasteboardJune McEnroe
2019-02-13Add forgotten "sixth" book of H2G2June McEnroe