vim-patch:9.1.0495: Matched text isn't highlighted in cmdline pum

Problem:  Matched text isn't highlighted in cmdline pum.
Solution: Use cmdline completion pattern in cmdline mode.
          (zeertzjq)

closes: vim/vim#15029

d8c9340fc6

Cherry-pick syntax.txt change from runtime update.
This commit is contained in:
zeertzjq
2024-06-18 05:49:33 +08:00
parent b60030b7bf
commit c429c5f86f
5 changed files with 116 additions and 6 deletions

View File

@@ -402,6 +402,20 @@ void cmdline_pum_cleanup(CmdlineInfo *cclp)
wildmenu_cleanup(cclp);
}
/// Returns the current cmdline completion pattern.
char *cmdline_compl_pattern(void)
{
expand_T *xp = get_cmdline_info()->xpc;
return xp == NULL ? NULL : xp->xp_orig;
}
/// Returns true if fuzzy cmdline completion is active, false otherwise.
bool cmdline_compl_is_fuzzy(void)
{
expand_T *xp = get_cmdline_info()->xpc;
return xp != NULL && cmdline_fuzzy_completion_supported(xp);
}
/// Return the number of characters that should be skipped in the wildmenu
/// These are backslashes used for escaping. Do show backslashes in help tags.
static int skip_wildmenu_char(expand_T *xp, char *s)

View File

@@ -17,6 +17,7 @@
#include "nvim/buffer_updates.h"
#include "nvim/change.h"
#include "nvim/charset.h"
#include "nvim/cmdexpand.h"
#include "nvim/drawscreen.h"
#include "nvim/edit.h"
#include "nvim/errors.h"
@@ -441,17 +442,21 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed, i
/// Returns attributes for every cell, or NULL if all attributes are the same.
static int *pum_compute_text_attrs(char *text, hlf_T hlf)
{
char *leader = ins_compl_leader();
if (leader == NULL || *leader == NUL || (hlf != HLF_PSI && hlf != HLF_PNI)
if ((hlf != HLF_PSI && hlf != HLF_PNI)
|| (win_hl_attr(curwin, HLF_PMSI) == win_hl_attr(curwin, HLF_PSI)
&& win_hl_attr(curwin, HLF_PMNI) == win_hl_attr(curwin, HLF_PNI))) {
return NULL;
}
char *leader = State == MODE_CMDLINE ? cmdline_compl_pattern() : ins_compl_leader();
if (leader == NULL || *leader == NUL) {
return NULL;
}
int *attrs = xmalloc(sizeof(int) * (size_t)vim_strsize(text));
bool in_fuzzy = State == MODE_CMDLINE ? cmdline_compl_is_fuzzy()
: (get_cot_flags() & COT_FUZZY) != 0;
size_t leader_len = strlen(leader);
const bool in_fuzzy = (get_cot_flags() & COT_FUZZY) != 0;
garray_T *ga = NULL;
bool matched_start = false;