From e4fe68098144ea52eb9d4b35c381988dbf387be2 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 10 Jun 2021 07:06:41 -0700 Subject: listener: complete macros and operators after quote. This fixes the problem that (doc 'wh[Tab] will not complete the macro name while. * parser.c (find_matching_syms): Recognize the kind context symbol 'Q', under which a which a macro or operator are eligible for completion. (provide_completions): Calculate kind as 'Q' if the previous character is a ' quote or ^ backquote. --- parser.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'parser.c') diff --git a/parser.c b/parser.c index ad7694e6..a6aaf096 100644 --- a/parser.c +++ b/parser.c @@ -972,6 +972,10 @@ static void find_matching_syms(lino_completions_t *cpl, case 'M': case 'S': break; + case 'Q': + if (mboundp(sym) || special_operator_p(sym)) + break; + /* fallthrough */ default: if (find_struct_type(sym) || ffi_type_p(sym)) break; @@ -1072,17 +1076,18 @@ static void provide_completions(const wchar_t *data, val line_pfx = string(line_pfxs); char prev = (end > data) ? end[-1] : 0; char pprev = (end > data + 1) ? end[-2] : 0; - int quote = (pprev == '^' || pprev == '\'' || pprev == '#'); + int quote = (prev == '^' || prev == '\''); + int pquote = (pprev == '^' || pprev == '\'' || pprev == '#'); int ppar = (pprev == '('); int dwim = (prev == '['); int par = (prev == '('); int slot = (prev == '.'); int meth = (pprev == '.') && (dwim || par); - char kind = (slot - ? 'S' - : (meth - ? 'M' - : (!pprev || (!quote && !ppar) || dwim) ? prev : 0)); + char kind = if3(slot, 'S', + if3(meth, 'M', + if3(quote, 'Q', + if3(!pprev || (!pquote && !ppar) || dwim, + prev, 0)))); find_matching_syms(cpl, or2(package, cur_package), sym_pfx, line_pfx, kind, if2(package, null(keyword))); -- cgit v1.2.3