when a replacement is aborted mid-way (that is, the user replaced the
first nibble but not the second), the file is not modified. We should
update the buffer (that is, reload its contents from the file) to
reflect that, or the user will think the first nibble has indeed been
One day I wanted to edit my md RAID’s superblock, but my go-to hex editor at the
time (Okteta) did not want to allow me to edit more than 2 GB.
How hard can it be?
Note that all of the following are written in indicative mood, i.e. “does X”,
but they are actually meant as “should do X, and if it does not, that is a bug”.
Works with arbitrarily large files while using few resources
Infinite and persistent undo/redo (files are remembered based on their
Will not modify a file until you explicitly change from the default “READ”
mode into some other (currently “MODIFY” and “REPLACE”)
Modifications are carried out instantly (not sure if that is a feature, but
that is how it is right now)
Structure definitions through a stupidly complicated turing-complete (I know
this is a bad thing) byte code interpreter (op code list in
Tips on using it
You may want to clone
my dot-butterfly repository, build
it and and move the result into ~/.butterfly (or even better: link it) before
launching butterfly so that you have access to all of the structure definitions.
Simple status line (with different modes, i.e. “READ” and “REPLACE”)
Cursor movement (with main loop)
Additional char-column cursor
Proper commands (e.g. for goto)
Actual replacement (“REPLACE”) + Writing
(No need for buffering with infinite undo, and performance-wise, who cares.
User input is slow anyway.)
Jump stack (^T)
Infinite undo by writing modification steps into some file
Data display: u8, i8, LE/BE, … (hex in LE) – this is the scalars
structure now (use it through :struct scalars)
Structures: User should be able to define structures in JSON files – this
is considered complete when I have a usable qcow2 definition
(for this, I will need links (“this value is an offset for that value”))
Structure section folding
Do not update structure views that do not depend on the cursor position
when moving the cursor
Structure highlighting: When you click on a value, it should be
highlighted in the data stream
Be able to display the list of installed structs (this requires some way
for commands to display a lengthy output, which would be quite nice to
implement a :help also).
Proper command separation: Currently, all command logic and data is kept
in src/buffer.rs. That needs to change.
Find things: Every website has this now, so we need that, too
Overwrite unusable undo files: Instead of just aborting or doing random
things when some undo file cannot be read, we should just overwrite it
(or maybe tell the user where it is and create a new one, so if they want
to debug the issue…)
Also, allow the user to discard specific undo history (e.g. “everything
more than 1000 steps ago”)
Make some things configurable (themes, scroll length, etc.)
Proper terminfo support (for arbitrary escape sequences at least)