summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-06-10 07:06:41 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-06-10 07:06:41 -0700
commite4fe68098144ea52eb9d4b35c381988dbf387be2 (patch)
treeeb3eb4d6cf4e3f2d5d53f90379a86a1f6b83c647
parentc56d041f3d598c92374b50a74add435efddc8ee8 (diff)
downloadtxr-e4fe68098144ea52eb9d4b35c381988dbf387be2.tar.gz
txr-e4fe68098144ea52eb9d4b35c381988dbf387be2.tar.bz2
txr-e4fe68098144ea52eb9d4b35c381988dbf387be2.zip
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.
-rw-r--r--parser.c17
1 files changed, 11 insertions, 6 deletions
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)));