? Welcome to Runestone – a performant plain text editor for iOS with code editing features
Runestone uses GitHub’s Tree-sitter to parse code to a syntax tree which is used for features that require an understanding of the code in the editor, for example syntax highlighting.
✨ Features
- Syntax highlighting.
- Line numbers.
- Highlight the selected line.
- Show invisible characters (tabs, spaces and line breaks).
- Insertion of character pairs, e.g. inserting the trailing quotation mark when inserting the leading.
- Customization of colors and fonts.
- Toggle line wrapping on and off.
- Adjust height of lines.
- Add a page guide.
- Add vertical and horizontal overscroll.
- Highlight ranges in the text view.
- Search the text using regular expressions.
- Automatically detects if a file is using spaces or tabs for indentation.
- Specify line endings (CR, LF, CRLF) to use when inserting a line break.
- Automatically detect line endings in a text.
? Getting Started
Please refer to the Getting Started article in the documentation.
? Documentation
The documentation of all public types is available at docs.runestone.app. The documentation is generated from the Swift code using Apple’s DocC documentation compiler.
? Performance
Runestone was built to be fast. Its good performance is by far mostly thanks to Tree-sitter’s incremental parsing and AvalonEdit’s approach for managing lines in a document.
When judging the performance of Runestone, it is key to build your app in the release configuration. The optimizations applied by the compiler when using the release configuration becomes very apparent when opening large documents.
? Catalyst
The project should mostly work with Catalyst on the Mac, however, it isn’t fully tested and the implementation isn’t considered done. The focus is currently on the iPhone and iPad.
? Projects
The Runestone framework is used by an app of the same name. The Runestone app is a plain text editor for iPhone and iPad that uses all the features of this framework.
❤️ Acknowledgments
- Tree-sitter is used to parse code incrementally.
- Line management is translated to Swift from AvalonEdit.
- swift-tree-sitter and SwiftTreeSitter which have served as inspiration for the Tree-sitter bindings.
- Detection of indent strategy inspired by auto-detect-indentation.
- And last (but not least!), thanks a ton to Alexander Blach (developer of Textastic), Till Konitzer (developer of Essayist), Greg Pierce (developer of Drafts) and Max Brunsfeld (developer of Tree-sitter) for pointing me in the right direction when I got stuck.