diff options
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | runtime/autoload/provider.vim | 18 | ||||
| -rw-r--r-- | runtime/autoload/provider/clipboard.vim | 15 | ||||
| -rw-r--r-- | runtime/autoload/provider/pythonx.vim | 16 | ||||
| -rw-r--r-- | runtime/doc/digraph.txt | 3 | ||||
| -rw-r--r-- | src/nvim/digraph.c | 1 | ||||
| -rw-r--r-- | src/nvim/ex_docmd.c | 2 | ||||
| -rw-r--r-- | src/nvim/ex_eval.c | 19 | ||||
| -rw-r--r-- | src/nvim/ex_eval.h | 27 | ||||
| -rw-r--r-- | src/nvim/version.c | 4 | 
10 files changed, 60 insertions, 48 deletions
diff --git a/.gitignore b/.gitignore index fb506305b6..3a8994a5f6 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,9 @@ tags  /src/nvim/po/vim.pot  /src/nvim/po/*.ck +# generated by tests with $NVIM_LOG_FILE set. +/.nvimlog +  # Files generated by scripts/vim-patch.sh  /.vim-src/ diff --git a/runtime/autoload/provider.vim b/runtime/autoload/provider.vim new file mode 100644 index 0000000000..a4d5241b57 --- /dev/null +++ b/runtime/autoload/provider.vim @@ -0,0 +1,18 @@ +" Common functionality for providers + +let s:stderr = {} + +function! provider#stderr_collector(chan_id, data, event) dict +   let stderr = get(s:stderr, a:chan_id, ['']) +   let stderr[-1] .= a:data[0] +   call extend(stderr, a:data[1:]) +   let s:stderr[a:chan_id] = stderr +endfunction + +function! provider#clear_stderr(chan_id) +   silent! call delete(s:stderr, a:chan_id) +endfunction + +function! provider#get_stderr(chan_id) +   return get(s:stderr, a:chan_id, []) +endfunction diff --git a/runtime/autoload/provider/clipboard.vim b/runtime/autoload/provider/clipboard.vim index 86006497d9..8eb694e9fa 100644 --- a/runtime/autoload/provider/clipboard.vim +++ b/runtime/autoload/provider/clipboard.vim @@ -6,7 +6,7 @@ let s:paste = {}  " When caching is enabled, store the jobid of the xclip/xsel process keeping  " ownership of the selection, so we know how long the cache is valid. -let s:selection = { 'owner': 0, 'data': [] } +let s:selection = { 'owner': 0, 'data': [], 'on_stderr': function('provider#stderr_collector') }  function! s:selection.on_exit(jobid, data, event) abort    " At this point this nvim instance might already have launched @@ -14,12 +14,13 @@ function! s:selection.on_exit(jobid, data, event) abort    if self.owner == a:jobid      let self.owner = 0    endif -endfunction - -function! s:selection.on_stderr(jobid, data, event) abort -  echohl WarningMsg -  echomsg 'clipboard: error invoking '.get(self.argv, 0, '?').': '.join(a:data) -  echohl None +  if a:data != 0 +    let stderr = provider#get_stderr(a:jobid) +    echohl WarningMsg +    echomsg 'clipboard: error invoking '.get(self.argv, 0, '?').': '.join(stderr) +    echohl None +  endif +  call provider#clear_stderr(a:jobid)  endfunction  let s:selections = { '*': s:selection, '+': copy(s:selection)} diff --git a/runtime/autoload/provider/pythonx.vim b/runtime/autoload/provider/pythonx.vim index 2f64c22c71..7285ed43ea 100644 --- a/runtime/autoload/provider/pythonx.vim +++ b/runtime/autoload/provider/pythonx.vim @@ -5,17 +5,7 @@ endif  let s:loaded_pythonx_provider = 1 -let s:stderr = {} -let s:job_opts = {'rpc': v:true} - -" TODO(bfredl): this logic is common and should be builtin -function! s:job_opts.on_stderr(chan_id, data, event) -  let stderr = get(s:stderr, a:chan_id, ['']) -  let last = remove(stderr, -1) -  let a:data[0] = last.a:data[0] -  call extend(stderr, a:data) -  let s:stderr[a:chan_id] = stderr -endfunction +let s:job_opts = {'rpc': v:true, 'on_stderr': function('provider#stderr_collector')}  function! provider#pythonx#Require(host) abort    let ver = (a:host.orig_name ==# 'python') ? 2 : 3 @@ -38,9 +28,11 @@ function! provider#pythonx#Require(host) abort    catch      echomsg v:throwpoint      echomsg v:exception -    for row in get(s:stderr, channel_id, []) +    for row in provider#get_stderr(channel_id)        echomsg row      endfor +  finally +    call provider#clear_stderr(channel_id)    endtry    throw remote#host#LoadErrorForHost(a:host.orig_name,          \ '$NVIM_PYTHON_LOG_FILE') diff --git a/runtime/doc/digraph.txt b/runtime/doc/digraph.txt index 89351c5b4f..43f8ccab06 100644 --- a/runtime/doc/digraph.txt +++ b/runtime/doc/digraph.txt @@ -143,7 +143,7 @@ a standard meaning:  	Two			2	Hook  	Nine			9	Horn -	Equals			=	Cyrillic (= used as second char)  +	Equals			=	Cyrillic (= used as second char)  	Asterisk		*	Greek  	Percent sign		%	Greek/Cyrillic special  	Plus			+	smalls: Arabic, capitals: Hebrew @@ -922,6 +922,7 @@ char  digraph	hex	dec	official name ~  †	/-	2020	8224	DAGGER  ‡	/=	2021	8225	DOUBLE DAGGER  ‥	..	2025	8229	TWO DOT LEADER +…	,.	2026	8230	HORIZONTAL ELLIPSIS  ‰	%0	2030	8240	PER MILLE SIGN  ′	1'	2032	8242	PRIME  ″	2'	2033	8243	DOUBLE PRIME diff --git a/src/nvim/digraph.c b/src/nvim/digraph.c index 32e71f61f7..bfb1b94738 100644 --- a/src/nvim/digraph.c +++ b/src/nvim/digraph.c @@ -793,6 +793,7 @@ static digr_T digraphdefault[] =    { '/', '-', 0x2020 },    { '/', '=', 0x2021 },    { '.', '.', 0x2025 }, +  { ',', '.', 0x2026 },    { '%', '0', 0x2030 },    { '1', '\'', 0x2032 },    { '2', '\'', 0x2033 }, diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 99a0b86d2b..d7821fc636 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -844,8 +844,6 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline,          break;        case ET_INTERRUPT:          break; -      default: -        p = vim_strsave((char_u *)_(e_internal));        }        saved_sourcing_name = sourcing_name; diff --git a/src/nvim/ex_eval.c b/src/nvim/ex_eval.c index 5d664b94a8..c029df2f13 100644 --- a/src/nvim/ex_eval.c +++ b/src/nvim/ex_eval.c @@ -374,10 +374,9 @@ int do_intthrow(struct condstack *cstack)    return TRUE;  } -/* - * Get an exception message that is to be stored in current_exception->value. - */ -char_u *get_exception_string(void *value, int type, char_u *cmdname, int *should_free) +// Get an exception message that is to be stored in current_exception->value. +char_u *get_exception_string(void *value, except_type_T type, char_u *cmdname, +                             int *should_free)  {    char_u      *ret, *mesg;    char_u      *p, *val; @@ -435,13 +434,11 @@ char_u *get_exception_string(void *value, int type, char_u *cmdname, int *should  } -/* - * Throw a new exception.  Return FAIL when out of memory or it was tried to - * throw an illegal user exception.  "value" is the exception string for a - * user or interrupt exception, or points to a message list in case of an - * error exception. - */ -static int throw_exception(void *value, int type, char_u *cmdname) +// Throw a new exception.  Return FAIL when out of memory or it was tried to +// throw an illegal user exception.  "value" is the exception string for a +// user or interrupt exception, or points to a message list in case of an +// error exception. +static int throw_exception(void *value, except_type_T type, char_u *cmdname)  {    except_T    *excp;    int should_free; diff --git a/src/nvim/ex_eval.h b/src/nvim/ex_eval.h index f61e01d25b..d5f8737bf3 100644 --- a/src/nvim/ex_eval.h +++ b/src/nvim/ex_eval.h @@ -89,28 +89,29 @@ struct msglist {    struct msglist      *next;            /* next of several messages in a row */  }; +// The exception types. +typedef enum +{ +  ET_USER,       // exception caused by ":throw" command +  ET_ERROR,      // error exception +  ET_INTERRUPT   // interrupt exception triggered by Ctrl-C +} except_type_T; +  /*   * Structure describing an exception.   * (don't use "struct exception", it's used by the math library).   */  typedef struct vim_exception except_T;  struct vim_exception { -  int type;                             /* exception type */ -  char_u              *value;           /* exception value */ -  struct msglist      *messages;        /* message(s) causing error exception */ -  char_u              *throw_name;      /* name of the throw point */ -  linenr_T throw_lnum;                  /* line number of the throw point */ -  except_T            *caught;          /* next exception on the caught stack */ +  except_type_T type;                   // exception type +  char_u              *value;           // exception value +  struct msglist      *messages;        // message(s) causing error exception +  char_u              *throw_name;      // name of the throw point +  linenr_T throw_lnum;                  // line number of the throw point +  except_T            *caught;          // next exception on the caught stack  };  /* - * The exception types. - */ -#define ET_USER         0       /* exception caused by ":throw" command */ -#define ET_ERROR        1       /* error exception */ -#define ET_INTERRUPT    2       /* interrupt exception triggered by Ctrl-C */ - -/*   * Structure to save the error/interrupt/exception state between calls to   * enter_cleanup() and leave_cleanup().  Must be allocated as an automatic   * variable by the (common) caller of these functions. diff --git a/src/nvim/version.c b/src/nvim/version.c index 44348c4d98..d07a1c2d68 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -654,7 +654,7 @@ static const int included_patches[] = {    78,    // 77 NA    // 76 NA -  // 75, +  75,    // 74,    73,    // 72 NA @@ -667,7 +667,7 @@ static const int included_patches[] = {    // 65 NA    64,    // 63, -  // 62, +  62,    // 61 NA    60,    // 59 NA  | 
