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/wmark.sl
%--------------------------------*-SLang-*--------------------------------
% wmark.sl
% Implements Windows style of marking - for Windows users
% Author: Luchesar Ionkov
%
% Modified By JED
% modified by mj olesen
%
% Holding down Shift key and using arrow keys selects text
% Delete Key cuts the block of text.
% Inserting a character will replace the block with the character.
% Yanking will replace the block with the text in the yank buffer
%
% Note: If you are having problems with this under linux, then read the
% jed/doc/txt/linux-keys.txt file.

require ("keydefs");

private variable Wmark_Region_Funs = Assoc_Type[Ref_Type];

private define backward_delete_fun ()
{
   call ("kill_region");
   insert ("X");
}

private define forward_delete_fun ()
{
   backward_delete_fun ();
   go_left_1 ();
}

public define wmark_add_region_function (fun, region_fun)
{
   Wmark_Region_Funs[fun] = region_fun;
}

wmark_add_region_function ("self_insert_cmd", &del_region);
wmark_add_region_function ("yank", &del_region);
wmark_add_region_function ("yp_yank", &del_region);

wmark_add_region_function ("backward_delete_char_untabify", &backward_delete_fun);
wmark_add_region_function ("backward_delete_char", &backward_delete_fun);
wmark_add_region_function ("delete_char_cmd", &forward_delete_fun);

private variable Wmark_Movement_Flag = 0;
private variable Wmark_Buffer;

private define before_key_hook ();
private define after_key_hook ();
private define end_wmark ()
{
   if (bufferp (Wmark_Buffer))
     {
	variable cbuf = whatbuf();
	setbuf (Wmark_Buffer);
	if (is_visible_mark ())
	  pop_mark_0 ();
	setbuf (cbuf);
     }

   remove_from_hook ("_jed_before_key_hooks", &before_key_hook);
   remove_from_hook ("_jed_after_key_hooks", &after_key_hook);
}

private define before_key_hook (fun)
{
   if (typeof (fun) == Ref_Type)
     fun = "&";

   if (0 == strncmp (fun, "wmark_", 6))
     return;

   Wmark_Movement_Flag = 0;
   if (is_visible_mark ()
       and assoc_key_exists (Wmark_Region_Funs, fun))
     {
	(@Wmark_Region_Funs[fun]) ();
	end_wmark ();
	return;
     }
}

private define after_key_hook ()
{
   if (Wmark_Movement_Flag == 0)
     end_wmark ();
}

private define wmark_prefix ()
{
   ifnot (is_visible_mark ()) push_visible_mark ();
   if (Wmark_Movement_Flag == 0)
     {
	add_to_hook ("_jed_before_key_hooks", &before_key_hook);
	add_to_hook ("_jed_after_key_hooks", &after_key_hook);
	Wmark_Movement_Flag = 1;
	Wmark_Buffer = whatbuf ();
     }
}

private define wmark_eval (fun)
{
   wmark_prefix ();
   if (typeof (fun) == Ref_Type)
     @fun ();
   else
     call (fun);
}

% the various functions

define wmark_up () { wmark_eval ("previous_line_cmd"); }
define wmark_down () { wmark_eval ("next_line_cmd"); }
define wmark_left () { wmark_eval ("previous_char_cmd"); }
define wmark_right () { wmark_eval ("next_char_cmd"); }
define wmark_page_up () { wmark_eval ("page_up"); }
define wmark_page_down () { wmark_eval ("page_down"); }
define wmark_bol () { wmark_eval (&bol); }
define wmark_eol () { wmark_eval (&eol); }
define wmark_bob () { wmark_eval (&bob); }
define wmark_eob () { wmark_eval (&eob); }
define wmark_skip_word () { wmark_eval (&skip_word); }
define wmark_bskip_word () { wmark_eval (&bskip_word); }

setkey ("wmark_up",		Key_Shift_Up);		% S-Up
setkey ("wmark_down",		Key_Shift_Down);	% S-Down
setkey ("wmark_left",		Key_Shift_Left);	% S-Left
setkey ("wmark_right",		Key_Shift_Right);	% S-Right
setkey ("wmark_page_up", 	Key_Shift_PgUp);	% S-PageUp
setkey ("wmark_page_down",	Key_Shift_PgDn);	% S-PageDown
setkey ("wmark_bol",		Key_Shift_Home);	% S-Home
setkey ("wmark_eol",		Key_Shift_End);		% S-End
setkey ("yank",			Key_Shift_Ins);		% S-Insert
setkey ("kill_region",		Key_Shift_Del);		% S-Delete
setkey ("copy_region",		Key_Ctrl_Ins);		% C-Insert
setkey ("del_region",		Key_Ctrl_Del);		% C-Delete

#ifndef IBMPC_SYSTEM
private define wmark_reset_display_hook ()
{
   tt_send("\e[?35h");
}

private define wmark_init_display_hook ()
{
   tt_send("\e[?35l");
}

$1 = getenv ("TERM"); if ($1 == NULL) $1 = "";

if (string_match ($1, "^xterm.color", 1)
    or string_match ($1, "^rxvt", 1))
{
   % rxvt: bypass XTerm shift keys and allow S-Prior, S-Next, S-Insert
   add_to_hook ("_jed_reset_display_hooks", &wmark_reset_display_hook);
   add_to_hook ("_jed_init_display_hooks", &wmark_init_display_hook);
   setkey ("wmark_bol",	"\e[7$");	% S-Home
   setkey ("wmark_eol",	"\e[8$");	% S-End
}
#endif

provide ("wmark");