6 ms·
Show HN: Ki Editor – Multicursor syntactical editor
Hi everyone, I have been developing this editor, Ki, for over a year, and have employed it substantially in all kinds of development (including Ki itself) for at least 3 months.
I think it is mostly crystallized, thus I'm happy to share it with you today.
Its main strength is first-class multi-cursor and structural (syntax) editing, which is a rare combination in the realm of editors (TUI or GUI alike).
Hope you'll enjoy it!
- rattray 2y agoThis looks awesome. It was a bit hard to see on mobile - what are the hotkeys in the first demo to select the full function call?
- hou32hou 2y agoJust `s` if your cursor is already placed on the first token of the function call node.
- EddieLomax 2y ago"Ki" also means "who" in Persian-Farsi ("کی"). Looks neat, just wanted to add some random related trivia.
- SanjayMehta 2y ago“Ki” means “what” in Punjabi.
- cyptus 2y agoKI means AI in German, I was already searching for some fancy GPT implementations
- hou32hou 2y agoKünstliche Intelligenz. Sounds super cool, not gonna lie.
- no_time 2y agoOddly enough, same in Hungarian.
- przmk 2y ago"Qui" (pronounced ki) also means "who" in French. I wonder if they're related.
- mcswell 2y agoFrench and Farsi (Persian) are both IndoEuropean languages. So yes, they are related. If I'm reading it right, the Proto-IndoEuropean word for "who?" is /kwis/.
- MaximilianEmel 2y agoThis looks really interesting. I will try it out sometime, but since there's no Windows builds (does it even support Windows?) that will wait a bit. I don't think it's good idea to have compile-time configuration (needing a toolchain to change config). What happened to MERC[1]? I suppose it was written for this editor? [1] https://ki-editor.github.io/merc/ https://ki-editor.github.io/merc/
- hou32hou 2y agoI will need help unfortunately because I don't have an accessible Windows machine. For the configuration I'm planning something crazier, I might use my programming language that I built earlier (https://github.com/wongjiahau/kk https://github.com/wongjiahau/kk).
- kombine 2y agoI personally don't think Lua is a good choice for an embedded language in 2024, the bare minimum should be indentation-based scopes and zero-indexed arrays. Of course, Tthis is your project, but perhaps taking an existing and mature language would ease the adoption?
- ilyagr 2y agoFascinating idea! To summarize for those who know [Kakoune](https://github.com/mawww/kakoune https://github.com/mawww/kakoune) or [Helix](https://github.com/helix-editor/helix https://github.com/helix-editor/helix), the idea is that every command has the form ["selection mode" -> "movement" -> "action"](https://ki-editor.github.io/ki-editor/comparisons/modal-editors.html https://ki-editor.github.io/ki-editor/comparisons/modal-edit...) instead of Kakoune's movement->action. So, instead of having separate commands for "next character", "next word", "next structural element", there is one command for "next" (as well as [a few additional motions](https://ki-editor.github.io/ki-editor/normal-mode/core-movements.html https://ki-editor.github.io/ki-editor/normal-mode/core-movem...)). Every command starts with a ["selection mode"](https://ki-editor.github.io/ki-editor/normal-mode/selection-modes/index.html https://ki-editor.github.io/ki-editor/normal-mode/selection-...) like "column", "line", or "structural element". It's hard to know without some practice and experience how much I'd enjoy it, but it is a good idea, and perhaps it'd be easier for a newcomer to learn than Kakoune/Helix.
- hou32hou 2y agoTo be frank it takes time to get used to, especially if you are already a Vim amateur. However, once you get the hang of it you will find that most common operations can be achieved within 3 keypresses. For example, to delete the current line, press `e` (Line selection mode) and then `d` (Delete). To delete the current word, press `w` (Word selection mode) and then `d`. To insert new text at the end of the current line, press `e`, then `a` (enter insert mode at the end of the selection). To insert new text at the beginning of the current line, press `e`, then `i` (enter insert mode at the beginning of selection). To go to the first line, press `e`, then `,` (Move to the first selection). To go to the last line, press `e`, then `.` (Move to the last selection). There are too many of such examples that I cannot fit in one comment, but I think you get the idea. It's all about creative combinations between selection modes and movements.
- kragen 2y agowhat's the keystroke sequence to move forward five words, one word at a time (so you don't have to count them first)? in vim it's wwwww, and in emacs it's alt-f f f f f the asciinema demos are super cool! btw asciinema has an option to record input keystrokes as well as screen output, but i don't know if there's a way to display them in the standard js web player for it
- ctenb 2y agoHow does this compare to Kakoune and Helix?
- hou32hou 2y agoKi is much inspired by Helix and Kakoune, however, it introduces an extra layer called the Selection Mode, with this, every movement is standardized to the same set of keybindings. Also, most importantly, syntactical selection/navigation/modification is first class, although it is somehow supported in Helix, the default keybindings are not very accessible. Another big difference from Helix is its internal architecture, most Helix components were rebuilt from scratch, while in Ki every components uses the core editor as the base, which means all components shares the same set of keybindings, you don't need to learn different set of keybindings for different components.
- ctenb 2y agoI feel that the critique on the default keybinding scheme is unwarranted. One of the key concepts of editors like Helix and Vim is that the keybindings are customizable.
- hou32hou 2y agoThat's true for some users certainly, but I guess most users will not know which 4 easy-to-access keybindings to downgrade in exchange for the 4 syntax navigation keys, if it were you which 4 default keybindings are you willing to sacrifice? The 4 movements are parent, first child, previous sibling, and next sibling.
- ctenb 2y agoI find alt-npoi intuitive and easy to reach. But my point was not that default key bindings don't matter, just that there is no one shoe fits all, and that different choices are not so relevant in comparing editor features when they are fully customizable.
- ilyagr 2y agoI wish this were a mode for https://github.com/71/dance https://github.com/71/dance or a plugin like it. Technically, this seems entirely possible, though I'm not sure anybody would have the time to actually implement it unless Ki's author wants to do it. As is, Dance with Kakoune bindings is good enough and supports all of VS Code plugins, so I'm not sure I'll get enough use of Ki to actually get used to its bindings. Or maybe I'll play with it anyway... P.S. I linked this in [Dance's forum](https://github.com/71/dance/discussions/347 https://github.com/71/dance/discussions/347), perhaps it'll turn into an actual discussion.
- ilyagr 2y agoAnother editor that people might be interested in (and I think more people should know about) is https://github.com/martanne/vis https://github.com/martanne/vis. It is, in some ways, the opposite of Ki; instead of straying further from vim, Vis is just Vim + good multiple cursor support + sam-styled structural regexes (I didn't know what those are before using Vis, I consider it a detail of how the multiple cursor interface works). Thus, Vis is easier to learn than Helix/Kakoune and gives you (IMO) the most useful feature of Helix/Kakoune. Unfortunately, Vis is also a bit bare-bones, I don't think it has LSP support for instance.
- liamwigney 2y agoRe. LSP support, there's this: https://gitlab.com/muhq/vis-lspc https://gitlab.com/muhq/vis-lspc https://github.com/fischerling/vis-lspc https://github.com/fischerling/vis-lspc I've linked both because it seems like the github repo has a pull-request with a bunch of updates but the gitlab repo seems to be more up to date? I've not tried getting it working yet, but I've seen people on Reddit (or lobste.rs, I don't remember) saying they got it working.
- evertedsphere 2y agocool demos, but i feel they would be easier to follow slowed down a touch going to try this out: the idea of breaking motion -> action into something like topic -> adjective -> action has been kicking around in my head for a while
- kleiba 2y agoAs an old-timer, I don't quite understand why Emacs still is kind of a niche app after all these years even within dev circles. Most of the functionality that other editors offer is available in Emacs too, and when it isn't, then there are usually acceptable alternatives. Over the years, I've heard many arguments against Emacs but found none of them convincing, especially if you take the point of view that learning a powerful tool can be an essential asset in any profession. Emacs certainly is such a tool. The same question could be asked about vi(m), although that one at least received some hipster love in recent years. That seems to have cooled down somewhat too, though.
- v3ss0n 2y agobecause of it requirement in understanding lisp which is a niche programming language that doesn't go anywhere in real world environment just to configure a few things.
- Chris2048 2y agoand not even a "full" Lisp, last I checked it was a special emacs version of Lisp, with a lot of ways to end up with unstructured code (freedom) hence leading to "emacs bankruptcy". I think the concepts are nice though, just needs to be refined - difficult given the legacy and following emacs has..
- v3ss0n 2y agoSome facts lisp , emac and functional fanboys cannot grasp
- lispm 2y agoI don't think that Emacs Lisp needs to be a "full Lisp", whatever that would be, but it would need, for example, some improvements in the structuring of large programs, since there is now a lot, and still growing, amount of code written in it. Namespaces/modules and threading would be examples for improvements. Emacs Lisp's language design was originally designed on Maclisp. Maclisp is long dead, but other descendants of Maclisp have been standardized (like Common Lisp and ISLisp). Emacs Lisp has been improved over the years (just two examples: lexical binding and native compilation), but there would be more to do at the base language. It's the task of the users and maintainers to do so and they have their own preferences.
- danielvaughn 2y agoStructured editors are so cool. I’ll give this a try at some point, because I really wanted to like Helix and others, but the actual UX felt too strange and difficult. I’m building my own semi-structured editor but it’s specifically for UI design. Love seeing more examples for inspiration!
- IshKebab 2y agoThis is so well presented. I love the demonstrations of real life editing tasks. Looks like it can actually do the kinds of complex editing tasks Vim users claim they can (but never provide realistic evidence for like this). Case agnostic search and replace is such a nice feature too. I have no idea why it isn't standard in IDEs.
- cassepipe 2y agoYou know it's going to be a good day when there is a new modal editor in town. Thanks for sharing. About the editor : I love what I see. I must admit that for me now the ultimate vim-fu I settled upon for navigating/editing is searching/replacing ( with something like traces.vim and `set incsearch on` so it feels nicer ) so this new paradigm makes a lot sense I believe.
- unshavedyak 2y agoLove the idea! I too am exploring structured editing, i hope to learn something from Ki :)
- zakm 2y agoI'm working on something similar (not as far along), a vscode extension that has ideas like functions, parameters, etc as first class ideas (so press f to select a function) and also does things like adding a newline and a space where appropriate during insert actions. Here's a short video demo if anyone is interested: https://youtu.be/owuuFxDBQh4 https://youtu.be/owuuFxDBQh4
- SoraNoTenshi 2y agoVery nice project, i think the way you navigate is implemented spot on! Although i have some questions / concerns: - "Command mode" (`:`) seems a bit more different compared to Helix / Kakoune and maybe even VIM. I would have also expected to be able to change the theme like so. - I couldn't find (after just a bit of skimming around the docs) how to adjust the sizes of e.g. the file-tree. Or well, even change to a different window. I like the concept of having multiple windows within the browser, but couldn't really figure it out. Also, layouts may be a neat idea to implement, so that e.g. the file browser will always spawn on the exact same location of a defined layout (may as well be pre-defined) - Theme browsing is a little bit slow i feel like, not big of a deal, just something i noticed. - The docs may also need a way to change from selection based movement (e.g. via Token / ts node) back to character based. - The gui may need some improvements, maybe it's just subjective perception, but having a small window with all the options there is good, but i couldn't intuitively tell whether or not those were all the options (e.g. in <SPC> mode). Also i am fairly certain there were more options. - A builtin tutor is also a neat idea, considering that your editor looks very young, i am sure you thought of that, but it's a really easy way to get new users comfortable with using it. Anyway, very neat project! I will keep an eye out and eventually try and daily it, at least for a week. The structured editing you implemented is REALLY GREAT, like better than i could have done it (or even thought about).
- hou32hou 2y agoThank you for trying! For character-based movement, simply press 'z' to enter the column mode. Regarding the built-in tutor, yes I really have to put in the effort, because it's so much harder than authoring documentation. And yes, a lot more has to be improved, Ki needs a lot of polishing around the edges.
- icen 2y ago> For character-based movement, simply press 'z' to enter the column mode. I did eventually find this in the documentation, under the "regexp selections" section. I think it should be more prominently displayed in other sections, since it's a natural thing to want (at first). I am enjoying the editor (as a current helix user), and looking forward to trying it more.
- dario_od 2y agoIt really needs a tutorial. I'd like to get a feel of how it works before having to study the documentation. Aside from that congrats!
- yencabulator 2y agoAren't multiple cursors and structural selection kinda standard fare these days? Even VSCode has "Expand Selection".
- hou32hou 2y agoMulti-cursor, yes; structural selection, not so much, they are more like an afterthought for most editors, there’s a big difference between being treated as first-class and second-class.
- yencabulator 2y agoCan you describe what you think is the difference between Ki and the syntax tree based selection expanding that's been available in emacs for probably a decade or more?
- hou32hou 2y agoDo you mind sharing the Emacs package that does "tree based selection expanding" so I can better highlight their differences?
- yencabulator 2y agoI haven't been active in Emacs world for a couple of years, but https://github.com/magnars/expand-region.el https://github.com/magnars/expand-region.el has been there for a while. I think the new code is right in lsp-mode and called lsp-extend-selection. VSCode has "Expand Selection". Mathematica has ctrl-. (http://xahlee.info/emacs/emacs/syntax_tree_walk.html http://xahlee.info/emacs/emacs/syntax_tree_walk.html) Zed has "select enclosing symbol" but that seems to jump to function level expansion immediately, I didn't see anything more gradual there.
- createaccount99 2y agoWould be cool if it was client-server architectured. If I can't open the editor in 2 terminals and edit the same file, that's a real blocker. Good keybinds though, I like it a lot.