aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/cmdexpand.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-01-14 17:23:24 +0800
committerGitHub <noreply@github.com>2023-01-14 17:23:24 +0800
commit22e3b155f4b34ab54aacda6c0c96c69780e2b587 (patch)
treef512a2300f63c4043e340ab53247f15c3ef46311 /src/nvim/cmdexpand.c
parente89c39d6f016a4140293755250e968e839009617 (diff)
downloadrneovim-22e3b155f4b34ab54aacda6c0c96c69780e2b587.tar.gz
rneovim-22e3b155f4b34ab54aacda6c0c96c69780e2b587.tar.bz2
rneovim-22e3b155f4b34ab54aacda6c0c96c69780e2b587.zip
vim-patch:partial:8.2.4339: CTRL-A does not work properly with the cmdline popup menu (#21791)
Problem: CTRL-A does not work properly with the cmdline popup menu. Solution: Fix issues with CTRL-A. Add more tests for the cmdline popup menu. Remove TermWait() before VeriryScreenDump(). Refactor the cmdline popup code. (Yegappan Lakshmanan, closes vim/vim#9735) https://github.com/vim/vim/commit/560dff49c0095111fc96b4b8dd7f4d269aba9473 Only port cmdexpand.c and test_cmdline.vim changes. Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Diffstat (limited to 'src/nvim/cmdexpand.c')
-rw-r--r--src/nvim/cmdexpand.c72
1 files changed, 45 insertions, 27 deletions
diff --git a/src/nvim/cmdexpand.c b/src/nvim/cmdexpand.c
index be2db2a2e5..589deb6feb 100644
--- a/src/nvim/cmdexpand.c
+++ b/src/nvim/cmdexpand.c
@@ -89,6 +89,10 @@ static int compl_match_arraysize;
static int compl_startcol;
static int compl_selected;
+#define SHOW_FILE_TEXT(m) (showtail \
+ ? showmatches_gettail(files_found[m], false) \
+ : files_found[m])
+
static int sort_func_compare(const void *s1, const void *s2)
{
char *p1 = *(char **)s1;
@@ -279,19 +283,54 @@ int nextwild(expand_T *xp, int type, int options, bool escape)
return OK;
}
+/// Create and display a cmdline completion popup menu with items from
+/// "files_found".
+static int cmdline_pum_create(CmdlineInfo *ccline, expand_T *xp, char **files_found, int num_files,
+ int showtail)
+{
+ assert(num_files >= 0);
+ // Add all the completion matches
+ compl_match_arraysize = num_files;
+ compl_match_array = xmalloc(sizeof(pumitem_T) * (size_t)compl_match_arraysize);
+ for (int i = 0; i < num_files; i++) {
+ compl_match_array[i] = (pumitem_T){
+ .pum_text = SHOW_FILE_TEXT(i),
+ .pum_info = NULL,
+ .pum_extra = NULL,
+ .pum_kind = NULL,
+ };
+ }
+
+ // Compute the popup menu starting column
+ char *endpos = showtail ? showmatches_gettail(xp->xp_pattern, true) : xp->xp_pattern;
+ if (ui_has(kUICmdline)) {
+ compl_startcol = (int)(endpos - ccline->cmdbuff);
+ } else {
+ compl_startcol = cmd_screencol((int)(endpos - ccline->cmdbuff));
+ }
+
+ // no default selection
+ compl_selected = -1;
+
+ cmdline_pum_display(true);
+
+ return EXPAND_OK;
+}
+
void cmdline_pum_display(bool changed_array)
{
pum_display(compl_match_array, compl_match_arraysize, compl_selected,
changed_array, compl_startcol);
}
+/// Returns true if the cmdline completion popup menu is being displayed.
bool cmdline_pum_active(void)
{
// compl_match_array != NULL should already imply pum_visible() in Nvim.
return compl_match_array != NULL;
}
-/// Remove the cmdline completion popup menu
+/// Remove the cmdline completion popup menu (if present), free the list of items.
void cmdline_pum_remove(void)
{
pum_undisplay(true);
@@ -826,9 +865,6 @@ void ExpandCleanup(expand_T *xp)
int showmatches(expand_T *xp, int wildmenu)
{
CmdlineInfo *const ccline = get_cmdline_info();
-#define L_SHOWFILE(m) (showtail \
- ? showmatches_gettail(files_found[m], false) \
- : files_found[m])
int num_files;
char **files_found;
int i, j, k;
@@ -860,26 +896,8 @@ int showmatches(expand_T *xp, int wildmenu)
|| ui_has(kUIWildmenu);
if (compl_use_pum) {
- assert(num_files >= 0);
- compl_match_arraysize = num_files;
- compl_match_array = xmalloc(sizeof(pumitem_T) * (size_t)compl_match_arraysize);
- for (i = 0; i < num_files; i++) {
- compl_match_array[i] = (pumitem_T){
- .pum_text = L_SHOWFILE(i),
- .pum_info = NULL,
- .pum_extra = NULL,
- .pum_kind = NULL,
- };
- }
- char *endpos = showtail ? showmatches_gettail(xp->xp_pattern, true) : xp->xp_pattern;
- if (ui_has(kUICmdline)) {
- compl_startcol = (int)(endpos - ccline->cmdbuff);
- } else {
- compl_startcol = cmd_screencol((int)(endpos - ccline->cmdbuff));
- }
- compl_selected = -1;
- cmdline_pum_display(true);
- return EXPAND_OK;
+ // cmdline completion popup menu (with wildoptions=pum)
+ return cmdline_pum_create(ccline, xp, files_found, num_files, showtail);
}
if (!wildmenu) {
@@ -906,7 +924,7 @@ int showmatches(expand_T *xp, int wildmenu)
home_replace(NULL, files_found[i], NameBuff, MAXPATHL, true);
j = vim_strsize(NameBuff);
} else {
- j = vim_strsize(L_SHOWFILE(i));
+ j = vim_strsize(SHOW_FILE_TEXT(i));
}
if (j > maxlen) {
maxlen = j;
@@ -971,14 +989,14 @@ int showmatches(expand_T *xp, int wildmenu)
j = os_isdir(files_found[k]);
}
if (showtail) {
- p = L_SHOWFILE(k);
+ p = SHOW_FILE_TEXT(k);
} else {
home_replace(NULL, files_found[k], NameBuff, MAXPATHL, true);
p = NameBuff;
}
} else {
j = false;
- p = L_SHOWFILE(k);
+ p = SHOW_FILE_TEXT(k);
}
lastlen = msg_outtrans_attr(p, j ? attr : 0);
}