{"id":14008349,"url":"https://github.com/ChrisPenner/rasa","last_synced_at":"2025-07-24T03:32:34.327Z","repository":{"id":56876101,"uuid":"73217533","full_name":"ChrisPenner/rasa","owner":"ChrisPenner","description":"Extremely modular text editor built in Haskell","archived":false,"fork":false,"pushed_at":"2020-10-21T02:45:04.000Z","size":955,"stargazers_count":618,"open_issues_count":20,"forks_count":42,"subscribers_count":25,"default_branch":"master","last_synced_at":"2025-06-22T18:52:50.667Z","etag":null,"topics":["editor","haskell","modular","rasa"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ChrisPenner.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2016-11-08T18:59:51.000Z","updated_at":"2025-06-06T14:20:00.000Z","dependencies_parsed_at":"2022-08-20T23:10:26.155Z","dependency_job_id":null,"html_url":"https://github.com/ChrisPenner/rasa","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ChrisPenner/rasa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2Frasa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2Frasa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2Frasa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2Frasa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ChrisPenner","download_url":"https://codeload.github.com/ChrisPenner/rasa/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ChrisPenner%2Frasa/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266640356,"owners_count":23960777,"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","status":"online","status_checked_at":"2025-07-23T02:00:09.312Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["editor","haskell","modular","rasa"],"created_at":"2024-08-10T11:01:36.621Z","updated_at":"2025-07-24T03:32:34.010Z","avatar_url":"https://github.com/ChrisPenner.png","language":"Haskell","funding_links":[],"categories":["Haskell"],"sub_categories":[],"readme":"Rasa (Rah-zah)\n==============\n\n[![Join the chat at https://gitter.im/rasa-editor/Lobby](https://badges.gitter.im/rasa-editor/Lobby.svg)](https://gitter.im/rasa-editor/Lobby?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n[![Hackage](https://img.shields.io/badge/hackage-latest-green.svg)](https://hackage.haskell.org/package/rasa)\n\nEmbarrassingly modular customizable text editor built in Haskell.\n\n![Rasa Editor](https://github.com/ChrisPenner/rasa/blob/master/docs/rasa.png \"Rasa Editor\")\n\nA Rasa editing session with multiple cursors \u0026 viewports.\n\nDocumentation\n-------------\nYou can find hackage documentation for rasa and some extensions here:\n\n- [rasa](https://hackage.haskell.org/package/rasa)\n- [rasa-ext-slate](https://hackage.haskell.org/package/rasa-ext-slate)\n- [rasa-ext-views](https://hackage.haskell.org/package/rasa-ext-views)\n- [rasa-ext-vim](https://hackage.haskell.org/package/rasa-ext-vim)\n- [rasa-ext-cmd](https://hackage.haskell.org/package/rasa-ext-cmd)\n- [rasa-ext-cursors](https://hackage.haskell.org/package/rasa-ext-cursors)\n- [rasa-ext-files](https://hackage.haskell.org/package/rasa-ext-files)\n- [rasa-ext-logger](https://hackage.haskell.org/package/rasa-ext-logger)\n\nWhat people are saying\n----------------------\n\n\u003e Excessively Modular! - some bald guy\n\n\u003e I'm glad I'm unemployed so I have time to configure it! - my mate Steve\n\n\u003e You should go outside one of these days. - Mother\n\nGetting started\n---------------\n\n### Configuring Rasa\n\nRasa is designed to be easy to configure and script, both when adding extensions provided\nby the community, and when writing your own user-scripts.\n\nRasa is written in Haskell, and the configuration is done in the Haskell\nlanguage, don't let that scare you though, you can script Rasa and add\nextensions without knowing much haskell!\n\n### [Building Your First Extension](https://github.com/ChrisPenner/rasa/blob/master/docs/Building-An-Extension.md)\n\n\\^ That guide will walk you through installation and getting running! Once\nyou're running rasa you can experiment with creating your own adaptations. You\nshould customize your keymap to add a few mappings you like. It's a short step\nfrom here to developing your own extensions. `Action`s like you'd use in an\nextension can be registered to listeners in your `Main.hs`. You can build and\nexperiment with entire extensions in your config file and extract them as a\npackage when you're ready, kind of like a vimrc file. Again, just read the \nextension guide, it covers what you need to know!\n\nIf you have any issues (and I'm sure there'll be a few; it's a new project!)\nplease report them [here](https://github.com/ChrisPenner/rasa/issues).\n\n\nCore Principles\n---------------\n\nRasa is meant to be about as modular as an editor can be. The goal is for as\nmuch code as possible to be extracted into composable extensions. If the core\nediting facilities can't be implemented as extensions, then the extension\ninterface isn't powerful enough. I've taken this to its extreme, for instance\nthe following features are implemented as rasa extensions that anyone in the\ncommunity could have written.\n\n- Loading and saving files \n- Key bindings\n- Listening for keyboard events\n- Multiple cursors\n- Rendering the editor to the terminal\n\nThis approach has some unique pros and cons:\n\n### Pros\n\n-   Implementing most core functionality as extensions ensures a powerful and\n    elegant extension interface.\n-   Flexibility; don't like the default cursor implementation? Write your own!\n-   Adaptability; the core of Rasa is miniscule, you can mix and match\n    extensions to build any editor you want.\n\n\n### Cons\n\n-   Module cross-dependencies makes the community infrastructure more fragile;\n    We'll likely develop a solution to this as a community as time goes on.\n-   Fragmentation; Not having a single implementation for a given feature means\n    extensions that depend on a feature have to pick a specific implementation\n    to augment. Over time data-structures and types will be standardized into\n    Rasa's core to help alleviate this.\n\nCore Features\n-------------\n\nAs stated above, the editor itself focuses primarily on easy extensibility, so it doesn't have a lot of editing\nfeatures built in, instead it focuses on standardizing a good extension API.\nWe focus on creating a simple system so people can pick it up quickly.\n\nHere are some features of that API:\n\n### Event Listener System\n\nAll actions in the editor are triggered via an event/listener system.\nExtensions may subscribe to events from the editor, or from another extension\nand perform an action in response. The Event which triggered the listener is\navailable as an argument). Extensions may also dispatch any kind of event at\nany time which other extensions may listen for.\n\n### Actions/BufActions\n\nExtensions define things that they'd like to do using a powerful set of\nfunctions which they can embed in an `Action`. Within an action an extension\nmay perform IO, access the available buffers, store and access extension state,\nand edit text.\n\nRunning Tests\n-------------\n\nRun all tests:\n\n- `stack test`\n\nRun only tests for core editor:\n\n- `stack test rasa`\n\n\nInstallation\n------------\n\nAt the moment you must build Rasa from source;\n\nTo provide reproducible builds, Rasa uses Stack \u0026 Nix.\n\n1. Install [stack](http://seanhess.github.io/2015/08/04/practical-haskell-getting-started.html)\n2. Install [nix](https://nixos.org/nix/)\n3. Clone this repo and `cd` into the directory\n4. Run `stack build \u0026\u0026 stack exec rasa` (you may want to alias this to `rasa`)\n\nInstallation without nix (not-recommended)\n------------------------------------------\n\n1. Install [stack](http://seanhess.github.io/2015/08/04/practical-haskell-getting-started.html)\n2. Clone this repo and `cd` into the directory\n3. Run `stack build --no-nix \u0026\u0026 stack exec rasa --no-nix` (you may want to alias this to `rasa`)\n\n### Troubleshooting\n\nIf you have issues with nix; you may try running rasa without it with `stack build --no-nix \u0026\u0026 stack exec rasa`;\nYou'll likely have to consider the following:\n\n- You may need to install icu4c (`brew install icu4c`), it's a dependency of the rope library rasa uses.\n- On linux, when the error message `Missing C libraries: icuuc, icui18n, icudata` appears, install `libicu-dev` (e.g. with `sudo apt install libicu-dev`).\n- You'll need to point to the icu4c lib in your stack.yaml wherever it's stored on your system. If you install\n    using brew on your Mac, then you can add the following to your stack.yaml:\n\n```yaml\nextra-lib-dirs:\n- /usr/local/opt/icu4c/lib \nextra-include-dirs:\n- /usr/local/opt/icu4c/include\n```\n\n- Depending on which LTS you're on, you'll likely also have to add each rasa package you use to your stack.yaml as\n    extra-deps, here's an example:\n\n```yaml\n# in stack.yaml\nextra-deps:\n- rasa-0.1.0.0\n- rasa-ext-cursors-0.1.0.0\n- rasa-ext-logger-0.1.0.0\n- rasa-ext-vim-0.1.0.0\n- text-lens-0.1.0.0\n- rasa-ext-files-0.1.0.0\n- rasa-ext-cmd-0.1.0.0\n- rasa-ext-slate-0.1.0.0\n- vty-5.14\n```\n\nContributing\n------------\n\nThings are moving quickly, but I'd love a hand! You can get a rough idea of\nwhere you can help out at the\n[Roadmap](https://github.com/ChrisPenner/rasa/issues/2), feel free to leave a\ncomment there asking any questions. \n\nChatting about features is a key part of Rasa's development; come join us in\nthe [Chat Room](https://gitter.im/rasa-editor/Lobby)!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FChrisPenner%2Frasa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FChrisPenner%2Frasa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FChrisPenner%2Frasa/lists"}