DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T r

⟦6bfba1937⟧ TextFile

    Length: 10576 (0x2950)
    Types: TextFile
    Names: »run_ctrlsk.clu«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« 
        └─⟦2109abc41⟧ 
            └─ ⟦this⟧ »./X.V10R4/xted/run_ctrlsk.clu« 

TextFile

run_ctrlsk = proc (e: env, c: char) signals (errmsg(string), stop(env, string))

    help_msg1 = "@,?w: move to end of # previous word\n" ||
		"A,?x: move backward # pages\n" ||
		"B,?r: move forward # pages\n" ||
		"C,?v: move right # words\n" ||
		"D,?t: move left # word\n" ||
		"H:    enter alternate keypad mode\n" ||
		"J:    pattern search # times for default\n" ||
		"L,?q: delete backward to end of # previous word\n" ||
		"M,?s: delete forward to start of # next word\n" ||
		"N,?y: move to start of # next word\n"

    norm_msg =  "P:    delete forward # words\n" ||
		"Q:    delete backward # words\n"

    swap_msg =  "P:    delete backward # words\n" ||
		"Q:    delete forward # words\n"

    help_msg2 = "R:    forward string search # times for default\n" ||
		"S,?p: backward string search # times for default\n" ||
		"T:    set case mode for searches\n" ||
		"U:    scroll window up # lines\n" ||
		"V:    scroll window down # lines\n" ||
		"W:    reposition window at cursor\n" ||
		"?n:   exit to EXEC\n" ||
		"?u:   exit alternate keypad mode\n" ||
		"?M:   garbage collect address space\n" ||
		"&c:   scroll window to button position\n" ||
		"&C:   set cursor to button position\n" ||
		"&t:   (#<1: normal, #=1: underline, #>1: invert) between cursor and mouse\n" ||
		"&T:   set mark to button position\n" ||
		"&w:   move to button window cursor\n" ||
		"&W:   move to button window\n" ||
		"&Y:   insert cut buffer |#| times (#<0: before cursor)\n" ||
		"&z:   store saved text in cut buffer\n" ||
		"&Z:   store deleted text in cut buffer\n" ||
		"esc:  redefine escape sequence"

    prompt1 = "Escape: "
    prompt2 = "Escape: ?"
    prompt3 = "Escape: ["
    prompt4 = "Escape: O"

    own any_defs: bool := false
    own redefs: string
    own qredefs: string
    own swapped: bool := false
    if c = ctrlat
       then prompt = "Set red & blue function keys"
	    legal = "RS"
	    help = "R: reset to normal mode\n" ||
		   "S: swap meanings"
	    i: int, opt: char := get_option (e, prompt, legal, help, false)
	    swapped := opt = 'S'
	    return
       end resignal errmsg
    b: buf := e.buffer
    arg: int := e.this_arg
    line, pos: int := buf$get_cursor(b)
    dotop: bool := false
    prompt: string := prompt1
    qmark: bool := false
    xmark: bool := false
    while true do
	if ~dotop
	   then dotop := ~_pending_wait() end
	if dotop
	   then top_display(e, prompt)
		env$display(e)
	   end
	c := _getc()
	if xmark cand c >= 'a' cand c <= 'z'
	   then qmark := true end
	if dotop
	   then top_display(e, string$append(prompt, c)) end
	if any_defs cand ((~qmark cand string$indexc(c, redefs) > 0) cor
			  (qmark cand string$indexc(c, qredefs) > 0))
	   then s: string
		if qmark
		   then s := "esc-?"
		   else s := "esc-"
		   end
		s := env$fetch_str(e, string$append(s, c), "")
		env$forget_char(e)
		for i: int in int$from_to_by(arg, 1, -1) do
		    _push_macro_chars(s)
		    end
		return
	   end
	if (~qmark cand (c = 'A' cor c = 'B')) cor
	   (qmark cand (c = 'x' cor c = 'r'))
	   then % move up/down arg pages
		if c = 'A' cor c = 'x' then arg := - arg end
		env$move_window(e, arg)
	 elseif (~qmark cand (c = 'C' cor c = 'D')) cor
		(qmark cand (c = 'v' cor c = 't'))
	   then % move right/left # words
		if c = 'D' cor c = 't' then arg := - arg end
		line, pos := scan_word(b, line, pos, arg,
				       false, e.word_chars)
		buf$set_cursor(b, line, pos)
	 elseif (~qmark cand (c = '@' cor c = 'N')) cor
		(qmark cand (c = 'w' cor c = 'y'))
	   then % move right/left # start/end words
		if c = '@' cor c = 'w' then arg := - arg end
		line, pos := scan_word(b, line, pos, arg,
				       true, e.word_chars)
		buf$set_cursor(b, line, pos)
	 elseif ~qmark cand c = 'H'
	   then % enter alternate keypad mode
		if _set_keypad_mode(true)
		   then top_display(e, "Entering Alternate Keypad Mode.")
			env$store_num(e, "keypad", 1)
		   end
	 elseif ~qmark cand c = 'J'
	   then % pattern search # times
		obj: string := env$fetch_str(e, "psearch", "")
		case: bool := env$fetch_num(e, "ignore_case", 0) = 0
		confirm: bool := env$fetch_num(e, "pconfirm", 0) ~= 0
		immed: bool := false
		if arg < 0
		   then immed := true
			arg := -arg
		   end
		for arg in int$from_to_by(arg, 1, -1) do
		    if ~pattern$search(e, obj, case, immed, confirm)
		       then signal errmsg("Not found!") end
		    end
	 elseif (~qmark cand (c = 'L' cor c = 'M')) cor
		(qmark cand (c = 'q' cor c = 's'))
	   then % delete left/right # end/start words
		if c = 'L' cor c = 'q' then arg := -arg end
		line, pos := scan_word(b, line, pos, arg,
				       true, e.word_chars)
		env$delete1(e, line, pos)
	 elseif ~qmark cand (c = 'P' cor c = 'Q')
	   then % delete left/right # words
		if (c = 'P' cand swapped) cor (c = 'Q' cand ~swapped)
		   then arg := -arg end
		line, pos := scan_word(b, line, pos, arg,
				       false, e.word_chars)
		env$delete1(e, line, pos)
	 elseif (~qmark cand (c = 'R' cor c = 'S')) cor (qmark cand c = 'p')
	   then % search left/right # times
		if c ~= 'R' then arg := - arg end
		if ~string_search(e.buffer,
				  env$fetch_str(e, "search", ""),
				  arg,
				  env$fetch_num(e, "ignore_case", 0) = 0)
		   then signal errmsg("Not found!") end
	 elseif ~qmark cand c = 'T'
	   then % set case mode
		arg := 0
		if mconfirm(e, "Ignore upper/lower case in searches", true)
		   then arg := 1 end
		env$store_num(e, "ignore_case", arg)
	 elseif ~qmark cand (c = 'U' cor c = 'V')
	   then % scroll up/down
		if c = 'U' then arg := -arg end
		pos := env$choose_window(e) + arg
		if line < pos
		   then if arg = -1  cor  arg = 1 then _bell() end
			pos := line
		 elseif line >= pos + e.size
		   then if arg = -1  cor  arg = 1 then _bell() end
			pos := line - e.size + 1
		 end
		e.window_top := pos
	 elseif ~qmark cand c = 'W'
	   then % reposition at cursor
		env$new_window(e)
	 elseif qmark cand (c = 'M' cor c = 'n')
	   then % enter EXEC or GC
		e.this_arg := 1
		if c = 'M' then e.this_arg := 4 end
		run_ctrlat(e, ctrlat)
	 elseif qmark cand c = 'u'
	   then % exit alternate keypad mode
		if _set_keypad_mode(false)
		   then top_display(e, "Leaving Alternate Keypad Mode.")
			env$store_num(e, "keypad", 0)
		   end
	 elseif c = '?'
	   then % read next char or print help
		if ~qmark cand ~xmark
		   then qmark := true
			prompt := prompt2
			continue
		   end
		help: string := norm_msg
		if swapped then help := swap_msg end
		type_string(e, help_msg1 || help || help_msg2,
			    "---- Help for escape sequences")
		dotop := true
		xmark := false
		qmark := false
		prompt := prompt1
		continue
	 elseif c = '[' cand ~xmark cand ~qmark
	   then xmark := true
		prompt := prompt3
		continue
	 elseif c = 'O' cand ~xmark cand ~qmark
	   then xmark := true
		prompt := prompt4
		continue
	 elseif c = esc cand ~qmark cand ~xmark
	   then % redefine escape sequence
		prompt := "Define escape: "
		while true do
		    if ~_in_macro()
		       then top_display(e, prompt)
			    env$display(e)
		       end
		    c := _getc()
		    prompt := string$append(prompt, c)
		    if qmark cor xmark
		       then break
		     elseif c = '?'
		       then qmark := true
		     elseif c = '[' cor c = 'O'
		       then xmark := true
		     else break end
		    end
		if ~_in_macro() then top_display(e, prompt) end
		if env$is_argenv(e)
		   then signal errmsg("Can't redefine now!") end
		if xmark cand c >= 'a' cand c <= 'z'
		   then qmark := true end
		if (~qmark cand c = esc) cor (qmark cand c = '?')
		   then signal errmsg("Can't redefine this sequence!") end
		if ~any_defs
		   then redefs := ""
			qredefs := ""
		   end
		name, defs: string
		if qmark
		   then name := string$append("esc-?", c)
			defs := qredefs
		   else name := string$append("esc-", c)
			defs := redefs
		   end
		s: string := get_string_arg(e, "Define as",
					    env$fetch_str(e, name, ""))
		env$store_str(e, name, s)
		arg := string$indexc(c, defs)
		if string$empty(s)
		   then if arg > 0
			   then defs := string$substr(defs, 1, arg - 1) ||
					string$rest(defs, arg + 1)
				any_defs := ~string$empty(redefs) cor
					    ~string$empty(qredefs)
			   end
		 elseif arg = 0
		   then defs := string$append(defs, c)
			any_defs := true
		 end
		if qmark
		   then qredefs := defs
		   else redefs := defs
		   end
	 elseif (c = '\303'  cor  c = '\324')  cand  ~qmark  cand  ~xmark
	   then hpos, vpos: int := input$bpos()
		lines, chars: int := _get_screen_size()
		if vpos <= e.top_line  cor  vpos > e.last_line  cor
		   hpos < 0  cor  hpos >= chars
		   then signal errmsg("Position lies outside window") end
		vpos := vpos - e.top_line + e.window_top - 1
		s: string := b[vpos]
		i: int := int$min(hpos + 2, string$size(s) + 1)
		while _calc_hpos(s, i) > hpos do
		    i := i - 1
		    end
		if c = '\303'
		   then buf$set_cursor(b, vpos, i)
		   else buf$set_mark(b, vpos, i)
		   end
	 elseif (c = '\327'  cor  c = '\343'  cor  c = '\367')  cand
		~qmark  cand  ~xmark
	   then hpos, vpos: int := input$bpos()
		lines, chars: int := _get_screen_size()
		for ee: env in winset$displayed() do
		    if vpos <= ee.top_line  cor  vpos > ee.last_line  cor
		       hpos < 0  cor  hpos >= chars  cor
		       (env$is_argenv(e)  cand  e ~= ee)
		       then continue end
		    if c = '\343'
		       then if e ~= ee
			       then break end
			    e.window_top := line + e.top_line + 1 - vpos
			    return
		       end
		    if c = '\327'
		       then env$choose_cursor(ee) end
		    signal stop(ee, "")
		    end
		signal errmsg("Position lies outside window")
	 elseif c = '\331'  cand  ~qmark  cand  ~xmark
	   then s: string := x_fetch_cut(0)
		if string$empty(s) then return end
		for i: int in int$from_to_by(int$abs(arg), 1, -1) do
		    if ~env$insert1(e, s) then
		       signal errmsg("Can't insert text here!")
		       end
		    end
		if arg > 0 then buf$set_cursor(b, line, pos) end
	 elseif (c = '\332'  cor  c = '\372')  cand  ~qmark  cand  ~xmark
	   then cut: buf
		if c = '\332'
		   then cut := e.killed
		   else cut := e.saved
		   end
		buf$set_cursor(cut, 1, 1)
		x_store_cut(0, buf$b2s(cut, buf$size(cut), max_int))
		buf$set_cursor(cut, 1, 1)
	 elseif c = '\364'  cand  ~qmark  cand  ~xmark
	   then input$set_highlight(arg > 0)
		screen$set_highlight(arg > 0, arg > 1)
	 elseif ((c >= '\301'  cand  c <= '\330')  cor
		 (c >= '\341'  cand  c <= '\370'))  cand
		~qmark  cand  ~xmark
	   then return
	 elseif c = ctrlg
	   then % quit
		signal errmsg(quit_msg)
	 else signal errmsg("Illegal escape char: '" || c2s(c) || "'")
	 end resignal errmsg
	return
	end
    end run_ctrlsk