]> granicus.if.org Git - vim/commitdiff
patch 8.2.2057: getting the selection may trigger TextYankPost autocmd v8.2.2057
authorBram Moolenaar <Bram@vim.org>
Thu, 26 Nov 2020 19:34:00 +0000 (20:34 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 26 Nov 2020 19:34:00 +0000 (20:34 +0100)
Problem:    Getting the selection may trigger TextYankPost autocmd.
Solution:   Only trigger the autocommand when yanking in Vim, not for getting
            the selection. (closes #7367)

src/clipboard.c
src/normal.c
src/register.c
src/testdir/test_autocmd.vim
src/version.c

index 5db13a0d216c5579d52233033822366efae644f4..3084ce187193fc599d507b63bc9f5671f3fb7330 100644 (file)
@@ -2025,6 +2025,9 @@ clip_get_selection(Clipboard_T *cbd)
                    && get_y_register(STAR_REGISTER)->y_array != NULL))
            return;
 
+       // Avoid triggering autocmds such as TextYankPost.
+       block_autocmds();
+
        // Get the text between clip_star.start & clip_star.end
        old_y_previous = get_y_previous();
        old_y_current = get_y_current();
@@ -2054,6 +2057,8 @@ clip_get_selection(Clipboard_T *cbd)
        curbuf->b_op_end = old_op_end;
        VIsual = old_visual;
        VIsual_mode = old_visual_mode;
+
+       unblock_autocmds();
     }
     else if (!is_clipboard_needs_update())
     {
index 87f1956fa9ed5e3e8612ae4339e3684ae99c5689..d90326feb27572842a614028308ae9bee1e6d6f3 100644 (file)
@@ -1325,6 +1325,26 @@ check_visual_highlight(void)
     }
 }
 
+#if defined(FEAT_CLIPBOARD) && defined(FEAT_EVAL)
+/*
+ * Call yank_do_autocmd() for "regname".
+ */
+    static void
+call_yank_do_autocmd(int regname)
+{
+    oparg_T    oa;
+    yankreg_T  *reg;
+
+    clear_oparg(&oa);
+    oa.regname = regname;
+    oa.op_type = OP_YANK;
+    oa.is_VIsual = TRUE;
+    reg = get_register(regname, TRUE);
+    yank_do_autocmd(&oa, reg);
+    free_register(reg);
+}
+#endif
+
 /*
  * End Visual mode.
  * This function should ALWAYS be called to end Visual mode, except from
@@ -1342,6 +1362,18 @@ end_visual_mode(void)
      */
     if (clip_star.available && clip_star.owned)
        clip_auto_select();
+
+# if defined(FEAT_EVAL)
+    // Emit a TextYankPost for the automatic copy of the selection into the
+    // star and/or plus register.
+    if (has_textyankpost())
+    {
+       if (clip_isautosel_star())
+           call_yank_do_autocmd('*');
+       if (clip_isautosel_plus())
+           call_yank_do_autocmd('+');
+    }
+# endif
 #endif
 
     VIsual_active = FALSE;
index 625150db2218a73838d896c4688034579171d97f..6574432bdbecfd8683b09b6b5957208c498b3a34 100644 (file)
@@ -322,8 +322,7 @@ put_register(int name, void *reg)
 #endif
 }
 
-#if (defined(FEAT_CLIPBOARD) && defined(FEAT_X11) && defined(USE_SYSTEM)) \
-       || defined(PROTO)
+#if defined(FEAT_CLIPBOARD) || defined(PROTO)
     void
 free_register(void *reg)
 {
index 890d28ff24d813ae2f8d182503987aef5a696e8b..c51f37f0e7db7e6834ea95d7f07d4cd62374ea33 100644 (file)
@@ -1760,6 +1760,28 @@ func Test_TextYankPost()
 
   call assert_equal({}, v:event)
 
+  if has('clipboard_working') && !has('gui_running')
+    " Test that when the visual selection is automatically copied to clipboard
+    " register a TextYankPost is emitted
+    call setline(1, ['foobar'])
+
+    let @* = ''
+    set clipboard=autoselect
+    exe "norm! ggviw\<Esc>"
+    call assert_equal(
+        \{'regcontents': ['foobar'], 'regname': '*', 'operator': 'y', 'regtype': 'v', 'visual': v:true},
+        \g:event)
+
+    let @+ = ''
+    set clipboard=autoselectplus
+    exe "norm! ggviw\<Esc>"
+    call assert_equal(
+        \{'regcontents': ['foobar'], 'regname': '+', 'operator': 'y', 'regtype': 'v', 'visual': v:true},
+        \g:event)
+
+    set clipboard&vim
+  endif
+
   au! TextYankPost
   unlet g:event
   bwipe!
index 0308c91209010f9663e5dc30406ecc33e765208b..cebba1555dac599806487ac8cecd42e0c23071e4 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2057,
 /**/
     2056,
 /**/