{"id":21096002,"url":"https://github.com/brouberol/bo","last_synced_at":"2025-05-16T15:34:12.678Z","repository":{"id":39856445,"uuid":"387803158","full_name":"brouberol/bo","owner":"brouberol","description":"My personal prose editor with vim-like navigation.","archived":false,"fork":false,"pushed_at":"2023-03-01T02:58:17.000Z","size":3016,"stargazers_count":12,"open_issues_count":17,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-23T02:39:17.806Z","etag":null,"topics":["rust","text-editor","vim"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/brouberol.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-07-20T13:36:13.000Z","updated_at":"2024-09-10T09:15:56.000Z","dependencies_parsed_at":"2023-02-17T01:02:20.620Z","dependency_job_id":null,"html_url":"https://github.com/brouberol/bo","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brouberol%2Fbo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brouberol%2Fbo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brouberol%2Fbo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brouberol%2Fbo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brouberol","download_url":"https://codeload.github.com/brouberol/bo/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254556923,"owners_count":22091019,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["rust","text-editor","vim"],"created_at":"2024-11-19T22:32:39.093Z","updated_at":"2025-05-16T15:34:12.343Z","avatar_url":"https://github.com/brouberol.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# bo\n\n[![crates.io](https://img.shields.io/crates/v/bo-bin.svg)](https://crates.io/crates/bo-bin) [![Tests](https://github.com/brouberol/bo/actions/workflows/tests.yml/badge.svg)](https://github.com/brouberol/bo/actions/workflows/tests.yml) [![Coverage](https://github-brouberol-coverage.s3.eu-west-3.amazonaws.com/bo/main/badges/flat.svg)](http://github-brouberol-coverage.s3-website.eu-west-3.amazonaws.com/bo/main) [![rustdoc](https://img.shields.io/badge/rustdoc--d6782e)](https://brouberol.github.io/bo/doc/)\n\nMy (WIP) personal text editor for prose.\n\nhttps://user-images.githubusercontent.com/480131/131999617-61acc5a2-4055-4cd1-9da1-134ee9e075b4.mp4\n\n## Why?\nThe goals for `bo` are the following:\n\n- write a non trivial application in Rust for the first time\n- create a text editor extremely tailored to my personal tastes, only implementing the Vim navigation features I like and use\n- make it _non configurable_\n\nHaving a good text editor is paramount for a software engineer, but the definition of _good_ really varies depending on the context.\nI do enjoy Visual Studio for its rich ecosystem, I enjoy Sublime Text for its extreme snappiness, and I enjoy vim for its ubiquitousness.\nI tend to favour an editor with plugins/linters/autocompletion when I'm developing code, but when I'm writing prose (blogposts, book chapters...), I would like to use an editor that is as simple as possible and \"works\" for me, without giving me the opportunity of getting lost in configuration options.\n\nSo, something like [Left](https://hundredrabbits.itch.io/left), but with vim-like navigation commands.\n\n## Installation\n\nYou can fetch the latest `bo` release from the [Github release page](https://github.com/brouberol/bo/releases), or compile and install it by running\n\n```console\n$ cargo install bo-bin\n```\n\n**Note**: While the crates is named `bo-bin` (as [`bo`](https://crates.io/crates/bo) was already taken), the binary name is `bo`.\n\n## Roadmap\n\n### Navigation\n\n- [x] Navigation with `h`, `j`, `k`, `l`\n- [x] Next/previous paragraph (`}`, `{`)\n- [x] Next/previous word (`w`, `b`)\n- [x] First/last line in document (`g`, `G`)\n- [x] First/last character in the line (`0`, `$`)\n- [x] Screen navigation (`H`, `M`, `L`)\n- [x] First non whitespace character in the line (`^`)\n- [x] Support for multi-character commands (e.g. `2j`, `3}`, ...)\n- [x] Go to n% in the file (`%`)\n- [x] Search text and navigate through matches\n- [x] Move cursor by left clicking\n- [x] Go to matching symbol, bracket, quote, etc\n- [x] Support multiline goto-matching-symbol\n\n### Editing\n\n- [x] Create a new file\n- [x] Open an existing file\n- [x] Save file `w`\n- [x] Rename file `w` `file name`\n- [x] Insert character under the cursor\n- [ ] block (word, paragraph, line, etc) with both `d` and `c`\n- [x] delete a line with `dd`\n- [ ] yank/paste a block\n- [x] insert newline before/after (`o`, `O`)\n- [ ] Replace current character (`r`)\n- [ ] Replace search matches\n- [x] Remove trailing space at save\n- [x] Remove current character\n\n### Options\n\n- [x] toggle line numbers\n- [x] toggle word count stats\n- [ ] toggle line wrapping\n\n### UX\n\n- [x] Display help\n- [ ] Save session file with last known cursor position\n- [x] Restore unsaved edits by regularly saving to a hidden swap file\n- [ ] Command history, browsable with arrows\n- [x] Support Unicode characters\n- [x] Redraw rows when the terminal size changes\n\n### Long shot\n- [ ] Multiline edition support\n- [x] undo/redo\n- [ ] Tab navigation\n- [ ] Fuzzy file finder\n\n## Development documentation\n\nThe `rustdoc` documentation is hosted on [Github Pages](https://brouberol.github.io/bo/doc/).\n\n## Inspiration\n\nI got the inspiration for `bo` by reading about [antirez](https://github.com/antirez)'s editor [`kilo`](https://github.com/antirez/kilo), and am wildly basing my work on the excellent [blogpost series](https://www.philippflenker.com/hecto-chapter-1) by Philipp Flenker.\n\nIt is called `bo` because I've recently [turned 30](https://www.youtube.com/watch?v=XrOa5hDzXIY).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrouberol%2Fbo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrouberol%2Fbo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrouberol%2Fbo/lists"}