A text editor in ≤1024 lines of code, written in Rust
Kibi: A text editor in ≤1024 lines of code, written in Rust
A configurable text editor with UTF-8 support, incremental search, syntax highlighting, line numbers and more, written in less than 1024 lines[^1] of Rust with minimal dependencies.
[^1]: Counted per platform, excluding tests and Clippy directives, see count_loc
Kibi is compatible with Linux, macOS, Windows 10[^2], and WASI.
[^2]: Kibi requires the terminal to support ANSI escape sequences. Windows 10 version 1703 (Creators Update, April 2017) and above are supported.
This project is inspired by kilo, a text editor written in C. See comparison below for a list of additional features.
Contributions are welcome! Be careful to stay below the 1024-line limit...
Table of contents
- With cargo - Arch User Repository (Arch Linux) - Android (with Termux) - Fedora/CentOS - NetBSD - Flatpak - Keyboard shortcuts - Configuration - Global configuration - Syntax highlightingInstallation
With cargo
You can install Kibi with cargo:
cargo install kibi
Syntax highlighting configuration files are available in the syntax.d directory of this repository. They need to be placed in one of the configuration directories mentioned in the Configuration/Syntax Highlighting section.
For instance:
cd ~/repos
git clone https://github.com/ilai-deutel/kibi.git
mkdir -p ~/.local/share/kibi/
ln -sr ./kibi/syntax.d ~/.local/share/kibi/syntax.d
Arch User Repository (Arch Linux)
3 packages are available on the AUR: kibi and kibi-bin. kibi-git.
Installation instructions:
kibi
- Installation with an AUR helper, for instance using
paru:
paru -Syu kibi
- Install manually with
makepkg:
git clone https://aur.archlinux.org/kibi.git
cd kibi
makepkg -si
Installation instructions:
kibi-bin
- Installation with an AUR helper, for instance using
paru:
paru -Syu --pgpfetch kibi-bin
- Install manually with
makepkg:
gpg --keyserver keys.openpgp.org --recv-keys 102588418FF7E165696490A206E8A973494808A2
git clone https://aur.archlinux.org/kibi-bin.git
cd kibi-bin
makepkg -si
Installation instructions:
kibi-git
- Installation with an AUR helper, for instance using
paru:
paru -Syu kibi-git
- Install manually with
makepkg:
git clone https://aur.archlinux.org/kibi-git.git
cd kibi-git
makepkg -si
Android (with Termux)
Kibi is available as a Termux package.
Installation instructions
- Install Termux:
- Install Kibi within Termux:
pkg install kibi
Fedora/CentOS
The package is available in COPR as atim/kibi.
Installation instructions
sudo dnf copr enable atim/kibi -y
sudo dnf install kibi
NetBSD
Kibi is available from the official repos.
Installation instructions
Install using:
pkgin install kibi
or build from source:
cd /usr/pkgsrc/editors/kibi
make install
Flatpak
Kibi is available on Flathub.
Command line instructions
The flatpak can be installed using:
flatpak install flathub com.github.ilai_deutel.kibi
You can then run Kibi with:
flatpak run com.github.ilai_deutel.kibi
Usage
kibi # Start an new text buffer
kibi <file path> # Open a file
kibi --version # Print version information and exit
Keyboard shortcuts
| Keyboard shortcut | Description | | ------------------------------ | ------------------------------------------------------------- | | Ctrl + F | Incremental search; use arrows to navigate | | Ctrl + S | Save the buffer to the current file, or specify the file path | | Ctrl + G | Go to <line number>[:<column number>] position | | Ctrl + Q | Quit | | Ctrl + D | Duplicate the current row | | Ctrl + E | Execute an external command and paste its output | | Ctrl + R | Remove an entire line | | Ctrl + C | Copies the entire line | | Ctrl + X | Cuts the entire line | | Ctrl + V | Will paste the copied line | | Ctrl + ← | Moves cursor to previous word | | Ctrl + → | Moves cursor to next word | | Ctrl + / | Comment or uncomment the current line |
Configuration
Global configuration
Kibi can be configured using a configuration file. It must follow this format:
# The size of a tab. Must be > 0.
tab_stop=4
The number of confirmations needed before quitting, when changes have been
made since the file was last changed.
quit_times=2
The duration for which messages are shown in the status bar, in seconds.
message_duration=3
Whether to show line numbers.
showlinenumbers=true
The location of these files is described below.
Linux / macOS
kibi follows the XDG Base Directory Specification:
- A user-level configuration file can be located at
$XDGCONFIGHOME/kibi/config.ini if environment variable $XDGCONFIGHOME
is defined, ~/.config/kibi/config.ini otherwise.
- A system-wide configuration file can be located at
$XDGCONFIGDIRS/kibi/config.ini if environment variable
$XDGCONFIGDIRS is defined, /etc/kibi/config.ini or
/etc/xdg/kibi/config.ini otherwise.
Windows
A configuration file can be located at %APPDATA%\Kibi\config.ini.
Syntax highlighting
Syntax highlighting can be configured using INI files which follow this format:
### /usr/share/kibi/syntax.d/rust.ini ###
Kibi syntax highlighting configuration for Rust
name=Rust extensions=rs highlight_numbers=true singlelinestringquotes=" singlelinecommentstart=// multilinecommentdelims=/, / ; In Rust, the multi-line string delimiter is the same as the single-line string ; delimiter multilinestringdelim=" ; https://doc.rust-lang.org/book/appendix-01-keywords.html keywords_1=abstract, as, async, await, become, box, break, const, continue, crate, do, dyn, else, enum, extern, false, final, fn, for, if, impl, in, let, loop, macro, match, mod, move, mut, override, priv, pub, ref, return, self, Self, static, struct, super, trait, true, try, type, typeof, unsafe, unsized, use, virtual, where, while, yield keywords_2=i8, i16, i32, i64, i128, isize, u8, u16, u32, u36, u128, usize, f32, f64, bool, char, str
The location of these files is described below.
Linux / macOS
kibi follows the XDG Base Directory Specification:
- User-level syntax highlighting configuration files can be located at
$XDGDATAHOME/kibi/syntax.d/<file_name>.ini
$XDGDATAHOME is defined,
~/.local/share/kibi/syntax.d/<file_name>.ini otherwise.
- System-wide syntax highlighting configuration files can be located at
$XDGDATADIRS/kibi/syntax.d/<file_name>.ini
$XDGDATADIRS is defined,
/usr/local/share/kibi/syntax.d/<file_name>.ini or
/usr/share/kibi/syntax.d/<file_name>.ini otherwise.
Windows
Syntax highlighting configuration files can be located at %APPDATA%\Kibi\syntax.d\<file_name>.ini.
Comparison with kilo
This project is inspired by kilo, a text editor written by Salvatore Sanfilippo (antirez) in C, and this tutorial (also in C).
kibi provides additional features:
- Support for UTF-8 characters
- Compatibility with Windows
- Command to jump to a given row/column
- Handle window resize (UNIX only)
- Parsing configuration files: global editor configuration with validation, language-specific
- Display line numbers on the left of the screen; display file size in the status
- Syntax highlighting: multi-line strings
- Save as prompt when no file name has been provided
- Command to duplicate the current row, to quickly move between words
- Ability to execute an external command from the editor and paste its output
- Support for end-of-options delimiter
--(following POSIX.1-2024 12. Utility
- Can be used as the editor for the
sudoersfile viavisudo - Guaranteed memory safety, thanks to Rust!
- Bug fixes
Contributing
Contributions of any kind are welcome! Make sure to check out the contributing guide: CONTRIBUTING.md.
Dependencies
This project must remain tiny, so using advanced dependencies such as ncurses, toml or ansi-escapes would be cheating.
The following dependencies provide wrappers around system calls.
- On UNIX systems (Linux, macOS):
libc
- On Windows:
winapi
- winapi-util
In addition, unicode-width is used to determine the displayed width of Unicode characters. Unfortunately, there is no way around it: the unicode character width table is 230 lines long.
Why Kibi?
- Porting the
kilosource code from C to Rust and trying to make it idiomatic
- Implementing new features while under the 1024-line constraint is a good challenge
- Most importantly, I wanted to learn Rust and this was a great project to
Contributors
This project follows the all-contributors specification (emoji key). Contributions of any kind welcome!
License
This project is licensed under either of
at your option.