{"id":20275650,"url":"https://github.com/solidiquis/novavim_old","last_synced_at":"2026-04-13T05:46:36.487Z","repository":{"id":49877534,"uuid":"369118699","full_name":"solidiquis/novavim_old","owner":"solidiquis","description":"Vim but in Rust (Work-in-progress).","archived":false,"fork":false,"pushed_at":"2021-06-20T01:25:33.000Z","size":67,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-14T06:29:12.202Z","etag":null,"topics":["neovim","rust","terminal","terminal-app","vi","vim"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/solidiquis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-20T07:23:51.000Z","updated_at":"2023-07-25T14:46:18.000Z","dependencies_parsed_at":"2022-08-19T05:01:56.318Z","dependency_job_id":null,"html_url":"https://github.com/solidiquis/novavim_old","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solidiquis%2Fnovavim_old","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solidiquis%2Fnovavim_old/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solidiquis%2Fnovavim_old/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solidiquis%2Fnovavim_old/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/solidiquis","download_url":"https://codeload.github.com/solidiquis/novavim_old/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241767389,"owners_count":20016944,"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":["neovim","rust","terminal","terminal-app","vi","vim"],"created_at":"2024-11-14T13:10:26.807Z","updated_at":"2025-12-31T01:03:16.285Z","avatar_url":"https://github.com/solidiquis.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# novavim\nI had coded out a \u003ca href=\"https://github.com/solidiquis/novavim_go\"\u003eproof of concept in Go\u003c/a\u003e a few months ago and figured this would be fun to tackle in Rust.\n\nThe goal of this project is mainly to learn and practice Rust and hopefully end up with something that is at the very least stable and usable. A secondary goal is to make this project as lightweight as possible and therefore do as many things from scratch as possible; this means I won't be relying on ncurses nor any terminal UI drawing libraries — these will be done in-house. The only two non-standard-lib crates that I envision myself using are the libc crate (to make ioctl system calls) and regex crate.\n\n## Brief overview of how NovaVim works\nNovaVim leverages the `stty` POSIX command to adjust the behavior of the Termios layer sitting between the master and slave pty so that user-input is unbuffered and unechoed which allows keypresses to be automatically available to the program without having to provide a new-line.\n\nWhen the key arrives to NovaVim, the program will first try to determine the key that is pressed: Enter, Tab, directional-key, etc.. Once the key-type is ascertained, the NovaVim mux (`Mux` struct) will try to determine which controller (e.g. `InsertCtrl` struct) to send the key to, while keeping track of which is the active controller. Once the appropriate controller has been determined, the key will then be forwarded to the appropriate controller action (methods implemented on controller) to be handled.\n\nCursor movement, text-editing, and terminal ui behaviors are all driven by `blurses`, which is my janky in-house version of ncurses. All of the text that is echoed back to the user is cached and edit-history is also tracked.\n\nExample flow A:\n\n1. `\u003ci\u003e -\u003e \u003cMux mode: Normal\u003e -\u003e \u003cMux mode: Insert\u003e`\n2. `\u003ch\u003e -\u003e \u003cMux mode: Insert\u003e -\u003e \u003cInsertCtrl\u003e -\u003e Forward to handle_regular_key action -\u003e echo character back to user.`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsolidiquis%2Fnovavim_old","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsolidiquis%2Fnovavim_old","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsolidiquis%2Fnovavim_old/lists"}