summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Buffer.zig28
-rw-r--r--src/Config.zig6
-rw-r--r--src/Editor.zig11
-rw-r--r--src/Row.zig29
-rw-r--r--src/StringBuilder.zig2
-rw-r--r--src/Syntax.zig5
-rw-r--r--src/Syntax/makefile.zig2
-rw-r--r--src/Syntax/zig.zig2
-rw-r--r--src/key.zig2
-rw-r--r--src/key_state.zig2
10 files changed, 42 insertions, 47 deletions
diff --git a/src/Buffer.zig b/src/Buffer.zig
index 0416fda..d7f051d 100644
--- a/src/Buffer.zig
+++ b/src/Buffer.zig
@@ -38,7 +38,7 @@ pub fn init(allocator: Allocator, name: []const u8) !Buffer {
38 // TODO: buffer-specific config support 38 // TODO: buffer-specific config support
39 var config = try Config.readConfig(allocator); 39 var config = try Config.readConfig(allocator);
40 40
41 return Buffer { 41 return Buffer{
42 .allocator = allocator, 42 .allocator = allocator,
43 43
44 .name = name_owned, 44 .name = name_owned,
@@ -193,7 +193,7 @@ pub fn drawRows(self: Buffer, writer: anytype, screenrows: usize, screencols: us
193 } 193 }
194 } 194 }
195 } else if (self.rows.items.len == 0 and y == screenrows / 3) { 195 } else if (self.rows.items.len == 0 and y == screenrows / 3) {
196 const welcome_data = try std.fmt.allocPrint(self.allocator, "ES -- version {}", .{ es_config.es_version }); 196 const welcome_data = try std.fmt.allocPrint(self.allocator, "ES -- version {}", .{es_config.es_version});
197 defer self.allocator.free(welcome_data); 197 defer self.allocator.free(welcome_data);
198 var welcome = welcome_data; 198 var welcome = welcome_data;
199 if (welcome.len > screencols - 1) { 199 if (welcome.len > screencols - 1) {
@@ -201,7 +201,7 @@ pub fn drawRows(self: Buffer, writer: anytype, screenrows: usize, screencols: us
201 } 201 }
202 202
203 const padding = (screencols - welcome.len - 1) / 2; 203 const padding = (screencols - welcome.len - 1) / 2;
204 try writer.print("{s}~{s}", .{Highlight.line_no.asString(), Highlight.normal.asString()}); 204 try writer.print("{s}~{s}", .{ Highlight.line_no.asString(), Highlight.normal.asString() });
205 try printWithLeftPadding(self.allocator, writer, "{s}", welcome.len + padding, ' ', .{welcome}); 205 try printWithLeftPadding(self.allocator, writer, "{s}", welcome.len + padding, ' ', .{welcome});
206 } else { 206 } else {
207 try writer.print("{s}~", .{Highlight.line_no.asString()}); 207 try writer.print("{s}~", .{Highlight.line_no.asString()});
@@ -225,7 +225,7 @@ pub fn drawStatusBar(self: Buffer, writer: anytype, screencols: usize) !void {
225 else 225 else
226 @as([]const u8, ""); 226 @as([]const u8, "");
227 227
228 var lbuf = try std.fmt.allocPrint(self.allocator, "{s}{s}", .{name, modified}); 228 var lbuf = try std.fmt.allocPrint(self.allocator, "{s}{s}", .{ name, modified });
229 defer self.allocator.free(lbuf); 229 defer self.allocator.free(lbuf);
230 230
231 var rbuf = try std.fmt.allocPrint(self.allocator, " {s} | {}/{}", .{ 231 var rbuf = try std.fmt.allocPrint(self.allocator, " {s} | {}/{}", .{
@@ -263,7 +263,7 @@ pub fn goToLine(self: *Buffer, editor: *Editor) !void {
263 defer editor.allocator.free(line_str); 263 defer editor.allocator.free(line_str);
264 264
265 const line = std.fmt.parseUnsigned(usize, line_str, 0) catch |err| { 265 const line = std.fmt.parseUnsigned(usize, line_str, 0) catch |err| {
266 try editor.setStatusMessage("Couldn't parse '{s}' as an integer: {}", .{line_str, err}); 266 try editor.setStatusMessage("Couldn't parse '{s}' as an integer: {}", .{ line_str, err });
267 return; 267 return;
268 }; 268 };
269 269
@@ -419,34 +419,34 @@ pub fn save(self: *Buffer, editor: *Editor) !void {
419 // TODO: Add a config value for this 419 // TODO: Add a config value for this
420 try self.cleanWhiteSpace(); 420 try self.cleanWhiteSpace();
421 421
422 const tmpname = try std.fmt.allocPrint(self.allocator, "{s}~{}", .{self.name, std.time.milliTimestamp()}); 422 const tmpname = try std.fmt.allocPrint(self.allocator, "{s}~{}", .{ self.name, std.time.milliTimestamp() });
423 defer self.allocator.free(tmpname); 423 defer self.allocator.free(tmpname);
424 424
425 const tmpfile = std.fs.cwd().createFile(tmpname, .{.truncate = true}) catch |err| { 425 const tmpfile = std.fs.cwd().createFile(tmpname, .{ .truncate = true }) catch |err| {
426 try editor.setStatusMessage("Cannot open tempfile '{s}' for writing: {}", .{tmpname, err}); 426 try editor.setStatusMessage("Cannot open tempfile '{s}' for writing: {}", .{ tmpname, err });
427 return; 427 return;
428 }; 428 };
429 defer tmpfile.close(); 429 defer tmpfile.close();
430 430
431 const stat = statFile(self.name) catch |err| { 431 const stat = statFile(self.name) catch |err| {
432 try editor.setStatusMessage("Couldn't stat file '{s}': {}", .{self.name, err}); 432 try editor.setStatusMessage("Couldn't stat file '{s}': {}", .{ self.name, err });
433 return; 433 return;
434 }; 434 };
435 435
436 tmpfile.chmod(stat.mode) catch |err| { 436 tmpfile.chmod(stat.mode) catch |err| {
437 try editor.setStatusMessage("Couldn't chmod tempfile '{s}': {}", .{tmpname, err}); 437 try editor.setStatusMessage("Couldn't chmod tempfile '{s}': {}", .{ tmpname, err });
438 return; 438 return;
439 }; 439 };
440 440
441 // TODO: chown 441 // TODO: chown
442 442
443 self.writeToFile(tmpfile) catch |err| { 443 self.writeToFile(tmpfile) catch |err| {
444 try editor.setStatusMessage("Couldn't write to tempfile '{s}': {}", .{tmpname, err}); 444 try editor.setStatusMessage("Couldn't write to tempfile '{s}': {}", .{ tmpname, err });
445 return; 445 return;
446 }; 446 };
447 447
448 std.fs.cwd().rename(tmpname, self.name) catch |err| { 448 std.fs.cwd().rename(tmpname, self.name) catch |err| {
449 try editor.setStatusMessage("Couldn't move '{s}' to '{s}': {}", .{tmpname, self.name, err}); 449 try editor.setStatusMessage("Couldn't move '{s}' to '{s}': {}", .{ tmpname, self.name, err });
450 return; 450 return;
451 }; 451 };
452 452
@@ -480,9 +480,7 @@ pub fn selectSyntaxHighlighting(self: *Buffer) !void {
480 for (Syntax.database) |syntax| { 480 for (Syntax.database) |syntax| {
481 for (syntax.filematch) |filematch| { 481 for (syntax.filematch) |filematch| {
482 const is_ext = filematch[0] == '.'; 482 const is_ext = filematch[0] == '.';
483 if ((is_ext and ext != null and std.mem.eql(u8, ext.?, filematch)) 483 if ((is_ext and ext != null and std.mem.eql(u8, ext.?, filematch)) or (!is_ext and std.mem.eql(u8, self.name, filematch))) {
484 or (!is_ext and std.mem.eql(u8, self.name, filematch))
485 ) {
486 self.syntax = syntax; 484 self.syntax = syntax;
487 485
488 for (self.rows.items) |*row| { 486 for (self.rows.items) |*row| {
diff --git a/src/Config.zig b/src/Config.zig
index b8b45a5..1f11b65 100644
--- a/src/Config.zig
+++ b/src/Config.zig
@@ -13,7 +13,7 @@ page_overlap: usize = 2,
13tab_stop: usize = 8, 13tab_stop: usize = 8,
14 14
15pub fn readConfig(allocator: Allocator) !Config { 15pub fn readConfig(allocator: Allocator) !Config {
16 var config = Config {}; 16 var config = Config{};
17 17
18 var env_map = try std.process.getEnvMap(allocator); 18 var env_map = try std.process.getEnvMap(allocator);
19 defer env_map.deinit(); 19 defer env_map.deinit();
@@ -32,7 +32,7 @@ pub fn readConfig(allocator: Allocator) !Config {
32 } else { 32 } else {
33 // TODO: Maybe return an error instead of .? 33 // TODO: Maybe return an error instead of .?
34 const home = env_map.get("HOME").?; 34 const home = env_map.get("HOME").?;
35 const home_config = try std.fs.path.join(allocator, &.{home, ".config"}); 35 const home_config = try std.fs.path.join(allocator, &.{ home, ".config" });
36 defer allocator.free(home_config); 36 defer allocator.free(home_config);
37 37
38 try readConfigInBaseDir(allocator, &config, home_config); 38 try readConfigInBaseDir(allocator, &config, home_config);
@@ -42,7 +42,7 @@ pub fn readConfig(allocator: Allocator) !Config {
42} 42}
43 43
44fn readConfigInBaseDir(allocator: Allocator, config: *Config, base_dir: []const u8) !void { 44fn readConfigInBaseDir(allocator: Allocator, config: *Config, base_dir: []const u8) !void {
45 const filename = try std.fs.path.join(allocator, &.{base_dir, config_path}); 45 const filename = try std.fs.path.join(allocator, &.{ base_dir, config_path });
46 defer allocator.free(filename); 46 defer allocator.free(filename);
47 47
48 const file = std.fs.openFileAbsolute(filename, .{ .read = true }) catch |err| switch (err) { 48 const file = std.fs.openFileAbsolute(filename, .{ .read = true }) catch |err| switch (err) {
diff --git a/src/Editor.zig b/src/Editor.zig
index eecbaa7..487c5ff 100644
--- a/src/Editor.zig
+++ b/src/Editor.zig
@@ -188,7 +188,7 @@ pub fn promptEx(
188 defer buf.deinit(); 188 defer buf.deinit();
189 189
190 while (true) { 190 while (true) {
191 try self.setStatusMessage("{s}: {s}", .{prompt_str, buf.items}); 191 try self.setStatusMessage("{s}: {s}", .{ prompt_str, buf.items });
192 try self.refreshScreen(); 192 try self.refreshScreen();
193 193
194 // TODO: Navigation 194 // TODO: Navigation
@@ -217,7 +217,7 @@ pub fn promptEx(
217 if (std.ascii.isSpace(key_char) or std.ascii.isGraph(key_char)) { 217 if (std.ascii.isSpace(key_char) or std.ascii.isGraph(key_char)) {
218 try buf.append(key_char); 218 try buf.append(key_char);
219 } 219 }
220 } // else ?? 220 }, // else ??
221 } 221 }
222 222
223 if (callback) |cb| { 223 if (callback) |cb| {
@@ -227,7 +227,7 @@ pub fn promptEx(
227} 227}
228 228
229pub fn PromptCallback(comptime Data: type, comptime Error: type) type { 229pub fn PromptCallback(comptime Data: type, comptime Error: type) type {
230 return fn(*Editor, []const u8, Key, Data) Error!void; 230 return fn (*Editor, []const u8, Key, Data) Error!void;
231} 231}
232 232
233pub fn promptYN(self: *Editor, prompt_str: []const u8) !bool { 233pub fn promptYN(self: *Editor, prompt_str: []const u8) !bool {
@@ -237,8 +237,7 @@ pub fn promptYN(self: *Editor, prompt_str: []const u8) !bool {
237 var response = try self.prompt(full_prompt); 237 var response = try self.prompt(full_prompt);
238 defer if (response) |str| self.allocator.free(str); 238 defer if (response) |str| self.allocator.free(str);
239 // TODO: This can be improved 239 // TODO: This can be improved
240 while (response == null 240 while (response == null or (response.?[0] != 'y' and response.?[0] != 'Y' and response.?[0] != 'n' and response.?[0] != 'N')) {
241 or (response.?[0] != 'y' and response.?[0] != 'Y' and response.?[0] != 'n' and response.?[0] != 'N')) {
242 if (response) |str| self.allocator.free(str); 241 if (response) |str| self.allocator.free(str);
243 response = try self.prompt(full_prompt); 242 response = try self.prompt(full_prompt);
244 } 243 }
@@ -342,7 +341,7 @@ fn getCursorPosition(row: *usize, col: *usize) !void {
342 try std_out.writeAll("\x1b[6n\r\n"); 341 try std_out.writeAll("\x1b[6n\r\n");
343 342
344 const std_in = std.io.getStdIn().reader(); 343 const std_in = std.io.getStdIn().reader();
345 var buf = [_]u8 { undefined } ** 32; 344 var buf = [_]u8{undefined} ** 32;
346 var response = std_in.readUntilDelimiter(&buf, 'R') catch |err| switch (err) { 345 var response = std_in.readUntilDelimiter(&buf, 'R') catch |err| switch (err) {
347 error.EndOfStream => return error.MisformedTerminalResponse, 346 error.EndOfStream => return error.MisformedTerminalResponse,
348 error.StreamTooLong => return error.MisformedTerminalResponse, 347 error.StreamTooLong => return error.MisformedTerminalResponse,
diff --git a/src/Row.zig b/src/Row.zig
index 633e338..a542160 100644
--- a/src/Row.zig
+++ b/src/Row.zig
@@ -162,7 +162,7 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void {
162 if (syntax.singleline_comment_start) |scs| { 162 if (syntax.singleline_comment_start) |scs| {
163 std.debug.assert(scs.len != 0); 163 std.debug.assert(scs.len != 0);
164 if (curr_str_quote == null and !in_comment and scs.len + i <= self.rdata.items.len) { 164 if (curr_str_quote == null and !in_comment and scs.len + i <= self.rdata.items.len) {
165 if (std.mem.eql(u8, scs, self.rdata.items[i .. (i + scs.len)])) { 165 if (std.mem.eql(u8, scs, self.rdata.items[i..(i + scs.len)])) {
166 std.mem.set(Highlight, self.hldata.items[i..], .comment); 166 std.mem.set(Highlight, self.hldata.items[i..], .comment);
167 break; 167 break;
168 } 168 }
@@ -176,10 +176,8 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void {
176 if (curr_str_quote == null) { 176 if (curr_str_quote == null) {
177 if (in_comment) { 177 if (in_comment) {
178 self.hldata.items[i] = .comment_ml; 178 self.hldata.items[i] = .comment_ml;
179 if (mce.len + i <= self.rdata.items.len 179 if (mce.len + i <= self.rdata.items.len and std.mem.eql(u8, mce, self.rdata.items[i..(i + mce.len)])) {
180 and std.mem.eql(u8, mce, self.rdata.items[i .. (i + mce.len)]) 180 std.mem.set(Highlight, self.hldata.items[i..(i + mce.len)], .comment_ml);
181 ) {
182 std.mem.set(Highlight, self.hldata.items[i .. (i + mce.len)], .comment_ml);
183 i += mce.len; 181 i += mce.len;
184 in_comment = false; 182 in_comment = false;
185 after_sep = true; 183 after_sep = true;
@@ -187,15 +185,13 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void {
187 i += 1; 185 i += 1;
188 continue; 186 continue;
189 } 187 }
190 } else if (mcs.len + i <= self.rdata.items.len 188 } else if (mcs.len + i <= self.rdata.items.len and std.mem.eql(u8, mcs, self.rdata.items[i..(i + mcs.len)])) {
191 and std.mem.eql(u8, mcs, self.rdata.items[i .. (i + mcs.len)])) { 189 std.mem.set(Highlight, self.hldata.items[i..(i + mcs.len)], .comment_ml);
192 std.mem.set(Highlight, self.hldata.items[i .. (i + mcs.len)], .comment_ml);
193 i += mcs.len; 190 i += mcs.len;
194 in_comment = true; 191 in_comment = true;
195 continue; 192 continue;
196 } 193 }
197 } 194 }
198
199 } 195 }
200 } 196 }
201 197
@@ -227,8 +223,7 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void {
227 } 223 }
228 224
229 if (syntax.flags.hl_numbers) { 225 if (syntax.flags.hl_numbers) {
230 if ((std.ascii.isDigit(c) and (after_sep or prev_hl == .number)) 226 if ((std.ascii.isDigit(c) and (after_sep or prev_hl == .number)) or (c == '.' and prev_hl == .number)) {
231 or (c == '.' and prev_hl == .number)) {
232 after_sep = false; 227 after_sep = false;
233 self.hldata.items[i] = .number; 228 self.hldata.items[i] = .number;
234 i += 1; 229 i += 1;
@@ -238,10 +233,8 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void {
238 233
239 if (after_sep) { 234 if (after_sep) {
240 for (kw1) |kw| { 235 for (kw1) |kw| {
241 if (i + kw.len <= self.rdata.items.len 236 if (i + kw.len <= self.rdata.items.len and std.mem.eql(u8, kw, self.rdata.items[i..(i + kw.len)]) and (i + kw.len == self.rdata.items.len or syntax.isSeparator(self.rdata.items[i + kw.len]))) {
242 and std.mem.eql(u8, kw, self.rdata.items[i .. (i + kw.len)]) 237 std.mem.set(Highlight, self.hldata.items[i..(i + kw.len)], .keyword1);
243 and (i + kw.len == self.rdata.items.len or syntax.isSeparator(self.rdata.items[i + kw.len]))) {
244 std.mem.set(Highlight, self.hldata.items[i .. (i + kw.len)], .keyword1);
245 i += kw.len; 238 i += kw.len;
246 after_sep = false; 239 after_sep = false;
247 continue :main_loop; 240 continue :main_loop;
@@ -249,10 +242,8 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void {
249 } 242 }
250 243
251 for (kw2) |kw| { 244 for (kw2) |kw| {
252 if (i + kw.len <= self.rdata.items.len 245 if (i + kw.len <= self.rdata.items.len and std.mem.eql(u8, kw, self.rdata.items[i..(i + kw.len)]) and (i + kw.len == self.rdata.items.len or syntax.isSeparator(self.rdata.items[i + kw.len]))) {
253 and std.mem.eql(u8, kw, self.rdata.items[i .. (i + kw.len)]) 246 std.mem.set(Highlight, self.hldata.items[i..(i + kw.len)], .keyword2);
254 and (i + kw.len == self.rdata.items.len or syntax.isSeparator(self.rdata.items[i + kw.len]))) {
255 std.mem.set(Highlight, self.hldata.items[i .. (i + kw.len)], .keyword2);
256 i += kw.len; 247 i += kw.len;
257 after_sep = false; 248 after_sep = false;
258 continue :main_loop; 249 continue :main_loop;
diff --git a/src/StringBuilder.zig b/src/StringBuilder.zig
index 632b1b3..a37aee6 100644
--- a/src/StringBuilder.zig
+++ b/src/StringBuilder.zig
@@ -36,7 +36,7 @@ pub fn toOwnedSlice(self: StringBuilder) []u8 {
36} 36}
37 37
38pub fn writer(self: *StringBuilder) Writer { 38pub fn writer(self: *StringBuilder) Writer {
39 return Writer { .context = self }; 39 return Writer{ .context = self };
40} 40}
41 41
42fn writeFn(self: *StringBuilder, chars: []const u8) Error!usize { 42fn writeFn(self: *StringBuilder, chars: []const u8) Error!usize {
diff --git a/src/Syntax.zig b/src/Syntax.zig
index ce3f432..f29c7fc 100644
--- a/src/Syntax.zig
+++ b/src/Syntax.zig
@@ -5,7 +5,10 @@ const std = @import("std");
5 5
6const Syntax = @This(); 6const Syntax = @This();
7 7
8pub const database = [_]Syntax{makefile.syntax, zig.syntax}; 8pub const database = [_]Syntax{
9 makefile.syntax,
10 zig.syntax,
11};
9 12
10pub const Flags = struct { 13pub const Flags = struct {
11 hl_numbers: bool = false, 14 hl_numbers: bool = false,
diff --git a/src/Syntax/makefile.zig b/src/Syntax/makefile.zig
index 4f73a2c..3a936e8 100644
--- a/src/Syntax/makefile.zig
+++ b/src/Syntax/makefile.zig
@@ -1,3 +1,5 @@
1// Please don't zig fmt this
2
1const Syntax = @import("../Syntax.zig"); 3const Syntax = @import("../Syntax.zig");
2 4
3pub const syntax = Syntax{ 5pub const syntax = Syntax{
diff --git a/src/Syntax/zig.zig b/src/Syntax/zig.zig
index 653fb1b..d0bf60c 100644
--- a/src/Syntax/zig.zig
+++ b/src/Syntax/zig.zig
@@ -1,3 +1,5 @@
1// Please don't zig fmt this
2
1const std = @import("std"); 3const std = @import("std");
2 4
3const Syntax = @import("../Syntax.zig"); 5const Syntax = @import("../Syntax.zig");
diff --git a/src/key.zig b/src/key.zig
index 1a68ebb..3a007fb 100644
--- a/src/key.zig
+++ b/src/key.zig
@@ -79,7 +79,7 @@ pub const Key = enum(u16) {
79 const key_int = @enumToInt(key); 79 const key_int = @enumToInt(key);
80 if (key_int < @enumToInt(Key.space)) { 80 if (key_int < @enumToInt(Key.space)) {
81 const ch = std.ascii.toLower(@intCast(u8, key_int + 0x40)); 81 const ch = std.ascii.toLower(@intCast(u8, key_int + 0x40));
82 const buf = [_]u8{'C', '-', ch}; 82 const buf = [_]u8{ 'C', '-', ch };
83 return std.fmt.formatBuf(&buf, options, writer); 83 return std.fmt.formatBuf(&buf, options, writer);
84 } else if (key_int < @enumToInt(Key.meta_nil)) { 84 } else if (key_int < @enumToInt(Key.meta_nil)) {
85 const buf = [_]u8{@intCast(u8, key_int)}; 85 const buf = [_]u8{@intCast(u8, key_int)};
diff --git a/src/key_state.zig b/src/key_state.zig
index 19177cf..49adbf8 100644
--- a/src/key_state.zig
+++ b/src/key_state.zig
@@ -16,7 +16,7 @@ pub const Error = error{
16 std.fs.File.ReadError || 16 std.fs.File.ReadError ||
17 std.fs.File.WriteError || 17 std.fs.File.WriteError ||
18 std.os.SchedYieldError; 18 std.os.SchedYieldError;
19pub const KeyState = fn(*Editor, *Buffer, Key) Error!void; 19pub const KeyState = fn (*Editor, *Buffer, Key) Error!void;
20 20
21pub fn mgState(editor: *Editor, buf: *Buffer, key: Key) Error!void { 21pub fn mgState(editor: *Editor, buf: *Buffer, key: Key) Error!void {
22 editor.current_state = defaultState; 22 editor.current_state = defaultState;