Code Monkey home page Code Monkey logo

kibi's Introduction

Kibi: A text editor in ≤1024 lines of code, written in Rust

Build Status Crate Minimum rustc version Platform License Gitpod Ready-to-Code All Contributors

asciicast

A configurable text editor with UTF-8 support, incremental search, syntax highlighting, line numbers and more, written in less than 1024 lines1 of Rust with minimal dependencies.

Kibi is compatible with Linux, macOS, and Windows 102 (beta).

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...

1.: Counted with count_loc.sh
2.: Kibi requires the terminal to support ANSI escape sequences. Windows 10 version 1703 (Creators Update, April 2017) and above are supported.

Table of contents

Installation

Packaging status

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)

2 packages are available on the AUR: kibi and kibi-git.

Installation instructions
  1. Installation with an AUR helper, for instance using yay:
yay -Syu kibi  # or yay -Syu kibi-git
  1. Install manually with makepkg:
git clone https://aur.archlinux.org/kibi.git  # or git clone https://aur.archlinux.org/kibi-git.git
cd kibi
makepkg -si

Android (with Termux)

Kibi is available as a Termux package.

Installation instructions
  1. Install Termux:

Get it on F-Droid"Get it on Google Play"

  1. 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

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

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.
show_line_numbers=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 $XDG_CONFIG_HOME/kibi/config.ini if environment variable $XDG_CONFIG_HOME is defined, ~/.config/kibi/config.ini otherwise.
  • A system-wide configuration file can be located at $XDG_CONFIG_DIRS/kibi/config.ini if environment variable $XDG_CONFIG_DIRS 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
singleline_string_quotes=", '
singleline_comment_start=//
multiline_comment_delims=/*, */
; In Rust, the multi-line string delimiter is the same as the single-line string delimiter
multiline_string_delim="
; 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 $XDG_DATA_HOME/kibi/syntax.d/<file_name>.ini if environment variable $XDG_DATA_HOME is defined, ~/.local/share/kibi/syntax.d/<file_name>.ini otherwise.
  • System-wide syntax highlighting configuration files can be located at $XDG_DATA_DIRS/kibi/syntax.d/<file_name>.ini if environment variable $XDG_DATA_DIRS 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, language-specific syntax highlighting configuration
  • Display line numbers on the left of the screen; display file size in the status bar
  • Syntax highlighting: multi-line strings
  • Save as prompt when no file name has been provided
  • Command to duplicate the current row
  • Memory safety, thanks to Rust!
  • Many bug fixes

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. Safe wrappers are preferred to avoid using unsafe code as much as possible:

  • On UNIX systems (Linux, macOS):
    • libc
    • nix
    • signal-hook
  • 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?

  1. Porting the kilo source code from C to Rust and trying to make it idiomatic was interesting
  2. Implementing new features while under the 1024-line constraint is a good challenge
  3. Most importantly, I wanted to learn Rust and this was a great project to start (thanks Reddit for the idea)

Contributors

This project follows the all-contributors specification (emoji key). Contributions of any kind welcome!


Ilaï Deutel

💻 🤔 🚇 📦

Vishal Anand

🐛

Gurjus Bhasin

🤔

Libin Dang

💻 🐛

Isaac Andrade

🤔

frjol

🐛

Artem Polishchuk

📦

License

Kibi is distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See LICENSE-APACHE and LICENSE-MIT, and COPYRIGHT for details.

kibi's People

Contributors

dependabot-preview[bot] avatar ilai-deutel avatar ldang0 avatar tim77 avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.