MCPcopy Index your code
hub / github.com/Gskartwii/teehee

github.com/Gskartwii/teehee @v0.2.8

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.2.8 ↗ · + Follow
293 symbols 768 edges 22 files 1 documented · 0%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Teehee - a modal terminal hex editor

AUR version

Inspired by Vim, Kakoune and Hiew.

Installation

Arch Linux users: The package for Arch Linux is available on AUR.

Others: Just run cargo install teehee! If you don't have rust, you can get it from rustup.rs. The application will be available as the executable teehee. More installation options may be coming in the future.

Motivation

Reverse engineers, software engineers and other IT people often need to work with binary files. Hex editors are usually the go-to tool for dealing with binary file formats when a more specialized tool isn't available. Many of the existing hex editors lack support for modal editing, which Vim/Kakoune/Emacs users will miss. Hiew supports it to an extent, but it's non-free software, and its keybinds are unintuitive. Teehee is designed to offer a native-feeling experience to Kakoune and Vim users, while also providing additional hex editing capabilities like coloured marks for regions of data and encryption/compression scripts.

Demo

asciicast

Teehee supports multiple selections, efficient selection modifying commands and various data editing operations.

Design

image

Implemented keybinds

  • hjkl for movement (press shift to extend selection instead)
    ^
< h j l >
    k
    v
  • g[hjkl] for jumping (G[hjkl] to extend selection instead)
    • h: to line start
    • l: to line end
    • k: to file start
    • j: to file end
    • <count>g jumps to offset, <count>G extends to offset
  • <C+e/y> to scroll down/up
  • ; to collapse selections to cursors
  • <a-;> (alt and ;) to swap cursor and selection end
  • <a-s> (alt and s) to split selection to multiple selections of size...
    • b: 1 byte
    • w: 2 bytes (Word)
    • d: 4 bytes (Dword)
    • q: 8 bytes (Qword)
    • o: 16 bytes (Oword)
    • n: delimited by null bytes
    • /: matching a text pattern (? for hex pattern)
  • d to delete selected data from buffer
  • i to enter insert mode at the beginning of selections (I to insert hex instead of ascii)
    • a instead of i to enter append mode instead
    • o instead of i to enter overwrite mode instead
    • c instead of i to delete selection contents, then enter insert mode
    • <c-n> to insert a null byte in ascii mode
    • <c-o> to switch between ascii and hex inserting
  • ( and ) to cycle main selection
  • <space> to keep only main selection, <a-space> to keep all selections but main
  • r<key> to replace a each selected character with the ASCII character given
    • R<digit><digit> instead of r to replace with a single hex character instead
    • r<c-n> to replace with null bytes
  • y to yank/copy selections to register "
  • p to paste register " contents from y/d/c
  • s to collapse selections to those matching a text pattern (S for hex pattern)
  • M to measure length of current main selection (in bytes)
  • u to undo, U to redo
  • : to enter command mode
    • :q to quit
    • :q! to force quit (even if buffer dirty)
    • :w to flush buffer to disk
    • :w <filename> to save buffer to named file
    • :wa to flush all buffers to disk
    • :e <filename> to open a new buffer
    • :db to close a buffer
    • :db! to close a buffer even if dirty
    • :wq to flush buffer, then quit

Entering a pattern:

  • <C-w> to insert a wildcard
  • <C-o> to switch input mode (ascii <-> hex)
  • <esc> to go back to normal mode
  • <enter> to accept pattern
  • arrow keys, <backspace> and <delete> also supported

Counts: * The following commands maybe prefixed by a count: * Movement (hjkl and HJKL) * Selection modification (()<space><a-space>) * Jump to offset (g and G) * Paste (p) * (In split mode) bwdqon * Counts are inputted by typing digits 0-9 (in hex mode, 0-f). * x switches between hex and decimal mode. * Note that a-f may shadow some keys, so switch out of hex mode before running a command. * Example: y5p: yank the selection and paste it 5 times. * Example: 50l: Move 50 bytes to the right. * Example: x500g: Jump to offset 0x500 * Example: <a-s>x12xb: Split selection into parts of 0x12 bytes.

Releases

Releases are signed with the following PGP key: 9330E5D6861507BEFBF1893347E208E66179DC94. The source code can be found on the GitHub releases page, along with the signature of the source code tgz.

Extension points exported contracts — how you extend this code

Mode (Interface)
A mode should OWN all data related to it. Hence we bound it by 'static. [9 implementers]
src/modes/mode.rs
StatusLinePrompter (Interface)
(no doc) [2 implementers]
src/hex_view/view.rs
SearchAcceptor (Interface)
(no doc) [2 implementers]
src/modes/search.rs

Core symbols most depended-on inside this repo

len
called by 92
src/selection.rs
iter
called by 35
src/buffer.rs
is_empty
called by 33
src/byte_rope.rs
apply_delta
called by 31
src/buffer.rs
draw
called by 24
src/hex_view/mod.rs
max
called by 23
src/selection.rs
min
called by 23
src/selection.rs
current
called by 19
src/buffer.rs

Shape

Method 199
Function 46
Class 29
Enum 16
Interface 3

Languages

Rust100%

Modules by API surface

src/selection.rs43 symbols
src/hex_view/view.rs34 symbols
src/buffer.rs32 symbols
src/byte_rope.rs25 symbols
src/hex_view/mod.rs23 symbols
src/history.rs20 symbols
src/modes/command.rs17 symbols
src/modes/search.rs16 symbols
src/hex_view/byte_properties.rs11 symbols
src/modes/insert.rs10 symbols
src/operations.rs8 symbols
src/modes/split.rs8 symbols

For agents

$ claude mcp add teehee \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page