18 Commits

Author SHA1 Message Date
fe4f8df0ab wip 2025-11-26 11:32:35 -08:00
bbd682cec7 Remove and start over with some of the undo stuff. 2025-11-26 08:25:41 -08:00
ace25c5c65 more undo work 2025-11-26 03:00:49 -08:00
09881706f2 bump version
Some checks failed
Release / Bump Homebrew formula (push) Has been cancelled
2025-11-26 02:25:29 -08:00
2579bb01c8 fix C-e bug 2025-11-26 02:24:56 -08:00
a528b3fc3e universal args, more work on undo. 2025-11-26 02:12:37 -08:00
faa70af9b7 Working on undo system. 2025-11-26 01:45:56 -08:00
e1abaae6aa unindent, formatting fixups, and fix memleak
I think clion royally wrecked my formatting. Going to keep
fixing it up as I find stuff.
2025-11-26 00:26:07 -08:00
329b92f382 bump version
Some checks failed
Release / Bump Homebrew formula (push) Has been cancelled
2025-11-25 22:33:50 -08:00
12553f301b delete region works. 2025-11-25 22:31:03 -08:00
75b19042b9 add support for reloading the current file 2025-11-25 21:20:13 -08:00
1a184b1a08 minor fixups 2025-11-25 16:32:07 -08:00
acde895fb7 bump version
Some checks failed
Release / Bump Homebrew formula (push) Has been cancelled
2025-11-25 15:50:35 -08:00
78d522ba98 quality of life improvements 2025-11-25 15:50:05 -08:00
feb6667a24 add missing function declarations 2025-11-25 15:32:17 -08:00
Jeremy O'Brien
66c79e0762 fix manpage install with cmake 2025-11-25 13:51:28 -08:00
a51b98c31f switch nix build to cmake 2025-11-25 09:21:03 -08:00
707362574c fixups for nixos 2025-11-25 09:18:26 -08:00
7 changed files with 1783 additions and 562 deletions

View File

@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.15)
project(ke C) # Specify C language explicitly
set(CMAKE_C_STANDARD 99)
set(KE_VERSION "1.3.5")
set(KE_VERSION "1.5.0")
set(CMAKE_C_FLAGS "-Wall -Wextra -pedantic -Wshadow -Werror -std=c99 -g")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_DEFAULT_SOURCE -D_XOPEN_SOURCE")

View File

@@ -6,6 +6,7 @@ CFLAGS := -Wall -Wextra -pedantic -Wshadow -Werror -std=c99 -g
CFLAGS += -Wno-unused-result
CFLAGS += -D_DEFAULT_SOURCE -D_XOPEN_SOURCE
CFLAGS += -fsanitize=address -fno-omit-frame-pointer
CFLAGS += -fprofile-instr-generate -fcoverage-mapping
LDFLAGS := -fsanitize=address
@@ -26,3 +27,8 @@ clean:
.PHONY: test.txt
test.txt:
cp test.txt.bak $@
.PHONY: gdb
gdb:
@test -f $(TARGET).pid || (echo "error: $(TARGET).pid not found" >&2; exit 1)
@gdb -p $$(cat $(TARGET).pid | tr -d ' \t\n\r') ./$(TARGET)

17
TODO
View File

@@ -1,15 +1,18 @@
[X] goto-line
[X] text-corruption bug
[ ] alt-modifiers
[ ] refresh-screen
[ ] functions -> keymapping?
[x] refresh-screen
[ ] functions -> keymapping? (what did this even mean)
[X] rendering: need to skip over control characters like we do with tabs
[X] control-d -> delete
[ ] control-g -> exit buf prompt
[ ] load-file prompt on dirty buffer
[x] control-g -> exit buf prompt
[x] load-file prompt on dirty buffer
[ ] multiple files
[x] utf-8
[x] kill ring
[x] mark/region
What would it take for ke to be your daily drives?
+ C-u
+ Alt nav (backspace, delete, f, b, etc)
[x] C-u (repeat actions)
[x] Alt nav (backspace, delete, f, b, etc)
[-] undo tree (C-k u/U)

View File

