HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/share/jed/lib/yankpop.sl
% Note the functions used here are not available on 16 bit systems.

private variable Kill_Buffer_Number = -1;
private variable Kill_Buffer_Yank_Number = -1;
private variable Kill_Buffer_Max_Number = -1;

% Instead of using a new user mark, I should probably set aside a bookmark
% to allow the user to goto it.
private variable Kill_Buffer_User_Mark;

private define append_or_prepend_copy_as_kill (fun)
{
   variable kill_fun = "%kill%";
   if (strcmp (LAST_KBD_COMMAND, kill_fun))
     {
	Kill_Buffer_Number++;
	if (Kill_Buffer_Number == KILL_ARRAY_SIZE)
	  {
	     Kill_Buffer_Number = 0;
	  }

	if (Kill_Buffer_Number > Kill_Buffer_Max_Number)
	  Kill_Buffer_Max_Number = Kill_Buffer_Number;

	copy_region_to_kill_array (Kill_Buffer_Number);
	Kill_Buffer_Yank_Number = Kill_Buffer_Number;
     }
   else
     {
	@fun (Kill_Buffer_Number);
     }

   set_current_kbd_command (kill_fun);
}

define yp_copy_region_as_kill ()
{
   append_or_prepend_copy_as_kill (&append_region_to_kill_array);
}

define yp_kill_region ()
{
   () = dupmark ();
   yp_copy_region_as_kill ();
   del_region ();
}

define yp_prepend_copy_region_as_kill ()
{
   append_or_prepend_copy_as_kill (&prepend_region_to_kill_array);
}

define yp_prepend_kill_region ()
{
   () = dupmark ();
   yp_prepend_copy_region_as_kill ();
   del_region ();
}

define yp_kill_line ()
{
   variable one;
   variable kill_fun = "%kill%";

   one = eolp () or (KILL_LINE_FEATURE and bolp ());

   mark_to_visible_eol ();
   go_right (one);
   yp_kill_region ();
}

define yp_yank ()
{
   Kill_Buffer_User_Mark = create_user_mark ();
   insert_from_kill_array (Kill_Buffer_Yank_Number);
   set_current_kbd_command ("%yank%");
}

define yp_yank_pop ()
{
   if (strcmp (LAST_KBD_COMMAND, "%yank%"))
     {
	error ("The last command must be a yank one.");
     }

   Kill_Buffer_Yank_Number--;
   if (Kill_Buffer_Yank_Number < 0)
     {
	Kill_Buffer_Yank_Number = Kill_Buffer_Max_Number;
     }

   %  Delete the previous yank
   push_mark ();
   goto_user_mark (Kill_Buffer_User_Mark);
   del_region ();

   yp_yank ();
}

define yp_kill_word ()
{
   push_mark(); skip_word();
   yp_kill_region ();
}

define yp_bkill_word ()
{
   push_mark(); bskip_word();
   yp_prepend_kill_region ();
}

provide ("yankpop");