small yet mighty GNU Emacs style editor

Kevin Bloom 7e3d573824 might have fixed another bug with memory on NetBSD 21 saat önce
docs 0814b08507 Revert "moved term variable to better location" 1 ay önce
scripts 64d4411373 added support for both gnu and bsd make; more work on LSP 4 gün önce
.gitignore 80fa94f2c1 use spaces instead of tabs 1 yıl önce
AE_LICENSE e97a1e4a48 licenses 1 yıl önce
BSD_LICENSE 3b51442c13 year bump; termbox update 9 ay önce
GNUmakefile 64d4411373 added support for both gnu and bsd make; more work on LSP 4 gün önce
LICENSE 3b51442c13 year bump; termbox update 9 ay önce
NEWS eb01d90e2f fixed bug with single quotes on bracket jumping 2 gün önce
README.md 874790e14d update some documentation 1 ay önce
ait.1 64d4411373 added support for both gnu and bsd make; more work on LSP 4 gün önce
buffer.c e3c4ec583c Revert "experimenting with even stricting re-rendering" 1 ay önce
command.c 7e3d573824 might have fixed another bug with memory on NetBSD 21 saat önce
complete.c ddc72daea5 another idiotic switch-buffer bug 2 ay önce
display.c 71c743ea17 fixed some minor bugs 2 hafta önce
gap.c 55c5003687 syntax highlighting start 1 ay önce
header.h 64d4411373 added support for both gnu and bsd make; more work on LSP 4 gün önce
hilite.c cb8b12940f fixed bug that caused crash due to hiliting 3 hafta önce
key.c 920c322305 first attempts at LSP (only tested briefly for C and kotlin) 5 gün önce
main.c 64d4411373 added support for both gnu and bsd make; more work on LSP 4 gün önce
makefile 920c322305 first attempts at LSP (only tested briefly for C and kotlin) 5 gün önce
replace-share.awk 920c322305 first attempts at LSP (only tested briefly for C and kotlin) 5 gün önce
replace.c 920c322305 first attempts at LSP (only tested briefly for C and kotlin) 5 gün önce
search.c 10679934dd Closes #94 3 hafta önce
shell.c 64d4411373 added support for both gnu and bsd make; more work on LSP 4 gün önce
syntax.h eb01d90e2f fixed bug with single quotes on bracket jumping 2 gün önce
termbox.h 8d53fb4fe2 Closes #78, revert termbox update 9 ay önce
unicode.h 7e13e331c0 fixed remaining issues with unicode 9 ay önce
util.c eb01d90e2f fixed bug with single quotes on bracket jumping 2 gün önce
util.h 900ca8b5cc fixed bug with syntax highlighting "main(point_t" 1 ay önce
window.c 06c7270dcc fixed a few things 1 ay önce

README.md

ait - small yet mighty GNU Emacs style editor

ait is inspired by GNU Emacs, acme, mle, microEMACS, mg, and vi/vim/neovim. Based on Atto. Started as a fork of Atto but was then ported to Termbox2 to become what it is now. ait can be compiled with no dependencies other than libc. It should work on all unix-like systems although at this point it only works on GNU/Linux (glibc & musl), macOS, FreeBSD, and NetBSD.

Features

  • Emacs-like keybindings (see key.c)
  • basic window/buffer support
  • isearch
  • find/replace
  • M-x to run shell commands
    • shell commands are either inserted at the point or replace the region. For example, if you ran the scripts/spell command on a word, it would replace the word.
  • M-o to open files with external command
  • basic unlimited undo/redo
  • keyboard macros
  • jump/zap to char
  • bracket highlighting
  • syntax highlighting (see buffer.c & hilite.c & syntax.h)
  • quick jump to line and word (similar to avy)
  • UTF-8/Unicode Support
  • GNU Emacs-like kill ring

Goals

  • simplicity but don't suck
  • portability
  • reasonably small
  • support the most important core GNU Emacs keybinding
  • UTF8 & unicode
  • don't reinvent the wheel
  • don't be total trash

Non-goals

  • customizability
  • extension language
  • be Emacs
  • be Vim
  • IDE-like features
  • rewriting things that work

Abstract

The purpose of this editor is to be similar enough to Emacs but without the extra stuff. It focuses on using the existing system to do things, and having smaller footprint without lacking in important editor features. To do this, most of the keybindings are the vanilla Emacs bindings with a few exceptions, having similar buffer and cursor controls, and having a familiar look. Instead of rewriting everything in C, ait allows you to use shell commands as an pseudo-extension language. See scripts/ for more information.

The codebase comes from 2 other authors, most of which was written back in the 90s. That being said, some of the code is clearly outdated but since it works, I have no desire to rewrite it. There is also no reason for me to support things that I don't actually use or things that can easily be done using an existing function. For example, multiple cursors is really great but a complicated feature to add when most situations can be solved using keyboard macros.

Why the name ait?

ait stands for Atto In Termbox or Atto Implemented in Termbox. Also, an ait is a small island usually found in rivers. I thought about calling it simply At but there is already a program called at1 2 3 4 5. My wife also came up with the name of aint, standing for Atto IN Termbox and having the catch phrase of "because it ain't your editor."

Derivation

From Atto's README: "Atto is based on the public domain code of Anthony Howe's editor (commonly known as Anthony's Editor or AE, [2]). Rather than representing a file as a linked list of lines, the AE Editor uses the concept of a Buffer-Gap [4,5,6]. A Buffer-Gap editor stores the file in a single piece of contiguous memory with some extra unused space known as the buffer gap. On character insertion and deletion the gap is first moved to the current point. A character deletion then extends the gap by moving the gap pointer back by 1 OR the gap is reduced by 1 when a character is inserted. The Buffer-Gap technique is elegant and significantly reduces the amount of code required to load a file, modify it and redraw the display. The proof of this is seen when you consider that Atto supports almost the same command set that Pico supports, but Pico requires almost 17 times the amount of code."

ait comes from Atto so the derivation is trival. I just ported it to termbox and started hacking in my own changes for fun.

Known Issues

See issues.

Copying

ait code is released under the BSD 3-Clause License. Atto code is released to the public domain. Anthony's Editor code claims to be public domain but contains a questionable (see AE_LICENSE) license that isn't actually public domain. See the LICENSE file for the offical statements.

Acknowledgements

Hugh Barney for writing Atto.

Anthony Howe for writing Anthony's Editor.

GNU Emacs for keybindings, power, and inspritation.

Plan 9's acme for inspiration.

mle for inspiration and guidance.

Termbox2 for being nice.

Adam Saponara for making the previous 2.