{"id":15392019,"url":"https://github.com/dhleong/judo","last_synced_at":"2026-02-27T09:10:55.689Z","repository":{"id":142682941,"uuid":"93999772","full_name":"dhleong/judo","owner":"dhleong","description":"A more elegant way to play in the MUD","archived":false,"fork":false,"pushed_at":"2021-01-02T21:15:15.000Z","size":4206,"stargazers_count":20,"open_issues_count":8,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-07T13:37:07.010Z","etag":null,"topics":["mud","telnet-client","vim"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","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/dhleong.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-06-11T11:24:38.000Z","updated_at":"2024-11-28T01:05:24.000Z","dependencies_parsed_at":null,"dependency_job_id":"669d2bf0-bd10-4d6c-9316-6c537ee34067","html_url":"https://github.com/dhleong/judo","commit_stats":{"total_commits":407,"total_committers":2,"mean_commits":203.5,"dds":0.05651105651105648,"last_synced_commit":"b51baad6622d7644de072b945bab77bf336d39eb"},"previous_names":[],"tags_count":40,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhleong%2Fjudo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhleong%2Fjudo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhleong%2Fjudo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhleong%2Fjudo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dhleong","download_url":"https://codeload.github.com/dhleong/judo/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240351251,"owners_count":19787799,"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":["mud","telnet-client","vim"],"created_at":"2024-10-01T15:13:51.761Z","updated_at":"2026-02-27T09:10:50.662Z","avatar_url":"https://github.com/dhleong.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"judo [![Build Status](https://img.shields.io/travis/dhleong/judo/main.svg?style=flat)](https://travis-ci.org/dhleong/judo)\n====\n\n*A more elegant way to play in the [MUD][1]*\n\n## What\n\nJudo is a terminal-based, modal MUD client inspired by [Vim][2].  If you're unfamiliar\nwith Vim and do a lot of typing or text editing, go take a look! On a Unix system you\ncan probably run `vimtutor` from your favorite terminal to get an intro.\n\n### Features\n\nHere's a quick list of some features Judo provides:\n\n- Most common MUD protocols: MCCP, MSDP, GMCP, Secure Telnet\n- Scripting via Python or Javascript\n- Aliases, triggers, and Prompts (of course)\n- Intelligent tab-completion, based on previously-entered commands and output\n  from the server\n- [Horizontal and vertical][16] [split windows][17]\n- Persist input history across sessions\n- Input history searching\n- Logging, including HTML formatting\n- And, of course, *modal* input\n\nBeing modal means that the keys you type don't always just go into the \"input buffer\"\nfor sending to the MUD server. Instead, each key press, or sequence of key presses,\ncan be bound to do many different things, which very based on the current \"mode.\"\n\n### Normal Mode\n\nNormal Mode is largely identical to Vim's, where keys are used to move around the input\nbuffer and perform large editing *verbs*, or *actions*. A *verb* takes an *object*\n(more commonly referred to as *motions*), just like in most languages. For example,\nif you use the `delete` verb (bound to the `d` key) with the `word` object (bound to\nthe `w` key), you will *delete* until the start of the next \"word.\" This is done by\nsimply typing `dw` in Normal Mode. There's also an `end of line` object, `$`, so\ntyping `d$` will delete from the current position all the way to the end of the line.\n\nThere are [many][3] [resources][4] for [learning][5] [about][6] [vim][7], but\nhopefully this very brief intro will convince you to give it a shot.\n\nNote that not all verbs and motions from Vim are implemented in Judo—yet!\n\n### Insert Mode\n\nInsert Mode is also largely identical to Vim's, and is equivalent in function to the\n*only* mode in most other editors. When you type in Insert Mode, the text gets\n*inserted* into the input buffer. Pressing the escape key, or hitting `ctrl+[`,\nin Insert Mode—or any other mode—will send you back to Normal Mode.\n\n### Command Mode\n\nCommand Mode is similar to Vim's, but instead of executing vimscript, it executes\nPython code. With functions like `disconnect()` which don't take any arguments, you\ncan omit the parentheses.\n\n### Custom Modes\n\nOne interesting feature of Judo is the ability to create custom modes. We'll go\ninto more depth on the mechanics of this feature in the [scripting documentation][10],\nbut the idea is to be able to have a blank slate on which to create whatever\nmappings you like. For myself, I created a `nav` mode, in which the `hjkl`, and `uon,`\nkeys map to the directions: `n`, `e`, `s`, `w`, and `nw`, `ne`, `sw`, `se`,\nrespectively. Holding shift while pressing these keys `open` the corresponding\ndirection.\n\n\n## How\n\nJudo is implemented in [Kotlin][8] because I wanted to learn more about it after Google\nannounced their official support for it on Android. I'd been tinkering with it a bit,\nbut it was time to really get my hands dirty. Also, the JVM is pretty ubiquitous,\nand I didn't want to have to deal with compiling stuff (although it does mean Judo\nuses a good deal more memory than Vim which inspired it).\n\n### Installing on macOS\n\nYou can easily install a build on macOS using [Homebrew][12]:\n\n    brew install dhleong/tap/judo\n\nThen, simply use the installed `judo` binary as described below.\n\n### Installing on others\n\nBuilds can be found on the [releases page][13], or you can build your own\nusing the included Gradle script:\n\n    ./gradlew jar\n\nThen, to run:\n\n    java -jar judo/build/libs/judo-{version}.jar\n\nSince Judo needs tight control over the terminal, you unfortunately cannot simply\ndo `./gradle run`, which also means running a debug build from IntelliJ won't work\nas expected. Instead, you can run like this:\n\n    java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar judo/build/libs/judo-{version}.jar\n\nand connect IntelliJ's debugger to it by creating a \"Remote\" debug run configuration.\n\nHowever you invoke the jar, you can save that as a script and use it in place of `judo`\nin the examples below.\n\nNote that you may also need to install [Java 8][14] if it isn't already available.\n\n### Connecting to a Server\n\nYou have a few options here:\n\n1. Pass host and port to the CLI:\n\n        judo myawesomeserver.com 5656\n\n2. Use the `:connect(\"host\", port)` command while `judo` is running\n\n3. Create a world script containing `connect(host, port)` and pass *that* to the CLI:\n\n        judo myawesomescript.py\n\n4. Use a URI with any of the above, especially if you want Secure Telnet:\n\n        judo ssl://myawesomeserver.com:1443\n\n        :connect(\"ssl://host:port\")\n\n### Configuring\n\nJudo tries to load `$HOME/.config/judo/init.py` or `$HOME/.config/judo/init.js`\nevery time it loads—use whichever language you prefer—so that is a great place\nto put common mappings, etc.\n\n### Scripting\n\nJudo uses [Python][9] or [Javascript][15] for configuration and scripting. See\n[Scripting.md][11] for more details, or run `help` in Command Mode to get\nstarted.\n\n\n## Why\n\nI've played MUDs off and on throughout my life, but when I started getting into\nthem again recently, I found that trying to navigate around worlds quickly put\nmy hand into a very RSI-inducing position (I don't have a keyboard with a\nnumpad). I was inspired by my favorite editor to create something modal, so I\ncould bind the hjkl keys to the cardinal directions and keep my hands\ncomfortably on the home row.\n\n\n[1]: https://en.wikipedia.org/wiki/MUD\n[2]: http://www.vim.org/\n[3]: http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/\n[4]: https://stackoverflow.com/a/1220118\n[5]: http://derekwyatt.org/vim/tutorials/\n[6]: https://medium.com/usevim\n[7]: http://vimcasts.org/\n[8]: https://kotlinlang.org/\n[9]: https://www.python.org/\n[10]: ./docs/Scripting.md#custom-modes\n[11]: ./docs/Scripting.md\n[12]: https://brew.sh/\n[13]: https://github.com/dhleong/judo/releases\n[14]: http://www.oracle.com/technetwork/java/javase/overview/java8-2100321.html\n[15]: https://javascript.info/\n[16]: https://user-images.githubusercontent.com/816150/71587617-6e560100-2aec-11ea-9d84-eeb2a68ba852.png\n[17]: https://github.com/dhleong/judo/blob/main/docs/Scripting.md#windows\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhleong%2Fjudo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdhleong%2Fjudo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhleong%2Fjudo/lists"}