diff options
| author | ckelsel <ckelsel@hotmail.com> | 2017-08-21 09:19:08 +0800 | 
|---|---|---|
| committer | ckelsel <ckelsel@hotmail.com> | 2017-08-21 09:19:08 +0800 | 
| commit | 0b6fa3a553da3b83419c48fcbb6fb3ec413598e0 (patch) | |
| tree | 63cda34cb93df36f64be4beea934ee34d850104c /src/nvim/ops.c | |
| parent | 673fc748237345914e0ad584bc4cba997c96a37e (diff) | |
| parent | 8d1ccb606d3806dcf9c4bcfdb0446d8139c0e765 (diff) | |
| download | rneovim-0b6fa3a553da3b83419c48fcbb6fb3ec413598e0.tar.gz rneovim-0b6fa3a553da3b83419c48fcbb6fb3ec413598e0.tar.bz2 rneovim-0b6fa3a553da3b83419c48fcbb6fb3ec413598e0.zip | |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/nvim/ops.c')
| -rw-r--r-- | src/nvim/ops.c | 72 | 
1 files changed, 44 insertions, 28 deletions
| diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 5c6f4d0d07..6c873a96c0 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -58,8 +58,8 @@ static yankreg_T *y_previous = NULL; /* ptr to last written yankreg */  static bool clipboard_didwarn_unnamed = false;  // for behavior between start_batch_changes() and end_batch_changes()) -static bool clipboard_delay_update = false;  // delay clipboard update  static int batch_change_count = 0;           // inside a script +static bool clipboard_delay_update = false;  // delay clipboard update  static bool clipboard_needs_update = false;  // clipboard was updated  /* @@ -5524,7 +5524,7 @@ int get_default_register_name(void)  }  /// Determine if register `*name` should be used as a clipboard. -/// In an unnammed operation, `*name` is `NUL` and will be adjusted to `'*'/'+'` if +/// In an unnamed operation, `*name` is `NUL` and will be adjusted to */+ if  /// `clipboard=unnamed[plus]` is set.  ///  /// @param name The name of register, or `NUL` if unnamed. @@ -5535,33 +5535,46 @@ int get_default_register_name(void)  /// if the register isn't a clipboard or provider isn't available.  static yankreg_T *adjust_clipboard_name(int *name, bool quiet, bool writing)  { -  if (*name == '*' || *name == '+') { -    if(!eval_has_provider("clipboard")) { -      if (!quiet) { -        EMSG("clipboard: No provider. Try \":CheckHealth\" or " -             "\":h clipboard\"."); -      } -      return NULL; -    } -    return &y_regs[*name == '*' ? STAR_REGISTER : PLUS_REGISTER]; -  } else if ((*name == NUL) && (cb_flags & CB_UNNAMEDMASK)) { -    if(!eval_has_provider("clipboard")) { -      if (!quiet && !clipboard_didwarn_unnamed) { -        msg((char_u *)"clipboard: No provider. Try \":CheckHealth\" or " -            "\":h clipboard\"."); -        clipboard_didwarn_unnamed = true; -      } -      return NULL; +#define MSG_NO_CLIP "clipboard: No provider. " \ +  "Try \":CheckHealth\" or \":h clipboard\"." + +  yankreg_T *target = NULL; +  bool explicit_cb_reg = (*name == '*' || *name == '+'); +  bool implicit_cb_reg = (*name == NUL) && (cb_flags & CB_UNNAMEDMASK); +  int save_redir_off = redir_off; +  if (!explicit_cb_reg && !implicit_cb_reg) { +    goto end; +  } + +  if (!eval_has_provider("clipboard")) { +    if (batch_change_count == 1 && explicit_cb_reg && !quiet) { +      redir_off = true;   // Avoid recursion from :redir + emsg(). +      // Do NOT error (emsg()) here--if it interrupts :redir we get into +      // a weird state, stuck in "redirect mode". +      msg((char_u *)MSG_NO_CLIP); +    } else if (batch_change_count == 1 && implicit_cb_reg +               && !quiet && !clipboard_didwarn_unnamed) { +      redir_off = true;  // Avoid recursion from :redir + emsg(). +      msg((char_u *)MSG_NO_CLIP); +      clipboard_didwarn_unnamed = true;      } +    // ... else, be silent (don't flood during :while, :redir, etc.). +    goto end; +  } + +  if (explicit_cb_reg) { +    target = &y_regs[*name == '*' ? STAR_REGISTER : PLUS_REGISTER]; +    goto end; +  } else {  // unnamed register: "implicit" clipboard      if (writing && clipboard_delay_update) { +      // For "set" (copy), defer the clipboard call.        clipboard_needs_update = true; -      return NULL; +      goto end;      } else if (!writing && clipboard_needs_update) { -      // use the internal value -      return NULL; +      // For "get" (paste), use the internal value. +      goto end;      } -    yankreg_T *target;      if (cb_flags & CB_UNNAMEDPLUS) {        *name = (cb_flags & CB_UNNAMED && writing) ? '"': '+';        target = &y_regs[PLUS_REGISTER]; @@ -5569,10 +5582,12 @@ static yankreg_T *adjust_clipboard_name(int *name, bool quiet, bool writing)        *name = '*';        target = &y_regs[STAR_REGISTER];      } -    return target; // unnamed register +    goto end;    } -  // don't do anything for other register names -  return NULL; + +end: +  redir_off = save_redir_off; +  return target;  }  static bool get_clipboard(int name, yankreg_T **target, bool quiet) @@ -5740,7 +5755,7 @@ static void set_clipboard(int name, yankreg_T *reg)    (void)eval_call_provider("clipboard", "set", args);  } -/// Avoid clipboard (slow) during batch operations (i.e., a script). +/// Avoid slow things (clipboard) during batch operations (while/for-loops).  void start_batch_changes(void)  {    if (++batch_change_count > 1) { @@ -5750,7 +5765,7 @@ void start_batch_changes(void)    clipboard_needs_update = false;  } -/// Update the clipboard after batch changes finished. +/// Counterpart to start_batch_changes().  void end_batch_changes(void)  {    if (--batch_change_count > 0) { @@ -5759,6 +5774,7 @@ void end_batch_changes(void)    }    clipboard_delay_update = false;    if (clipboard_needs_update) { +    // unnamed ("implicit" clipboard)      set_clipboard(NUL, y_previous);      clipboard_needs_update = false;    } | 
