Add x function and other bug fixes.

This commit is contained in:
2026-08-31 12:56:14 +01:00
parent c0f9c6a234
commit 569b69263a
11 changed files with 328 additions and 43 deletions
+33 -4
View File
@@ -51,13 +51,15 @@ std::filesystem::path GenericBuffer::filename() {
};
void GenericBuffer::append(BEd &ctx, vase::Shard *text, uint64_t line) {
if (!text)
return;
ctx.prev().buffername = name;
ctx.prev().start = line + 1;
ctx.prev().end = line + text->lines + 1;
root = vase::insert(&ctx.append, root, text, line);
ctx.marks.insert(name, ctx.prev().start, ctx.prev().end);
ctx.marks.insert(name, line, text->lines + 1);
if (parser)
parser->insert(root, ctx.prev().start, ctx.prev().end);
parser->insert(root, line, text->lines + 1);
state = Modified;
}
@@ -72,6 +74,33 @@ void GenericBuffer::remove(BEd &ctx, uint64_t start_line, uint64_t end_line) {
state = Modified;
}
void GenericBuffer::replace(BEd &ctx, vase::Shard *text, uint64_t start_line, uint64_t end_line) {
if (!text) {
remove(ctx, start_line, end_line);
return;
}
ctx.prev().buffername = name;
ctx.prev().start = start_line;
ctx.prev().end = start_line + text->lines;
uint64_t new_count = text->lines + 1;
uint64_t old_count = end_line - start_line + 1;
root = vase::replace(root, text, start_line, end_line);
if (parser) {
parser->begin_edit();
parser->erase(start_line, old_count);
parser->insert(start_line, new_count);
parser->end_edit(root);
}
if (new_count > old_count) {
uint64_t diff = new_count - old_count;
ctx.marks.insert(name, end_line, diff);
} else if (new_count < old_count) {
uint64_t diff = old_count - new_count;
ctx.marks.collapse(name, start_line + new_count - 1, diff);
}
state = Modified;
}
void GenericBuffer::join(BEd &ctx, uint64_t start_line, uint64_t end_line) {
root = vase::join(root, start_line, end_line);
ctx.prev().buffername = name;
@@ -107,9 +136,9 @@ void GenericBuffer::substitute(
parser->erase(line, old_lines);
}
if (new_lines) {
ctx.marks.insert(name, line, line + new_lines - 1);
ctx.marks.insert(name, line, line + new_lines);
if (parser)
parser->insert(line, line + new_lines - 1);
parser->insert(line, new_lines);
}
}
);
+26 -2
View File
@@ -54,12 +54,12 @@ std::filesystem::path ClipBuffer::filename() {
void ClipBuffer::append(BEd &ctx, vase::Shard *text, uint64_t line) {
ctx.prev().buffername = name;
ctx.prev().start = line + 1;
ctx.prev().end = line + text->lines + 1;
ctx.prev().end = line + (text ? text->lines + 1 : 0);
auto s = vase::Shard::from_command("xclip -selection clipboard -o", true);
s = vase::insert(&ctx.append, s, text, line);
clip_write(s);
vase::Shard::release(s);
ctx.marks.insert(name, ctx.prev().start, ctx.prev().end);
ctx.marks.insert(name, line, text->lines + 1);
}
void ClipBuffer::remove(BEd &ctx, uint64_t start_line, uint64_t end_line) {
@@ -73,6 +73,30 @@ void ClipBuffer::remove(BEd &ctx, uint64_t start_line, uint64_t end_line) {
ctx.marks.erase(name, start_line, end_line - start_line + 1);
}
void ClipBuffer::replace(BEd &ctx, vase::Shard *text, uint64_t start_line, uint64_t end_line) {
if (!text) {
remove(ctx, start_line, end_line);
return;
}
ctx.prev().buffername = name;
ctx.prev().start = start_line;
ctx.prev().end = start_line + text->lines;
uint64_t new_count = text->lines + 1;
uint64_t old_count = end_line - start_line + 1;
auto s = vase::Shard::from_command("xclip -selection clipboard -o", true);
s = vase::replace(s, text, start_line, end_line);
clip_write(s);
vase::Shard::release(s);
if (new_count > old_count) {
uint64_t diff = new_count - old_count;
ctx.marks.insert(name, end_line, diff);
} else if (new_count < old_count) {
uint64_t diff = old_count - new_count;
ctx.marks.collapse(name, start_line + new_count - 1, diff);
}
state = Modified;
}
void ClipBuffer::join(BEd &ctx, uint64_t start_line, uint64_t end_line) {
auto s = vase::Shard::from_command("xclip -selection clipboard -o", true);
s = vase::join(s, start_line, end_line);