14 ms·
Writing an editor in less than 1000 lines of code, just for fun
- petercooper 10y agoAnd yet I read, on Hacker News, a number of people writing how they were often saved by the availability of nano on random systems All the time, but I even use nano all the time on OS X for full on programming, mostly for quick edits or starting things off before I can be bothered opening a full project in Sublime. (Sure, I can 'get around' in vi, but I just don't seem to have the brain for it and nano is 90% fine. I grew up on GWBASIC so anything is an improvement ;-)) That aside, this feels like it could be a kinda cool command line level equivalent of ToDoMVC. Port this simple editor into Go, Rust, and a few similar languages - see what the differences are, etc.
- elsurudo 10y agoNice thing about Nano is that they arrow keys always seem to do what they are supposed to, no matter the system, shell, TTY, etc. Vi seems to have issues sometimes, and needs extra config
- dozzie 10y agoI don't know about vi (I think it's still rare on Linux systems), but Vim typically does what is expected from it.
- happyslobro 10y agoIf you ever happen to bork your kernel badly enough to prevent it from booting, you'll find a classic VI pretty quickly, and probably be grateful for it.
- dozzie 10y agoWell, not really. My system doesn't have vi installed. Vim, of course, any time of the day. Stripped Vim (vim-tiny, as Debian calls it), sure, just after installation. But vi -- no, I don't have it installed. For quite a long time Linux didn't have vi even ported. There were several clones, like Elvis and nvi (and Vim, of course). Few years ago I learned that somebody took the effort and actually ported traditional vi to Linux. I doubt mainstream distributions cared to include it, though. Why should they? They already have plethora of clones packaged, and those clones typically do much more than traditional vi. The lesson from this tale is this: don't call vi what is merely a vi clone. vi is a name of a quite concrete project. And as for kernel unable to boot: if it can't boot, then how the heck am I supposed to run anything under this kernel? Unless you meant kernel can't run OS from local disk. I know Linux well enough to manage to run my things. You would be surprised how much could you hack through if you knew how ELF binaries work.
- traviscj 10y agoYou are being needlessly pedantic. The point is that typing "vi" into a terminal runs some application that implements a "vi-ish" interface. Whether it is ported vi or vim or vim-tiny has some effect on how nice that interface is to work with, but I would argue that most vim users would be able to get their configuration fixed or whatever
- dozzie 10y ago> You are being needlessly pedantic. I assure you I am not pedantic needlessly. The claim was "vi has some issues with arrow keys". Now tell me: which vi clone was elsurudo talking about? Because those are different projects. And Vim doesn't have a smallest issue with arrow keys (unless with "compatible" option set, I think, but I didn't use it for years and I may remember wrong).
- macintux 10y agoAs a cranky old man, I'd argue all of them that support arrow keys have issues. Arrow keys are an abomination.
- deleted 10y ago[deleted]
- savanaly 10y agoPresumably h, j, k, l will always get you around in vi?
- dwaxe 10y agoj and k behavior may vary depending on your config.
- edanm 10y agoEverything can vary depending on your config, but unless they were explicitly remapped, j and k should pretty much do the same thing everywhere. Have you seen somewhere where that isn't the case?
- zodiac 10y ago> Have you seen somewhere where that isn't the case? I use the dvorak keyboard layout and used to remap (among other things) j and k in vim, since they were not on the home row for me. I stopped doing that after a while though.
- IshKebab 10y agoYeah but that is so much less usable. Quick, which one is up?
- alien3d 10y agoI also use nano for my alternative notepad++ in windows. If normal ide i only use vscode in osx.
- ag_47 10y agoPretty cool. Something like this would make for a nice school project, I would have loved being assigned to write a simple editor back in uni
- fitzwatermellow 10y agoWow! I love this!! Thanks for the post antirez, if just for introducing me to this now indispensable tool ;) asciinema - Record and share your term sessions https://asciinema.org/ https://asciinema.org/
- piokuc 10y agoYes, asciinema is a wonderful thing I learned about from this blogpost too. And another one from the asciinema.org: lolcat! Command line forever!
- sdegutis 10y agoWhat's especially impressive to me is that it even has syntax highlighting.
- sdegutis 10y agoHonestly, this is the most exciting and inspiring project I've seen on HN in years, by far. I love that it's a fully usable terminal-based text editor that has zero dependencies. Just perusing the source code has been extremely interesting and educational for me already, and it's only been 5 minutes. Definitely gonna bookmark this project and hack on it! The TODO list looks like a good start, especially the xterm-based feature.
- oneeyedpigeon 10y agoYou can tell it's going to be good when, on a Mac, you download the source and compile it, and a) it compiles b) it doesn't give a single warning. It's nice when portability actually works.
- ben_jones 10y agoBonus points for being in C
- emilong 10y agoThis is the kind of magic that got me excited about programming in the first place. I remember being in high school and one day, after class, a friend of mine mentioned that the best programmer we knew had once written a breakout clone with ANSI "graphics." We found him and he said he didn't have the source any more, but we asked him how he did it. He then proceeded to rewrite the whole thing, in Pascal, in about an hour, this time adding animations. Thanks antirez for bringing back that feeling (and, oh yeah, for redis too ;)) PS. the "Low level terminal handling" is gold here.
- mej10 10y agoThis is great! I love seeing how experienced programmers write small programs like this, especially "from scratch".
- c-smile 10y agoCool :) But editor without undo/redo is a bit surprising these days, next release?
- oneeyedpigeon 10y agoThat's what git is for ;-p
- 13of40 10y agoBack in the 90's I took a class in Visual Basic, where one of the assignments was to write a rules-compliant tic-tac-toe game. The teacher apologized for the amount of repetitive code we'd have to write to implement it in Windows forms (or whatever it was called back then). I got it down to one printed page.
- AstroJetson 10y agoWhen I taught V that was a class assignment (along with create a 4 function calculator). I don't remember any of the programs being that long. For extra credit for people that had problems I'd allow a resubmission of an assignment if you did the logic in a different way. One of the students did a table that let them look up the current board and say what the new move was.
- Dagwoodie 10y agoWhat challenges might you have if you wanted to implement something like this inside a game framework like Unity or MonoGame with C#, where it renders everything via DirectX or OpenGL?
- moron4hire 10y agoThe main challenge is that, even now, in the year 2016, there is no objectively good, fast, reliable way of rendering arbitrary text with formatting in a texture. Hell, even just plain text is kind of a pain in the ass. And yes, I know about signed distance fields.
- Dagwoodie 10y agoThe nice thing about a framework like Unity is that they do have a textfield object that behaves a lot like a standard text object in the .NET Framework. It has a lot of shortcomings but rendering the text is the easy part.
- badlogic 10y agoUnity only supports Unicode BMP. Unity doesn't support surrogates, RTL rendering/input etc. Rendering the text performantly for none western scripts is definitely not the easy part, especially on mobile (where Unity also fails to behave properly).
- moron4hire 10y agoProper Unicode and RTL support is something Jonathan Blow recently spent a lot of time getting just right for The Witness. I wonder if he'd ever consider open sourcing that work.
- tbirdz 10y agoIt's hard enough to just render high quality ASCII text. But when you consider the layout problems if you want to support full unicode, with rtl and combining characters, Indic script, etc it's very difficult.
- SwellJoe 10y agoAwesome. When I saw all the things it could do in so little code, I assumed a higher level language would be used. But, nope...plain old C with the usual standard libraries. The parser for the syntax highlighting is super cool. Concise and declarative definition of the syntax (well, the keywords, anyway), in HL_keywords, and then maybe 150 lines of code for the parser. I doubt it would work well for a much more complex language than C (say, JavaScript, or Perl), without a lot more smarts. But, it works really well on the C I looked at. Colors are handled in a cute way, too. All around, I'm just astounded at how concise this is, while still being entirely readable and comprehensible. This isn't clever/tricky golfing code, this is actually human-readable C code. Edit: Also, I'm struck by how nice/simple the editorProcessKeypress handling is. Trying to do something like this in JavaScript/HTML5 is crazily more complex and verbose. Seeing something like this reminds me how messy user interaction still is in the browser, compared to old CLI and desktop paradigms.
- groovy2shoes 10y agoThe syntax highlighter isn't really a parser, per se. It's just a lexer / tokenizer / scanner / what-have-you, which tend to be fairly compact state machines. As an aside, I agree with your edit. As someone who started programming back in the DOS days, whenever I do Web development, I'm always floored by how much it feels like one step forward and two steps back. So many simple things just aren't simple when it comes to the browser, and even certain protocols on the backend like FastCGI seem way more complicated than they need to be (SCGI seems pretty nice, though I feel it's missing a way to signal out-of-band information to the Web server, the way you'd use stderr in CGI, for example (though perhaps I'm missing something there)). As much as I love the idea of sending semantic markup over the wire for document transfer, I can't help but wonder if a more terminal-like protocol would be better for application "delivery", the way we used to do with telnet and BBSs in the 90s, with an upgrade for multimedia. But I digress...
- nostrademons 10y agoFastCGI/SCGI were obsoleted by having app servers simply speak HTTP; the web gateway just needs to function as a simple reverse proxy. HTTP is about as simple as it gets to parse - you can write a passable (not quite production quality, but works) parser in about 10 minutes. A lot of the difficulty in webapps is because every webapp is inherently a distributed system, which are always hard. Single-page apps with no connection to a server are actually quite simple, but they're also about as commercially viable as DOS programming (i.e. not at all).
- sovande 10y agoFrom the github page, "Kilo is a small text editor in less than 1K lines of code. [..] The project [..] was written in just a few hours" Either this has to be a unstructured mess of copy and paste and not worth anyones time or the author is lying about the time he used on this. Both alternatives are unappealing.
- moron4hire 10y agoOr, alternatively, the author knows what he is doing, on account of being a very experienced C developer.
- noise 10y agoAlso, he very clearly states he borrowed code from 2 of his other projects that made it faster/easier.
- coldtea 10y agoOr you're making assumptions based on your own skills? Have you seen what e.g. Notch can do in a few hours of live coding?
- sovande 10y agoIf you create a screencast I assume you give it your best. Look at the typing skills demonstrated in the screencast accompanying this project, https://asciinema.org/a/90r2i9bq8po03nazhqtsifksb https://asciinema.org/a/90r2i9bq8po03nazhqtsifksb Judging from the screencast he use around 10 seconds per line. That would be, (10s * 1000 loc)/3600 = 2.7 hours just to type 1000 lines of code. Programming is of course not typing, but a mental activity first and foremost. Let's say he is incredible smart [1] and helped by copy and past, so on average he uses 90 seconds to program one line. That is, 25 hours. Of course it will take a few days to create a 1000 line C program that does anything useful. And of course I know that "a few hours" is just something one say to look cool. I just don't think it is cool. 1. His naive redlock and following discussion on HN a while ago was not convincing, https://news.ycombinator.com/item?id=11065933 https://news.ycombinator.com/item?id=11065933
- asimuvPR 10y agoIf antirez is reading: How much time did this take? From start to finish. :)
- martin_ 10y agoThe GitHub page states: "The project is in alpha stage and was written in just a few hours taking code from my other two projects, load81 and linenoise." https://github.com/antirez/kilo https://github.com/antirez/kilo
- asimuvPR 10y agoYes, thanks for pointing that out. I'm more interested in total time. Not time to write. :)
- cantrevealname 10y ago> Let’s say this again, “email client”. The notion of email client itself is gone at this point. Really? Is it lame to be using an email clients these days? I still use an email client (Thunderbird) because I can't stand the thought of all my mail sitting forever on Goggle's or whoever's servers. Yes, I know that they could have secretly archived all of my email the moment it was sent or received, and that my privacy is not necessarily enhanced by downloading and storing my mail offline. That's my main reason, but I can think of many other reasons to prefer email clients to a web interface. I'm surprised by the sentiment that email clients are passé.
- matejn 10y agoGmail's web client also non-optionally auto-wraps text before sending, which is very annoying when you're trying to send a patch or part of a log file.
- Sidnicious 10y agoOnly in plain text mode, sadly. If you send an HTML message, a plain text version gets included, too, which isn't auto-wrapped. It's encoded as quoted-printable instead, which keeps lines short enough to be legal for SMTP but can be turned back into the original text by the client on the other end.
- akkartik 10y agoThat issue basically forced me to switch from plain-text to html emails, and thence to the slippery slope of using italics and the OCD of syntax highlighting my code snippets..
- hollerith 10y agoI dread the slow insinuation of "the web" into email. Specifically, the need to use a rendering engine like Blink or Gecko to read an email. Is there anything I can do to tempt you to switch back to plain-text emails?
- Smerity 10y agoWhen I started programming, the basic digital world already existed for me. I never had the experience of typing in a program from a magazine. This is one of those odd experiences where you remember that self-hosting[1] can involve far more components than just the compiler, spiraling an unexpectedly deep path into the development stack. I just used @antirez's 1k LOC kilo editor to edit his 1K LOC editor and it was an oddly pleasurable experience :) [1]: https://en.wikipedia.org/wiki/Self-hosting https://en.wikipedia.org/wiki/Self-hosting
- Chris_Newton 10y agoI love seeing little projects like this, and I wish I were better at finding time to do them myself. It’s all too easy when you’ve been programming professionally for a long time, often working on the same projects every day for months or years, to lose that sense of wonder at what we can achieve in a few hours with a modest amount of code. Sometimes it’s good to just sit down for a day or two and hack together a kind of program you’ve never written before, whether that’s a text editor or a puzzle game or rendering a pretty 3D fractal landscape or an IRC chat bot. It’s always nice to see someone else who’s created something that way too, so thanks for sharing.
- gnuvince 10y agoCan anyone explain how to do a full-screen UI using only VT100 codes? If I had to write a small editor, I'd probably reach for something like Termbox for display.
- spc476 10y agoYou could look at the code to see how it's done, but basically, you send a special sequence of characters that update the screen. The VT100 (and a lot of terminal emulators these days) use what are called ANSI escape sequences. For instance, to move the cursor, the CUP (CUrsor Position) sequence is used, which is "<ESC> [ <row> ; <col> H" where <ESC> is the ESCAPE ASCII character, <row> is the row number (as ASCII, so for row 12, it's the string "12"), <col> is the column number ("40" for column 40) and the rest are the literal characters. So, in hex, it's 1B 5B 31 32 3B 34 30 48 (<ESC>[12;40H). There are more sequences (move the cursor up, down, left, right, clear various portions of the screen, change colors, etc). Conversely, the terminal will send ANSI escape sequences representing certain keys, such as "<ESC>[A" for the up arrow key, "<ESC>[D" for the left arrow key and such. It's then just a matter of recognizing these sequences and doing the appropriate thing ("I received <ESC>[A so the user is moving the cursor up. Update my internal structure to represent that, and send to the terminal <ESC>[A so it moves the cursor on the screen up").
- destructionator 10y agoFirst, switch it to alternative screen mode... printf("\033?1047h"); then clear and move and such with other similar prints. See the list here : http://invisible-island.net/xterm/ctlseqs/ctlseqs.html http://invisible-island.net/xterm/ctlseqs/ctlseqs.html It really is pretty simple. The big benefit of ncurses is if you want to target terminals other than xterm compatible ones, and they are so rare nowadays that you can really just ignore them.... Input is quite a pain though (however, ncurses sometimes get it wrong too), but the same thing applies, you just need to switch to raw mode with tcsetattr and then have some kind of select() loop or something to watch for escape sequences then translate them into interesting key presses. Mouse events are the same btw: you write out a sequence to turn them on, then the terminal sends them as sequences to stdin. I wrote a terminal library myself for the D programming language (and a terminal emulator too!), it is kinda ugly code but it isn't hard.
- sscarduzio 10y ago@Antirez please please please let this thing have a future: there is a great need for a modern, simple and usabile CLI editor.
- technomancy 10y agoI think the whole point of this post was that it's a lot of fun to write code if you know it's not going to be taken seriously or used in the long-term, so what you're asking seems to be the exact opposite of why this was created.
- _acme 10y agoTry vis: https://github.com/martanne/vis https://github.com/martanne/vis
- gnuvince 10y agoI find it funny that a person named _acme suggests vis :)
- masukomi 10y agoNeovim https://neovim.io/ https://neovim.io/ is a modern, simple, usable, and powerful CLI editor. anyone who thinks vim isn't simple just hasn't had a good instructor / tutorial.
- cyberferret 10y agoNice work. I clearly remember writing a full screen editor in a few hundred lines of Turbo Pascal back in '86 because I hated using EDLIN to edit .BAT files in DOS... :D
- greglindahl 10y agoIt would be fun to see this project replicated using some other underlying data structures, e.g. the buffer-gap data structure used by emacs.[0] Does the code become shorter/prettier? etc. 0: https://en.wikipedia.org/wiki/Gap_buffer https://en.wikipedia.org/wiki/Gap_buffer
- vzhang 10y agocough cough fewer than... cough cough...
- lukeHeuer 10y agoHe mentioned using cloc to get that metric, so not including comments, formatting, etc.
- _acme 10y agoI think you missed the point: the point is that the correct English usage is "fewer than" when discussing quantifiable items (e.g., lines of code). The title should be "...an editor in fewer than 1000 lines of code."
- lukeHeuer 10y agoThank you for clarifying. I thought for a second it could have been a grammatical nitpick but discounted that since this thread is re: an Antirez post. I personally would be very sad if his writing style became more forced and began to feel like excerpts from The Elements of Style.
- imron 10y agoThis page [0] seems to suggest that "less is also used with numbers when they are on their own and with expressions of measurement or time". Lines of code is surely a measurement, which makes the use of 'less' here acceptable. 0: http://www.oxforddictionaries.com/words/less-or-fewer http://www.oxforddictionaries.com/words/less-or-fewer
- harel 10y agoI'm reading the code as a Primer. Fantastic stuff you don't see often.
- voltagex_ 10y agoThis is the programming equivalent of a food blog post (technical details interspersed with what's happening in the author's life). It's great and I think there should be more of it!
- Razengan 10y agoAnyone up for converting it to Swift (3) or Rust?
- philippnagel 10y agoI am currently learning Rust, would be happy to give it a shot! My email can be found in my profile
- justinmk 10y ago> a text editor in less than 1000 lines of code that does not depend on ncurses and has support for syntax highlight and search feature. Neovim also does not depend on ncurses. Vim optionally links to it for termcap/terminfo access.
- exabrial 10y agoId like to see people have competitions to write an editor in the most readable amount of lines of code
- marssaxman 10y agoYay, this is delightful. I wrote a nano-inspired TTY-based editor, too, and have used it to do virtually all of my coding work for the last couple of years. There's nothing particularly noteworthy about it, technologically, but it does exactly what I want in exactly the way I want it to, and that was enough to make the time spent feel worth my while. There's something really satisfying about the exercise of creating one's tools. I think there is a lot of value in projects like this whether anyone else ever uses them or not, as an exercise in software craftsmanship. Looking at this project, I am inspired to see if I could simplify my editor's codebase. I was never fully convinced that ncurses did enough good to justify its complexity; it might be interesting to adopt this author's approach instead.
- sudhirj 10y agoOff topic, but my biggest takeaway was that I could aspire to be someone who isn't a twenty something, with a family, with superb work life balance, not living in the valley, sitting in a garden without three 27 inch monitors, not using the latest programming language or fad and still writing beautiful code that a lot of the world runs on.
- zaif 10y agoI agree. I LOVE how his post weaves in his normal life, having time for doing things he actually loves outside of work, while still continuing to work on passion projects. It just goes to show you that you don't need to always buy into the cowboy coding hype that is often on display here.
- deleted 10y ago[deleted]
- yati 10y ago> WARNING: Long pretty useless blog post Antirez's posts are hardly ever really "useless" :) Awesome stuff, as always.
- _pmf_ 10y agoCool; now embed it into a 150 MB Electon app and you have a state of the art editor (maybe introduce several arbitrary delays in the range 300 ms - 2 sec for the authentic Atom feeling)!