
# dz6
vim-like hexadecimal editor
## Features
* Fast, even when editing large files
* Runs in the terminal / Text User Interface (TUI)
* vim-like key bindings
* Edit in hex or ASCII
* String list with regex filtering
* Multiple smart ways to navigate through a file
* Find strings and hex bytes
* Multiplatform
* Open source
## Screenshot

## Download
You can install **dz6** with Cargo using the Rust package manager. Follow the instructions [here](https://rust-lang.org/tools/install/) to install **cargo**. Then, use
cargo install dz6
Alternatively, download the [release](https://github.com/mentebinaria/dz6/releases) package for your system.
## Usage
```
Usage: dz6 [OPTIONS] <FILE>
Arguments:
<FILE> File to open
Options:
-o, --offset <OFFSET> Initial cursor offset (hex default; `t` suffix = decimal) [default: 0]
-r, --readonly Set read-only mode
-h, --help Print help
-V, --version Print version
```
Once you load a file in **dz6**, you can use the commands below.
### Global key bindings
| `Enter` | Switch views |
| `F1` | Help |
| `Alt+l` | Open log window |
| `:` | Open command bar | See [Commands](#commands) |
#### Commands
| <number> | Go to offset | hex default; `t` suffix = decimal; `+` prefix = incremental jump |
| q | Quit | |
### Hex view
| Arrow keys | Navigation | vim-like `h`, `j`, `k`, `l` also work |
| `w` `d` `q` | Advance by a word (2 bytes), a dword (4 bytes), or a qword (8 bytes), respectively | Use the capital letters `W`, `D`, and `Q` to move backwards |
| `o` | Go to the next other byte, meaning the next byte that differs from the one under the cursor | `O` goes backwards |
| `Home` or `0` | Set the cursor to the beginning of the current line | |
| `End` or `$` | Set the cursor to the end of the current line | |
| `Ctrl+Home` or `G` | Go to the first offset | |
| `Ctrl+End` or `Shift+G` | Go to the last offset in the file | |
| `Page Down` | Move down one page | A page has 1KB by default |
| `Page Up` | Move up one page | |
| `r` | Enter [replace mode](#hex-replace-mode) | |
| `z` | Enter replace mode and set the byte under the cursor zero | |
| `Ctrl+a` | Enter replace mode and increment byte under the cursor | |
| `Ctrl+x` | Enter replace mode and decrement byte under the cursor | |
| `/` | Search | Search the entire file. `Tab` cycles between ASCII and hex search |
| `n` | Search next | |
| `s` | Open [Strings](#strings) window | |
| `Backspace` | Go to the previously visited offset | This is useful after a Go to command, for example |
| `+` | Add current offset to bookmarks | |
| `-` | Go to the last added bookmark | |
| `Alt+1..8` | Go to bookmark | |
| `Alt+-` | Remove the last added bookmark | The cursor must be at the bookmarked offset |
| `Alt+0` | Clear bookmarks | |
| `Alt+h` | Toggle byte highlight | |
| `;` | Add a comment to the selected offset | |
| `Ant+n` | Open [Names](#names) window. Added comments will be there. | |
| `?` | Open [Calculator](#calculator) | |
#### Hex replace mode
| Arrow keys | Navigation | vim-like `h`, `j`, `k`, `l` also work |
| `Backspace` | The same as navigating left | |
| `z` | Set the byte to zero | |
| `Ctrl+a` | Increment byte | |
| `Ctrl+x` | Decrement byte | |
| `Enter` | Save changes to file | |
| `Esc` | Cancel changes | |
| `Tab` | Cycle through hex and ASCII dump to edit the file in ASCII | |
| `T` | Truncate the file at the selected offset | Be aware this can't be undone |
#### Names
| Arrow keys | Navigation | Up/Down only |
| `f` | Filter names using a regular expression | |
| `D` | Delete all names | |
| `Esc` | Close | |
| `End` | Select the last item shown | |
| `Ctrl+End` | Select the last item on the list | |
| `Home` | Select the first item shown | |
| `Ctrl+Home` | Select the first item on the list | |
| `Page Down` | Go down one page | |
| `Page Up` | Go up one page | |
| `Enter` | Follow the name in hex dump and close the window | |
#### Strings
| Arrow keys | Navigation | Up/Down only |
| `f` | Filter strings using a regular expression | |
| `R` | Re-read strings from file | Useful if you changed the file |
| `Esc` | Close | |
| `End` | Select the last item shown | |
| `Ctrl+End` | Select the last item on the list | |
| `Home` | Select the first item shown | |
| `Ctrl+Home` | Select the first item on the list | |
| `Page Down` | Go down one page | |
| `Page Up` | Go up one page | |
| `Enter` | Follow the string in hex dump and close the window | |
#### Calculator
64-bit calculator. Default base is decimal, but you can prefix hex numbers with 0x. Pre-defined variables:
| `@x` | Signed value under cursor | `x` is `b` (byte), `w` (word), `d` (dword) or `q` (qword) |
| `@X` | Unsigned value under cursor | `X` is `B` (byte), `W` (word), `D` (dword) or `Q` (qword) |
| `@o` | Current offset | dword on 32-bit systems; qword on 64 |
| `@O` | Previously visited offset | same as above |
Use the up and down arrow keys to navigate through the history.
### Text view
> This view hasn’t received much attention yet. Things are still pretty broken there.
| `e` | Open encoding selection dialog |
## FAQ
**1. I'm on a Mac. How am I supposed to use `Alt` key?!**
iTerm2 users: go to `Settings → Profiles → (your profile) → Keys` and set the `Left Option key` to `Esc+`. This will make the `Option` key work like `Alt`.
**2. Do all vim commands work in dz6?**
No. Some key bindings behave similarly, but dz6 is not meant to be 100% compatible with vim. For example, `o` in dz6 moves to the next other byte, while the same key in vim opens a new line below the current one.
**3. Is dz6 stable yet**
No. Stability is expected only when we release v1.0.0. Until then, things **will** certainly change.
## Motivation
After changing jobs and returning to Linux, I wanted something similar to [Hiew](https://hiew.io) that I could run on my machine. Since I like vim, I tried to combine features from both editors in dz6. VSCode, IDA, x64dbg, and [Hex-Patch](https://etto48.github.io/HexPatch/) also served as inspiration. Hats off to the authors of these great tools!