diff --git a/Cargo.lock b/Cargo.lock index d2afcda..29f7e01 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -568,7 +568,7 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hexapoda" -version = "0.2.2" +version = "0.2.3" dependencies = [ "clap", "clap_complete", diff --git a/Cargo.toml b/Cargo.toml index ad48337..9415fbe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "hexapoda" # if run manually, CI will check for the string "ain" (lol), so here you go :) -version = "0.2.2" +version = "0.2.3" description = "a colorful modal hex editor" repository = "https://github.com/simonomi/hexapoda" keywords = ["cli", "tui", "hex", "tool", "editor"] diff --git a/export config.swift b/export config.swift index da69b01..2896df8 100755 --- a/export config.swift +++ b/export config.swift @@ -29,6 +29,11 @@ func camelCaseToSnakeCase(_ string: Substring) -> String { return output } +let cargoTOMLPath = URL(filePath: "Cargo.toml") +let cargoTOML = try String(contentsOf: cargoTOMLPath, encoding: .utf8) + +let versionNumber = cargoTOML.matches(of: #/version = "(?'number'[\d\.]+)"/#).first!.output.number + let defaultConfigPath = URL(filePath: "src/config/default.rs") let lines = try String(contentsOf: defaultConfigPath, encoding: .utf8) @@ -38,31 +43,35 @@ let lines = try String(contentsOf: defaultConfigPath, encoding: .utf8) precondition(lines.first!.contains("Mode::Normal")) +var output = """ + {%- highlight toml -%} + #:schema https://simonomi.dev/hexapoda/config/schema-v\(versionNumber).json + + + """ var mode: String? for line in lines { if let match = line.wholeMatch(of: #/.*Mode::(?'mode'\w*),.*/#) { mode = match.output.mode.lowercased() } else if line.contains("None") { - print("[\(mode!)]") + output += "[\(mode!)]\n" } else if let match = line.wholeMatch(of: #/.*PartialAction::(?'partialAction'\w*).*/#) { let partialAction = match.output.partialAction.lowercased() - print("[\(mode!).\(partialAction)]") + output += "[\(mode!).\(partialAction)]\n" } else if let match = line.wholeMatch(of: #/.*\(keypress\("(?'keypress'.*?)"\), (?'action'.*?)\.into\(\)\).*/#) { if match.output.keypress.contains(where: { !($0.isLetter || $0.isNumber) }) { - print( - "\"\(match.output.keypress)\"", - "=", - "\"\(camelCaseToSnakeCase(match.output.action))\"" - ) + output += "\"\(match.output.keypress)\" = \"\(camelCaseToSnakeCase(match.output.action))\"\n" } else { - print( - match.output.keypress, - "=", - "\"\(camelCaseToSnakeCase(match.output.action))\"" - ) + output += "\(match.output.keypress) = \"\(camelCaseToSnakeCase(match.output.action))\"\n" } } else { - print() + output += "\n" } } +output += "{%- endhighlight -%}\n" + +let outputPath = URL(filePath: "~/Documents/programming/websites/simonomi.dev/_includes/hexapoda/hexapoda v\(versionNumber).toml") +try Data(output.utf8).write(to: outputPath) + +print("wrote config to \(outputPath.path(percentEncoded: false))") diff --git a/src/app.rs b/src/app.rs index e3a5c80..4f69a1f 100644 --- a/src/app.rs +++ b/src/app.rs @@ -250,7 +250,8 @@ impl App { fn mouse_event_position(&self, mouse_event: MouseEvent) -> Option { let tab_bar_rows = usize::from(self.buffers.len() > 1); - if usize::from(mouse_event.row) - tab_bar_rows >= self.window_size.hex_rows() { + if usize::from(mouse_event.row) < tab_bar_rows || + usize::from(mouse_event.row) - tab_bar_rows >= self.window_size.hex_rows() { return None; } diff --git a/src/config/default.rs b/src/config/default.rs index 3f9d5a3..8b8c352 100644 --- a/src/config/default.rs +++ b/src/config/default.rs @@ -98,6 +98,8 @@ impl Default for Config { (keypress("l"), GotoLineEnd.into()), (keypress("g"), GotoFileStart.into()), + (keypress("i"), GotoFileStart.into()), + (keypress("k"), GotoFileEnd.into()), (keypress("p"), PreviousBuffer.into()), (keypress("n"), NextBuffer.into()), @@ -156,6 +158,7 @@ impl Default for Config { (keypress("Q"), Quit.into()), (keypress("v"), NormalMode.into()), + (keypress("escape"), NormalMode.into()), (keypress("g"), Goto.into()), (keypress("z"), View.into()), @@ -233,6 +236,8 @@ impl Default for Config { (keypress("l"), ExtendLineEnd.into()), (keypress("g"), ExtendFileStart.into()), + (keypress("i"), ExtendFileStart.into()), + (keypress("k"), ExtendFileEnd.into()), (keypress("p"), PreviousBuffer.into()), (keypress("n"), NextBuffer.into()), diff --git a/src/main.rs b/src/main.rs index 665e08b..a391161 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,34 +25,6 @@ const CHUNKS_PER_LINE: usize = BYTES_PER_LINE / BYTES_PER_CHUNK; const LINES_OF_PADDING: usize = 5; const BYTES_OF_PADDING: usize = LINES_OF_PADDING * BYTES_PER_LINE; -// TODO: -// - `go` goto entered offset -// - search -// - `/` hex, `A-/` ascii -// - if non-hex-digit typed, search ascii -// - inspector translations for varint -// - M mark at selected offset? (like Jm) -// - diffing -// - doesn't have to be anything fancy, just compare each byte 1:1 -// - sync scroll ? sync selections ?? -// - s/A-k/A-K -// - sm select marks -// - C-a/C-x -// - +/- to edit selected bytes by amount ? -// - operate on entire selection (u16/u32/etc) -// - hex or decimal ? -// - modifications -// - insert/append -// - mode -// - add to edit history when *leaving* insert mode -// - replace-and-keep-going -// - mode -// - change -// - A-r replaces with ASCII -// - jumplist -// - p -// - [/] to cycle view offset? - fn main() { let arguments = Arguments::parse(); diff --git a/todo.md b/todo.md new file mode 100644 index 0000000..298a523 --- /dev/null +++ b/todo.md @@ -0,0 +1,31 @@ +# todo +- v1.0 + - `` dismiss inspectors + - `T` Till + - click on tab to go to buffer + - `go` goto entered offset + - search + - `/` hex, `A-/` ASCII + - if non-hex-digit typed, search ASCII +- inspector translations for varint [#1](https://github.com/simonomi/hexapoda/issues/1#issue-4232822634) +- `M` mark at selected offset? (like `Jm`) +- diffing + - doesn't have to be anything fancy, just compare each byte 1:1 + - sync scroll ? sync selections ?? +- `s`/`A-k`/`A-K` + - sm select marks +- `C-a`/`C-x` +- `+`/`-` to edit selected bytes by amount ? + - operate on entire selection (u16/u32/etc) + - hex or decimal ? +- modifications + - insert/append + - mode + - add to edit history when *leaving* insert mode + - replace-and-keep-going + - mode + - change (basically `dh`) + - `p` put +- `A-r` replaces with ASCII +- jumplist (`C-o`/`C-i`) +- `[`/`]` to cycle view offset?