[HN Gopher] Show HN: Vim online editor using WebAssembly, storin...
       ___________________________________________________________________
        
       Show HN: Vim online editor using WebAssembly, storing files using
       IndexedDB
        
       Author : hassanahmad
       Score  : 200 points
       Date   : 2023-01-05 17:02 UTC (5 hours ago)
        
 (HTM) web link (www.vimonlineeditor.com)
 (TXT) w3m dump (www.vimonlineeditor.com)
        
       | miket wrote:
       | Much easier to exit than standard vim!
        
       | alberth wrote:
       | Why can Vim be compiled to WASM but not VSCode?
        
         | TJSomething wrote:
         | Because VSCode relies on garbage collection, but WASM doesn't
         | support garbage collection yet. Vim is written in C and manages
         | its memory manually.
        
         | tcoff91 wrote:
         | why would you compile vscode to wasm when it's basically
         | already a web app? you can run vscode in a browser already.
        
           | alberth wrote:
           | VSCode can be laggy at times.
           | 
           | WASM would help with that.
        
             | scrollaway wrote:
             | Why do you think that? WASM isn't a magical "make it
             | faster" button.
        
               | alberth wrote:
               | Benchmarks indicate as such:
               | 
               | > Wasm is 1.95-11.71x faster than JavaScript on Firefox
               | 
               | > Wasm is 1.15-1.67x faster than JavaScript on Google
               | Chrome
               | 
               | > Wasm is 1.02-1.38x faster than JavaScript on Safari on
               | 
               | https://www.adservio.fr/post/how-fast-and-efficient-is-
               | wasm
        
               | anaganisk wrote:
               | Your benchmarks are analogous to Toyota on highway 0-60
               | 8sec Porche on highway 0-60 3sec But Tell me how they
               | perform with load, bumpy terrain, tyre wear. Just because
               | something runs faster on WASM doesnt mean u have to use
               | it, there are othet things to consider to see if its even
               | worth it. Vscode is based on mono and is written on top
               | of JS/TS. Why woukd you compile it to something and run
               | it on top of WASM, rather than just running it using the
               | native browser engine.
        
               | mkl wrote:
               | That's all a bit beside the point. VSCode is written in
               | TypeScript, and there's no easy way to compile TypeScript
               | to Wasm as it is designed to rely on a full JavaScript
               | runtime.
        
               | easrng wrote:
               | But VS Code is already JavaScript, running it in a WASM-
               | based JS interpreter instead of a native JS interpreter
               | would just slow things down.
        
             | bastawhiz wrote:
             | There's nothing here that says that the project in the
             | article is faster than Vim, just that it runs in the
             | browser. To answer your original question: VSCode's
             | internals _already run_ in the browser, so compiling them
             | to WASM for the purposes of portability is moot.
             | 
             | To answer the question that you implied ("why can't vscode
             | be compiled to wasm for performance"): vscode is built at
             | least in part on dynamic languages. There's no compiler for
             | JavaScript (or Python, or Ruby) to WASM, you can only
             | compile the interpreter for these languages to WASM and
             | then run your code in the compiled interpreter. This would
             | be slower than what exists today because it's not replacing
             | the traditionally-slow bits with WASM, it's replacing the
             | fast, native bits with WASM.
             | 
             | The reason there are no compilers for dynamic languages is
             | the same reason you can't compile (the full, canonical)
             | JavaScript/Python/etc. to native code: the dynamic nature
             | of the language prevents the generation of efficient CPU
             | instructions. You'd need to do one of a few things:
             | 
             | 1. Rewrite the dynamic code to not use the features that do
             | not compile well to native code. Then write a compiler to
             | compile the efficient subset of your language to native
             | code. This is hard and bad because why use a dynamic
             | language in the first place? You can see examples of this
             | in projects like AssemblyScript and LLJS (for Python, see
             | RPython).
             | 
             | 2. Compile everything you can to efficient native code,
             | then make the dynamic bits use less efficient code that
             | does work at runtime that other languages could do at
             | compile time. This is AOT compilation, and building an AOT
             | compiler is hard. Building an AOT compiler that works well
             | for most code is extremely hard. Additionally, you couldn't
             | do things like load dynamic code at runtime (e.g.,
             | plugins).
             | 
             | 3. Write a compiler that interprets the dynamic code at
             | runtime, and dynamically compiles that code to native code
             | as it is able to identify bits that can be efficiently run
             | on the CPU. This is JIT compilation, and building a JIT
             | compiler is hard. Moreover, you can't do JIT compilation in
             | WASM because it would require WASM to have an API for this,
             | and that seems unlikely right now.
             | 
             | 4. Just use a different, more efficient language.
             | 
             | So to answer your question, "why not compile vscode to wasm
             | for performance improvements?" You could, but it wouldn't
             | be faster. Or, you'd rewrite it in a different language,
             | but then it wouldn't be vscode anymore.
        
       | capableweb wrote:
       | That's pretty cool!
       | 
       | Wrote a file to test.js with the following:
       | console.log(navigator)
       | document.querySelector("#pastebtn").innerText = "PASTE"
       | 
       | And then run it with `:!test.js` and it executes it in the
       | current browser context. Editor editing itself :)
        
         | alex_smart wrote:
         | That's very Emacs of Vim.
        
           | tomsthumb wrote:
           | bang to run a command is from ed. thats pretty core vi
        
         | espadrine wrote:
         | I am impressed that it even supports pasting with "*p
        
       | varunkmohan wrote:
       | Wow, very smooth to use! Would be extra neat if this could
       | support plugins as well.
       | 
       | We're building out a free AI code completion tool, Codeium that
       | will support Neovim as an IDE and would love to hook into this as
       | well.
        
       | rav wrote:
       | It makes me sad every time I try a Vim with a non-zero
       | 'scrolloff' setting. Since I started using Vim I have learned to
       | use H and L efficiently when navigating, but non-zero 'scrolloff'
       | changes where H and L move the cursor to - and somehow non-zero
       | 'scrolloff' is now the default in Ubuntu if a user hasn't created
       | a vimrc file (even an empty file will do).
       | 
       | Note that this seems to work much better in Chrome than in
       | Firefox - when I press Ctrl in Firefox, it activates Visual Block
       | mode (so e.g. Ctrl-D, Ctrl-U, Ctrl-O, Ctrl-I won't work).
        
       | pyrolistical wrote:
       | Is safari still evicting indexeddb after 7 days?
       | https://web.dev/storage-for-the-web/
       | 
       | If so, Indexeddb should only be used to store "unsaved" files for
       | safari.
       | 
       | Chrome and Firefox support https://caniuse.com/mdn-
       | api_permissions_persistent-storage_p...
       | 
       | But that implies if the user denies persistent storage, then
       | indexedb should be again only used to store "unsaved" files
        
       | csdvrx wrote:
       | If you are into this, note there's also a JavaScript online Vim:
       | https://wang-lu.com/vim.js/emterpreter/vim.html
        
         | avnigo wrote:
         | The WASM version does seem considerably more snappy to me.
        
       | b33j0r wrote:
       | Guys, I love the topic.
       | 
       | Save me. I'm losing faith in the pursuit. Typed the headline into
       | ChatGPT and it gave me every single step.
       | 
       | What the heck are we going to do now?
        
         | b33j0r wrote:
         | I'm getting criticized a lot for noticing that the nature of
         | our work has changed.
         | 
         | I suggest that we simply converse on the topic, but I guess it
         | sounds like BS to people.
         | 
         | Heed my warning, you can get a model of our career to write any
         | program you can phrase. I'm telling you, for you.
        
           | alexeldeib wrote:
           | ChatGPT is generative word salad with high accuracy. Your
           | previous comment was somewhat doom and gloom without
           | providing interesting content for discussion -- like the
           | conversation, output, and a running example as a peer
           | mentioned. There wasn't much interesting to discuss which
           | hadn't been said about chatgpt already.
           | 
           | Fwiw, I think it's a force multiplier, not a replacement. It
           | requires skill to determine the quality of the output, can
           | raise the bar of inexperienced developers by producing output
           | more quickly and accurately than they could, empowers
           | experienced developers by generating boilerplate faster than
           | they can, and can improve learning by providing examples for
           | specific use cases.
           | 
           | But when it's wrong, it has no idea. It often answers riddles
           | with intuitive but wrong answers. It provides code that
           | doesn't compile. Explains answers with logic that is entirely
           | wrong. Push it and you'll see.
           | 
           | It's impressive but not apocalyptic. See another highly
           | ranked post on the idea of "AGI hard" if you think I'm moving
           | goalposts.
        
           | binarymax wrote:
           | Did you actually use the source suggested and get it running
           | somewhere?
        
       | andirk wrote:
       | Am I the only person on earth who uses plain vi?
        
       | cassepipe wrote:
       | That's great ! I have been looking for such a quick online vim
       | experience for quite some time.
       | 
       | A month ago I did find what I consider to be even better : make
       | of any textarea on any page a neovim instance with the firenvim
       | extension (thanks to which I am writing this comment _in_ neovim
       | _in_ my browser!)
       | 
       | It's not even a vim-like experience, it's literally your
       | configured neovim in the browser !
       | 
       | Somehow I haven't managed to get it to the front page (this is
       | not my creation but I am a big fan since I have been looking for
       | this for so long)
       | 
       | I even get autocompletion and all coding niceties in the little
       | code playgrounds that are all the rage in nowadays tutorials
       | 
       | https://github.com/glacambre/firenvim
       | 
       | https://addons.mozilla.org/en-US/firefox/addon/firenvim/
        
         | antonmosich wrote:
         | Wow I just looked into that project and it really seems to work
         | great. I really struggled a lot when typing longer responses in
         | my Browser when trying to input my vim commands, so hopefully
         | that will help.
        
         | finnh wrote:
         | Ah thank you! I've been using wasavi on Chrome but real-vim may
         | be enough to pull me back to Firefox.
        
           | glacambre wrote:
           | Firenvim is also available on Chrome (although I do recommend
           | using Firefox for browser monoculture avoidance :) ) : https:
           | //chrome.google.com/webstore/detail/firenvim/egpjdkipk...
        
             | spurgu wrote:
             | Please give your vote here:
             | https://connect.mozilla.org/t5/ideas/macos-allow-custom-
             | keyb...
             | 
             | If that simple feature gets implemented there'll be at
             | least one more FF user in yours truly. :)
        
       | dontchooseanick wrote:
       | Does kinda work
       | 
       | Perfect :
       | 
       | * Using :left and V , set ts=4 sts=4 sw=4
       | 
       | * Recording macros with q
       | 
       | * Main vim combos - it's definitely vim
       | 
       | Fails :
       | 
       | * Typing { or } on a MacBook Air under Firefox - don't know which
       | of this settings cause the bug. Reproducibly, { does not work
       | 
       | * Replaying a macro containing { or any error
       | 
       | Kudos for the compilation (emscripten ?) and Brace for impact
       | (the incoming bugs) :)
        
       | naillo wrote:
       | Really cool! Excuse me for my naivete but is there a benefit to
       | writing normal JS but then compiling it to wasm? Does that make
       | it faster? Was kinda expecting C or some other language when
       | viewing through the source on github.
        
         | brrrrrm wrote:
         | I believe the vim.wasm is pre-compiled and checked in as a
         | "binary." The javascript written is a runtime wrapper
        
       | hpen wrote:
       | Yay, it's like vim only shittier!
        
       | frankzander wrote:
       | What's the use case for that?
        
         | __MatrixMan__ wrote:
         | To see if it's possible.
        
         | codetrotter wrote:
         | From the linked page:
         | 
         | > Why use Vim Online Editor?
         | 
         | > 1. Because you love vim.
         | 
         | > 2. Because you don't have access to vim somehow (maybe you're
         | on a Chromebook that doesn't allow access to the system)
         | 
         | > 3. Especially if you're on Windows and you still want to use
         | vim.
         | 
         | > 4. Because you want a notepad of some sort in the browser,
         | and you want to use vim bindings instead of normal notepad.
        
           | codetrotter wrote:
           | Point 3 I don't quite understand though. Last time I was
           | using Windows, several years ago, I was perfectly able to run
           | gVim on it. I can only imagine that with the subsystem for
           | Linux and other things that have been added since then,
           | surely it has only become easier to run Vim.
           | 
           | Last time I was actively using Windows was in the late WinXP
           | / early Win7 era. But I don't see why Win 10 / 11 would make
           | running Vim difficult.
           | 
           | I do agree with all of the other points though.
        
             | OkayPhysicist wrote:
             | neovim also has windows builds now, daily driver for me.
        
             | dontchooseanick wrote:
             | +1
             | 
             | As a heavy vim user, I've literally been using gvim.exe
             | every day on Windows for the past decade
             | 
             | https://www.vim.org/download.php#pc
        
       | feklest wrote:
       | That is very cool, nice to see vintage editors hosted in a modern
       | environment.
       | 
       | What I'd really like to see return is an online version of
       | EDIT.COM, and maybe also its host binary QBASIC.EXE, not just for
       | the nostalgia but because it was a pretty decent editor for the
       | time, it even supported editing binary files if you didn't have a
       | hex editor to hand, though you had to use Alt+(numpad) for most
       | characters.
        
       ___________________________________________________________________
       (page generated 2023-01-05 23:00 UTC)