@@ -1645,6 +1645,63 @@ shift_delete_registers()
16451645 y_regs [1 ].y_array = NULL ; /* set register one to empty */
16461646}
16471647
1648+ static void
1649+ yank_do_autocmd (oparg_T * oap , yankreg_T * reg )
1650+ {
1651+ static int recursive = FALSE;
1652+ dict_T * v_event ;
1653+ list_T * list ;
1654+ int n ;
1655+ char_u buf [NUMBUFLEN + 2 ];
1656+ long reglen = 0 ;
1657+
1658+ if (recursive )
1659+ return ;
1660+
1661+ v_event = get_vim_var_dict (VV_EVENT );
1662+
1663+ list = list_alloc ();
1664+ for (n = 0 ; n < reg -> y_size ; n ++ )
1665+ list_append_string (list , reg -> y_array [n ], -1 );
1666+ list -> lv_lock = VAR_FIXED ;
1667+ dict_add_list (v_event , "regcontents" , list );
1668+
1669+ buf [0 ] = (char_u )oap -> regname ;
1670+ buf [1 ] = NUL ;
1671+ dict_add_nr_str (v_event , "regname" , 0 , buf );
1672+
1673+ buf [0 ] = get_op_char (oap -> op_type );
1674+ buf [1 ] = get_extra_op_char (oap -> op_type );
1675+ buf [2 ] = NUL ;
1676+ dict_add_nr_str (v_event , "operator" , 0 , buf );
1677+
1678+ buf [0 ] = NUL ;
1679+ buf [1 ] = NUL ;
1680+ switch (get_reg_type (oap -> regname , & reglen ))
1681+ {
1682+ case MLINE : buf [0 ] = 'V' ; break ;
1683+ case MCHAR : buf [0 ] = 'v' ; break ;
1684+ case MBLOCK :
1685+ vim_snprintf ((char * )buf , sizeof (buf ), "%c%ld" , Ctrl_V ,
1686+ reglen + 1 );
1687+ break ;
1688+ }
1689+ dict_add_nr_str (v_event , "regtype" , 0 , buf );
1690+
1691+ /* Lock the dictionary and its keys */
1692+ dict_set_items_ro (v_event );
1693+
1694+ recursive = TRUE;
1695+ textlock ++ ;
1696+ apply_autocmds (EVENT_TEXTYANKPOST , NULL , NULL , FALSE, curbuf );
1697+ textlock -- ;
1698+ recursive = FALSE;
1699+
1700+ /* Empty the dictionary, v:event is still valid */
1701+ dict_free_contents (v_event );
1702+ hash_init (& v_event -> dv_hashtab );
1703+ }
1704+
16481705/*
16491706 * Handle a delete operation.
16501707 *
@@ -1798,6 +1855,11 @@ op_delete(oparg_T *oap)
17981855 return FAIL ;
17991856 }
18001857 }
1858+
1859+ #ifdef FEAT_AUTOCMD
1860+ if (did_yank && has_textyankpost ())
1861+ yank_do_autocmd (oap , y_current );
1862+ #endif
18011863 }
18021864
18031865 /*
@@ -3270,6 +3332,11 @@ op_yank(oparg_T *oap, int deleting, int mess)
32703332# endif
32713333#endif
32723334
3335+ #ifdef FEAT_AUTOCMD
3336+ if (!deleting && has_textyankpost ())
3337+ yank_do_autocmd (oap , y_current );
3338+ #endif
3339+
32733340 return OK ;
32743341
32753342fail : /* free the allocated lines */
0 commit comments