diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/api/ui_events.in.h | 7 | ||||
| -rw-r--r-- | src/nvim/eval.c | 13 | ||||
| -rw-r--r-- | src/nvim/ex_getln.c | 28 | 
3 files changed, 42 insertions, 6 deletions
| diff --git a/src/nvim/api/ui_events.in.h b/src/nvim/api/ui_events.in.h index bb1084c838..764078c6bd 100644 --- a/src/nvim/api/ui_events.in.h +++ b/src/nvim/api/ui_events.in.h @@ -67,6 +67,7 @@ void popupmenu_select(Integer selected)    FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;  void tabline_update(Tabpage current, Array tabs)    FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; +  void cmdline_show(Array content, Integer pos, String firstc, String prompt,                    Integer indent, Integer level)    FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; @@ -76,9 +77,11 @@ void cmdline_char(String c, Integer shift, Integer level)    FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;  void cmdline_hide(Integer level)    FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; -void cmdline_function_show(void) +void cmdline_block_show(Array lines) +  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; +void cmdline_block_append(Array lines)    FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY; -void cmdline_function_hide(void) +void cmdline_block_hide(void)    FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;  #endif  // NVIM_API_UI_EVENTS_IN_H diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 5f655cdc7b..50044718b6 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -19643,6 +19643,7 @@ void ex_function(exarg_T *eap)    int todo;    hashitem_T  *hi;    int sourcing_lnum_off; +  bool show_block = false;    /*     * ":function" without argument: list functions. @@ -19816,8 +19817,9 @@ void ex_function(exarg_T *eap)      goto errret_2;    } -  if (ui_is_external(kUICmdline)) { -    ui_call_cmdline_function_show(); +  if (KeyTyped && ui_is_external(kUICmdline)) { +    show_block = true; +    ui_ext_cmdline_block_append(0, (const char *)eap->cmd);    }    // find extra arguments "range", "dict", "abort" and "closure" @@ -19908,6 +19910,9 @@ void ex_function(exarg_T *eap)        EMSG(_("E126: Missing :endfunction"));        goto erret;      } +    if (show_block) { +      ui_ext_cmdline_block_append(indent, (const char *)theline); +    }      /* Detect line continuation: sourcing_lnum increased more than one. */      if (sourcing_lnum > sourcing_lnum_off + 1) @@ -20200,8 +20205,8 @@ ret_free:    xfree(name);    did_emsg |= saved_did_emsg;    need_wait_return |= saved_wait_return; -  if (ui_is_external(kUICmdline)) { -    ui_call_cmdline_function_hide(); +  if (show_block) { +    ui_ext_cmdline_block_leave();    }  } diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index 0e620e59d8..50cccc8d10 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -186,6 +186,8 @@ static int cmd_showtail;                /* Only show path tail in lists ? */  static int new_cmdpos;          /* position set by set_cmdline_pos() */ +static Array cmdline_block;  ///< currently displayed block of context +  /*   * Type used by call_user_expand_func   */ @@ -2759,6 +2761,32 @@ void ui_ext_cmdline_show(void)                         ccline.level);  } +void ui_ext_cmdline_block_append(int indent, const char *line) +{ +  char *buf = xmallocz(indent + strlen(line)); +  memset(buf, ' ', indent); +  memcpy(buf+indent, line, strlen(line)); + +  Array item = ARRAY_DICT_INIT; +  ADD(item, DICTIONARY_OBJ((Dictionary)ARRAY_DICT_INIT)); +  ADD(item, STRING_OBJ(cstr_as_string(buf))); +  Array content = ARRAY_DICT_INIT; +  ADD(content, ARRAY_OBJ(item)); +  ADD(cmdline_block, ARRAY_OBJ(content)); +  if (cmdline_block.size > 1) { +    ui_call_cmdline_block_append(copy_array(content)); +  } else { +    ui_call_cmdline_block_show(copy_array(cmdline_block)); +  } +} + +void ui_ext_cmdline_block_leave(void) +{ +  api_free_array(cmdline_block); +  ui_call_cmdline_block_hide(); +} + +  /*   * Put a character on the command line.  Shifts the following text to the   * right when "shift" is TRUE.  Used for CTRL-V, CTRL-K, etc. | 
