Initial import, starting with kyle's editor.
This commit is contained in:
commit
42658b8d98
|
@ -0,0 +1,22 @@
|
|||
BIN := ke
|
||||
OBJS := main.o
|
||||
|
||||
LDFLAGS := -static
|
||||
CFLAGS := -pedantic -Wall -Werror -Wextra -O2 -std=c99
|
||||
|
||||
.PHONY: all
|
||||
all: $(BIN) run
|
||||
|
||||
$(BIN): $(OBJS)
|
||||
$(CC) $(LDFLAGS) -o $@ $(OBJS)
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -f $(BIN) $(OBJS)
|
||||
|
||||
.PHONY: run
|
||||
run: $(BIN)
|
||||
./$(BIN)
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c $@ $<
|
|
@ -0,0 +1,37 @@
|
|||
An Exploration of the Keys
|
||||
==========================
|
||||
|
||||
ESC: 1b
|
||||
|
||||
Function keys: 1b followed by
|
||||
|
||||
F1 F2 F3 F4 F5 F6 F7 F8
|
||||
4f O 4f O 4f O 4f O 5b 5b 5b 5b
|
||||
50 P 51 Q 52 R 54 S 31 1 31 1 31 1 31 1
|
||||
35 5 37 7 38 8 39 9
|
||||
7e ~ 7e ~ 7e ~ 7e ~
|
||||
|
||||
F9 F10 F11 F12
|
||||
5b [ 5b [ 5b [ 5b [
|
||||
32 2 32 2 32 2 32 2
|
||||
30 0 31 1 33 3 34 4
|
||||
7e ~ 7e ~ 7e ~ 7e ~
|
||||
|
||||
DEL 7f - but it should be a 4-byte escape sequence?
|
||||
BKSP 7f
|
||||
|
||||
Arrow keys: 1b followed by
|
||||
UP DN LF RT
|
||||
5b [ 5b [ 5b [ 5b [
|
||||
41 A 42 B 44 D 43 C
|
||||
|
||||
Other keys: 1b followed by
|
||||
|
||||
HOME END PGUP PGDN INS
|
||||
5b [ 5b [ 5b [ 5b [ 5b [
|
||||
48 H 46 F 35 5 36 6 32 2
|
||||
7e ~ 7e ~ 7e ~
|
||||
|
||||
|
||||
Notes: any time you see escape, you must process another key to figure
|
||||
out what to do.
|
|
@ -0,0 +1,68 @@
|
|||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
/* entry_term contains a snapshot of the termios settings at startup. */
|
||||
struct termios entry_term;
|
||||
|
||||
|
||||
/*
|
||||
* A text editor needs the terminal to be in raw mode; but the default
|
||||
* is to be in canonical (cooked) mode, which is a buffered input mode.
|
||||
*/
|
||||
|
||||
static void
|
||||
enable_termraw()
|
||||
{
|
||||
struct termios raw;
|
||||
|
||||
/* Read the current terminal parameters for standard input. */
|
||||
tcgetattr(STDIN_FILENO, &raw);
|
||||
|
||||
/*
|
||||
* Turn off the local ECHO mode, which we need to do in raw mode
|
||||
* because what gets displayed is going to need extra control.
|
||||
*
|
||||
* NOTE(kyle): look into cfmakeraw, which will require
|
||||
* snapshotting.
|
||||
*/
|
||||
raw.c_lflag &= ~(ECHO|ICANON);
|
||||
|
||||
/*
|
||||
* Now write the terminal parameters to the current terminal,
|
||||
* after flushing any waiting input out.
|
||||
*/
|
||||
tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
disable_termraw()
|
||||
{
|
||||
tcsetattr(STDIN_FILENO, TCSAFLUSH, &entry_term);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
char c;
|
||||
|
||||
/* prepare the terminal */
|
||||
tcgetattr(STDIN_FILENO, &entry_term);
|
||||
atexit(disable_termraw);
|
||||
enable_termraw();
|
||||
|
||||
while (read(STDIN_FILENO, &c, 1) == 1 && c != 'q') {
|
||||
if (iscntrl(c)) {
|
||||
printf("%02x\n", c);
|
||||
} else {
|
||||
printf("%02x ('%c')\n", c, c);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue