diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-06-10 07:06:41 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-06-10 07:06:41 -0700 |
commit | e4fe68098144ea52eb9d4b35c381988dbf387be2 (patch) | |
tree | eb3eb4d6cf4e3f2d5d53f90379a86a1f6b83c647 | |
parent | c56d041f3d598c92374b50a74add435efddc8ee8 (diff) | |
download | txr-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.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -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))); |