@@ -1,16 +1,25 @@
{
lib,
installShellFiles,
stdenv,
cmake,
installShellFiles,
...
}:
stdenv.mkDerivation {
pname = "ke";
version = "1.3.5";
version = "1.5.0";
src = lib.cleanSource ./.;
nativeBuildInputs = [ installShellFiles ];
nativeBuildInputs = [
cmake
installShellFiles
];
cmakeFlags = [
"-DENABLE_ASAN=on"
"-DCMAKE_BUILD_TYPE=Debug"
];
installPhase = ''
runHook preInstall
@@ -18,10 +27,8 @@ stdenv.mkDerivation {
mkdir -p $out/bin
cp ke $out/bin/
installManPage ../ke.1
runHook postInstall
'';
postInstall = ''
installManPage ke.1
'';
}

35
ke.1
View File

@@ -22,11 +22,18 @@ grandeur. Many commands work with and without control; for example,
saving a file can be done with either C-k s or C-k C-s. Other commands work
with ESC or CTRL.
.Sh K-COMMANDS
k-command mode can be exited with ESC or C-g.
.Bl -tag -width xxxxxxxxxxxx -offset indent
.It C-k BACKSPACE
Delete from the cursor to the beginning of the line.
.It C-k SPACE
Toggle the mark.
.It C-k -
If the mark is set, unindent the region.
.It C-k =
If the mark is set, indent the region.
.It C-k c
Clear (flush) the kill ring.
.It C-k d
Delete from the cursor to the end of the line.
.It C-k C-d
@@ -36,32 +43,48 @@ Edit a new file. Also C-k C-e.
.It C-k f
Incremental find.
.It C-k g
Go to a specific line. Also C-k C-g.
Go to a specific line.
.It C-k j
Jump to the mark.
.It C-k l
List the number of lines of code in a saved file.
.It C-k m
Run make(1).
.It C-k q
exit the editor. Also C-k C-q.
Exit the editor. If the file has unsaved changes,
a warning will be printed; a second C-k q will exit.
.It C-k C-q
Immediately exit the editor.
.It C-k C-r
Reload the current buffer from disk.
.It C-k s
save the file, prompting for a filename if needed. Also C-k C-s.
Save the file, prompting for a filename if needed. Also C-k C-s.
.It C-k u
Undo changes.
.It C-k U
Redo changes.
.It C-k x
save the file and exit. Also C-k C-x.
.It C-k y
Yank the killring.
Yank the kill ring.
.It C-k \[char92]
Dump core.
.El
.Sh OTHER KEYBINDINGS
.Bl -tag -width xxxxxxxxxxxx -offset indent
.It C-g
In general, C-g cancels an operation.
.It C-l
Refresh the display.
.It C-s
Incremental find.
.It C-u
Universal argument. C-u followed by numbers will repeat an
operation n times.
.It C-w
Kill the region if the mark is set.
.It C-y
Yank the killring.
Yank the kill ring.
.It ESC BACKSPACE
Delete the previous word.
.It ESC b
@@ -71,7 +94,7 @@ Delete the next word.
.It ESC f
Move to the next word.
.It ESC w
Save the region (if the mark is set) to the killring.
Save the region (if the mark is set) to the kill ring.
.It
.El
.Sh FIND

2102
main.c

File diff suppressed because it is too large Load Diff

162
scratch.c Normal file
View File

@@ -0,0 +1,162 @@
/*
* scratch.c - ideas in progress
*/
#define REFLOW_MARGIN 72
void
reflow_region(void)
{
int start_row, end_row, i, col, wlen, this_len;
struct erow *row;
struct abuf buf = ABUF_INIT;
struct abuf out = ABUF_INIT;
int in_paragraph = 0;
int indent_len = 0;
char indent[REFLOW_MARGIN + 1];
char word[REFLOW_MARGIN + 1];
char *e = NULL;
char *p = NULL;
char *s = NULL;
if (editor.mark_set) {
if (editor.mark_cury < editor.cury ||
(editor.mark_cury == editor.cury &&
editor.mark_curx < editor.curx)) {
start_row = editor.mark_cury;
end_row = editor.cury;
} else {
start_row = editor.cury;
end_row = editor.mark_cury;
}
} else {
start_row = end_row = editor.cury;
while (start_row > 0 && editor.row[start_row - 1].size > 0) {
start_row--;
}
while (end_row < editor.nrows - 1 &&
editor.row[end_row + 1].size > 0) {
end_row++;
}
}
if (start_row >= editor.nrows) {
return;
}
if (end_row >= editor.nrows) {
end_row = editor.nrows - 1;
}
for (i = start_row; i <= end_row; i++) {
row = &editor.row[i];
if (row->size == 0) {
if (in_paragraph) {
ab_append(&buf, "\n", 1);
in_paragraph = 0;
}
ab_append(&buf, "\n", 1);
continue;
}
if (!in_paragraph) {
indent_len = 0;
while (indent_len < row->size &&
(row->line[indent_len] == ' ' ||
row->line[indent_len] == '\t')) {
indent[indent_len] = row->line[indent_len], indent_len++;
}
indent[indent_len] = '\0';
in_paragraph = 1;
}
ab_append(&buf, row->line + indent_len, row->size - indent_len);
ab_append(&buf, " ", 1);
}
if (in_paragraph) {
ab_append(&buf, "\n", 1);
}
p = buf.b;
col = 0;
while (p != NULL && *p != '\0') {
while (*p && isspace((unsigned char)*p) &&
*p != '\n') {
p++;
}
if (*p == '\0') {
break;
}
wlen = 0;
while (*p && !isspace((unsigned char)*p)) {
if (wlen < REFLOW_MARGIN)
word[wlen++] = *p;
p++;
}
word[wlen] = '\0';
if (*p == '\n' && (p[1] == '\n' || p[1] == '\0')) {
ab_append(&out, "\n", 1); /* flush */
col = 0;
p++; /* consume the extra \n */
continue;
}
this_len = wlen;
if (col > 0) {
this_len++; /* space before word */
}
if (col == 0) {
ab_append(&out, indent, indent_len);
col = indent_len;
}
if (col + this_len > REFLOW_MARGIN && col > 0) {
ab_append(&out, "\n", 1);
ab_append(&out, indent, indent_len);
col = indent_len;
}
if (col > 0) {
ab_append(&out, " ", 1);
col++;
}
ab_append(&out, word, wlen);
col += wlen;
}
if (col > 0) {
ab_append(&out, "\n", 1);
}
/* the old switcharoo */
buf = out;
ab_free(&out);
for (i = end_row; i >= start_row; i--) {
delete_row(i);
}
s = buf.b;
while ((e = strchr(s, '\n'))) {
erow_insert(start_row++, s, e - s);
s = e + 1;
}
ab_free(&buf);
editor.dirty++;
editor_set_status("Region reflowed to %d columns", REFLOW_MARGIN);
}