12-13-2022, 02:04 AM
Hey Vince. How about we add Ctrl + arrows, with highlighting, Shift with highlighting, cut, copy, and paste?
Pete
Code: (Select All)
DIM SHARED shift%
' Single line keyboard routine for input.
LOCATE , 3, 1 ' Show cursor.
pw = 0 ' 1 sets "*" display on for password privacy, zero shows keyboard input.
mr = 31 ' Margin right.
start_column = POS(0)
y = CSRLIN: x = POS(0) ' Initial cursor position.
DO
_LIMIT 30
string_pos = POS(0) - start_column ' Track cursor and word position.
LOCATE 5, 3: PRINT string_pos; " ";: LOCATE y, x
CALL kb_mse(b$)
IF LEN(b$) THEN
SELECT CASE b$
CASE CHR$(27) ' Esc key.
SYSTEM
CASE CHR$(13) ' Enter key.
EXIT DO
CASE CHR$(8) ' Backspace key.
IF string_pos > 0 THEN GOSUB backspace
CASE CHR$(0) + "S" ' Delete key.
GOSUB delete
CASE CHR$(0) + "M" ' Arrow right key.
IF string_pos < LEN(word$) THEN GOSUB cursor_forward
CASE CHR$(0) + "K" ' Arrow left key.
IF string_pos > 0 THEN GOSUB cursor_back
CASE CHR$(0) + "t" ' Ctrl + Arrow right key.
IF string_pos < LEN(word$) THEN GOSUB ctrl_rt
CASE CHR$(0) + "s" ' Ctrl + Arrow left key.
IF string_pos > 0 THEN GOSUB ctrl_lt
CASE CHR$(0) + "G" ' Home
LOCATE , start_column
CASE CHR$(0) + "O" ' End
LOCATE , start_column - 1 + LEN(word$)
IF POS(0) < mr THEN LOCATE , POS(0) + 1
CASE CHR$(0) + "R" ' Insert/overwrite toggel
ovw = 1 - ovw
IF ovw = 0 THEN LOCATE , , 1, 7, 7 ELSE LOCATE , , 1, 7, 30
CASE CHR$(22) ' Ctrl + V - Paste
IF LEN(_CLIPBOARD$) THEN GOSUB paste
CASE CHR$(3) ' Ctrl + C - Copy
GOSUB copy
CASE CHR$(24) ' Ctrl + X - Cut
GOSUB cut
CASE CHR$(32) TO "z"
IF string_pos + start_column < mr THEN GOSUB print_chr
END SELECT
y = CSRLIN: x = POS(0) ' Track cursor.
END IF
LOOP
END
print_chr:
IF hl THEN COLOR 7, 0: hl = 0
SELECT CASE ovw
CASE 0
IF start_column + LEN(word$) < mr THEN
word$ = MID$(word$, 1, string_pos) + b$ + MID$(word$, string_pos + 1)
LOCATE , start_column: PRINT SPACE$(LEN(word$) + 1);
LOCATE , start_column
IF pw THEN PRINT STRING$(LEN(word$), "*"); ELSE PRINT word$;
LOCATE , x + 1
END IF
CASE ELSE
word$ = MID$(word$, 1, string_pos) + b$ + MID$(word$, string_pos + 1)
IF pw THEN PRINT "*"; ELSE PRINT b$;
END SELECT
RETURN
backspace:
IF hl THEN COLOR 7, 0: hl = 0
word$ = MID$(word$, 1, string_pos - 1) + MID$(word$, string_pos + 1)
LOCATE , start_column: PRINT SPACE$(LEN(word$) + 1);
LOCATE , start_column
IF pw THEN PRINT STRING$(LEN(word$), "*"); ELSE PRINT word$;
LOCATE , x - 1
hl = 0
RETURN
delete:
IF hl THEN COLOR 7, 0: hl = 0
word$ = MID$(word$, 1, string_pos) + MID$(word$, string_pos + 2)
LOCATE , start_column: PRINT SPACE$(LEN(word$) + 1);
LOCATE , start_column
IF pw THEN PRINT STRING$(LEN(word$), "*"); ELSE PRINT word$;
LOCATE , x
RETURN
cursor_forward:
IF shift% AND POS(0) < mr THEN
IF hl < 0 THEN COLOR 7, 0 ELSE COLOR 0, 7
hl = hl + 1
IF pw THEN PRINT "*"; ELSE PRINT MID$(word$, string_pos + 1, 1);
COLOR 7, 0
ELSE
IF hl THEN GOSUB hl_off
IF POS(0) < mr THEN LOCATE , POS(0) + 1
END IF
RETURN
cursor_back:
IF shift% THEN
IF hl > 0 THEN COLOR 7, 0 ELSE COLOR 0, 7
hl = hl - 1
LOCATE , POS(0) - 1
IF pw THEN PRINT "*"; ELSE PRINT MID$(word$, string_pos, 1);
COLOR 7, 0
ELSE
IF hl THEN GOSUB hl_off
END IF
LOCATE , POS(0) - 1
RETURN
ctrl_rt:
i = 0
DO
i = i + 1 ' Do not use this variable in cursor_forward routine.
GOSUB cursor_forward
string_pos = POS(0) - start_column
LOOP UNTIL MID$(word$, string_pos, 1) = " " OR string_pos >= LEN(word$)
RETURN
ctrl_lt:
i = 0
DO
i = i - 1 ' Do not use this variable in cursor_forward routine.
GOSUB cursor_back
string_pos = POS(0) - start_column
LOOP UNTIL MID$(word$, string_pos, 1) = " " OR POS(0) = start_column
RETURN
hl_off:
LOCATE , start_column
COLOR 7, 0
IF pw THEN PRINT STRING$(LEN(word$), "*"); ELSE PRINT word$;
LOCATE , x
hl = 0
RETURN
cut:
SELECT CASE hl
CASE IS > 0
_CLIPBOARD$ = MID$(word$, string_pos + 1 - hl, hl)
j = POS(0) - hl
LOCATE , start_column
PRINT SPACE$(LEN(word$));
word$ = MID$(word$, 1, string_pos - hl) + MID$(word$, string_pos + 1)
LOCATE , start_column
IF pw THEN PRINT STRING$(LEN(word$), "*"); ELSE PRINT word$;
LOCATE , j
CASE 0
' Do nothing
CASE IS < 0
_CLIPBOARD$ = MID$(word$, string_pos + 1, ABS(hl))
LOCATE , start_column
PRINT SPACE$(LEN(word$));
word$ = MID$(word$, 1, string_pos) + MID$(word$, string_pos + 1 + ABS(hl))
LOCATE , start_column
IF pw THEN PRINT STRING$(LEN(word$), "*"); ELSE PRINT word$;
LOCATE , start_column + string_pos
END SELECT
RETURN
copy:
SELECT CASE hl
CASE IS > 0
_CLIPBOARD$ = MID$(word$, string_pos + 1 - hl, hl)
CASE 0
' Do nothing
CASE IS < 0
_CLIPBOARD$ = MID$(word$, string_pos + 1, ABS(hl))
END SELECT
RETURN
paste:
tmp$ = _CLIPBOARD$
IF start_column + LEN(word$) + LEN(tmp$) < mr THEN
word$ = MID$(word$, 1, string_pos) + tmp$ + MID$(word$, string_pos + 1)
LOCATE , start_column
IF pw THEN PRINT STRING$(LEN(word$), "*"); ELSE PRINT word$;
LOCATE , start_column + string_pos + LEN(tmp$)
END IF
RETURN
SUB kb_mse (b$)
IF _KEYDOWN(100303) OR _KEYDOWN(100304) THEN shift% = -1 ELSE IF shift% THEN shift% = 0
_LIMIT 30
b$ = INKEY$
END SUB
Pete
If eggs are brain food, Biden takes his scrambled.