aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShougo <Shougo.Matsu@gmail.com>2022-05-09 13:52:31 +0900
committerGitHub <noreply@github.com>2022-05-09 12:52:31 +0800
commitdbdd58e548fcf55848359b696275fd848756db7b (patch)
tree145c279909c7175c6a46ed76591dbebab124a3ba /src
parentf6be28c61a66df1bd88e5aac3d2c20792c541e18 (diff)
downloadrneovim-dbdd58e548fcf55848359b696275fd848756db7b.tar.gz
rneovim-dbdd58e548fcf55848359b696275fd848756db7b.tar.bz2
rneovim-dbdd58e548fcf55848359b696275fd848756db7b.zip
feat: cmdline funcs (#18284)
vim-patch:8.2.4903: cannot get the current cmdline completion type and position Problem: Cannot get the current cmdline completion type and position. Solution: Add getcmdcompltype() and getcmdscreenpos(). (Shougo Matsushita, closes vim/vim#10344) https://github.com/vim/vim/commit/79d599b8772022af1d657f368c2fc97aa342c0da vim-patch:8.2.4910: imperfect coding Problem: Imperfect coding. Solution: Make code nicer. https://github.com/vim/vim/commit/9ff7d717aa3176de5c61de340deb93f41c7780fc
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.lua2
-rw-r--r--src/nvim/eval/funcs.c13
-rw-r--r--src/nvim/ex_getln.c32
-rw-r--r--src/nvim/testdir/test_cmdline.vim12
4 files changed, 58 insertions, 1 deletions
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua
index 698cffe2fa..d7a17d6e15 100644
--- a/src/nvim/eval.lua
+++ b/src/nvim/eval.lua
@@ -152,8 +152,10 @@ return {
getcharpos={args=1, base=1},
getcharsearch={},
getcharstr={args={0, 1}},
+ getcmdcompltype={},
getcmdline={},
getcmdpos={},
+ getcmdscreenpos={},
getcmdtype={},
getcmdwintype={},
getcompletion={args={2, 3}, base=1},
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c
index be43c3010a..7946ed75e1 100644
--- a/src/nvim/eval/funcs.c
+++ b/src/nvim/eval/funcs.c
@@ -3175,6 +3175,13 @@ static void f_getcharsearch(typval_T *argvars, typval_T *rettv, FunPtr fptr)
tv_dict_add_nr(dict, S_LEN("until"), last_csearch_until());
}
+/// "getcmdcompltype()" function
+static void f_getcmdcompltype(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ rettv->v_type = VAR_STRING;
+ rettv->vval.v_string = (char *)get_cmdline_completion();
+}
+
/// "getcmdline()" function
static void f_getcmdline(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
@@ -3188,6 +3195,12 @@ static void f_getcmdpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
rettv->vval.v_number = get_cmdline_pos() + 1;
}
+/// "getcmdscreenpos()" function
+static void f_getcmdscreenpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ rettv->vval.v_number = get_cmdline_screen_pos() + 1;
+}
+
/// "getcmdtype()" function
static void f_getcmdtype(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
index d4cea15d20..771e84651f 100644
--- a/src/nvim/ex_getln.c
+++ b/src/nvim/ex_getln.c
@@ -4683,7 +4683,7 @@ char_u *addstar(char_u *fname, size_t len, int context)
* EXPAND_ENV_VARS Complete environment variable names
* EXPAND_USER Complete user names
*/
-static void set_expand_context(expand_T *xp)
+void set_expand_context(expand_T *xp)
{
// only expansion for ':', '>' and '=' command-lines
if (ccline.cmdfirstc != ':'
@@ -5949,6 +5949,25 @@ static struct cmdline_info *get_ccline_ptr(void)
}
}
+/// Get the current command-line completion type.
+char_u *get_cmdline_completion(void)
+{
+ if (cmdline_star > 0) {
+ return NULL;
+ }
+ struct cmdline_info *p = get_ccline_ptr();
+
+ if (p != NULL && p->xpc != NULL) {
+ set_expand_context(p->xpc);
+ char_u *cmd_compl = get_user_cmd_complete(p->xpc, p->xpc->xp_context);
+ if (cmd_compl != NULL) {
+ return vim_strsave(cmd_compl);
+ }
+ }
+
+ return NULL;
+}
+
/*
* Get the current command line in allocated memory.
* Only works when the command line is being edited.
@@ -5983,6 +6002,17 @@ int get_cmdline_pos(void)
return p->cmdpos;
}
+/// Get the command line cursor screen position.
+int get_cmdline_screen_pos(void)
+{
+ struct cmdline_info *p = get_ccline_ptr();
+
+ if (p == NULL) {
+ return -1;
+ }
+ return p->cmdspos;
+}
+
/*
* Set the command line byte position to "pos". Zero is the first position.
* Only works when the command line is being edited.
diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim
index 5c2f6f8d0b..759caac878 100644
--- a/src/nvim/testdir/test_cmdline.vim
+++ b/src/nvim/testdir/test_cmdline.vim
@@ -1212,4 +1212,16 @@ func Test_recalling_cmdline()
cunmap <Plug>(save-cmdline)
endfunc
+func Check_completion()
+ call assert_equal('let a', getcmdline())
+ call assert_equal(6, getcmdpos())
+ call assert_equal(7, getcmdscreenpos())
+ call assert_equal('var', getcmdcompltype())
+ return ''
+endfunc
+
+func Test_screenpos_and_completion()
+ call feedkeys(":let a\<C-R>=Check_completion()\<CR>\<Esc>", "xt")
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab