The Changelog: Software Development, Open Source - Why Neovim? (Interview)
Episode Date: August 31, 2021This week Neovim core maintainer TJ DeVries joins Jerod and guest co-host Nick Nisi (from JS Party) to follow-up on our Vim episode with a conversation dedicated to Neovim. TJ tells us why Neovim was ...created in the first place, how it differs from Vim, why Lua is awesome for configuration and plugins, what LSPs are all about, the cool tech inside tree-sitter, and how he's writing his own fuzzy file finder for Neovim called Telescope.
 Transcript
 Discussion  (0)
    
                                         What's up? Welcome back. I'm Adam Stachowiak, and you are listening to The Change Log.
                                         
                                         On this show, Jared and I talk with the hackers, leaders, and innovators from all areas of the software world.
                                         
                                         We face our imposter syndrome, so you don't have to.
                                         
                                         Today on The Change Log, Jared is joined by his special co-host, Nick Nisi from JS Party,
                                         
                                         for a follow-up on our Vim episode, talking to TJ DeVries about NeoVim.
                                         
                                         TJ is a core maintainer of NeoVim, and he tells us why it was created in the first place,
                                         
                                         how it differs from Vim,
                                         
                                         why Lua is awesome for configuration and plugins,
                                         
    
                                         what LSPs are all about,
                                         
                                         the cool tech inside TreeSitter,
                                         
                                         and how he's writing his own fuzzy file finder
                                         
                                         for NeoVim called Telescope.
                                         
                                         Of course, big thanks to our partners,
                                         
                                         Linode, Fastly, and LaunchDarkly.
                                         
                                         We love Linode.
                                         
                                         They keep it fast and simple.
                                         
    
                                         Get $100 in credit at linode.com slash changelog. Our bandwidth is provided by Fastly and LaunchDarkly. We love Leno. They keep it fast and simple. Get $100 in credit at leno.com
                                         
                                         slash changelog. Our bandwidth is
                                         
                                         provided by Fastly. Learn more at
                                         
                                         fastly.com and get your feature flags
                                         
                                         Powerful LaunchDarkly. Get a demo at
                                         
                                         launchdarkly.com
                                         
                                         This episode is brought
                                         
                                         to you by Gitpod. Gitpod lets you spin up
                                         
    
                                         fresh, ephemeral, automated dev environments
                                         
                                         in the cloud in seconds. I'm here with Johannes Landgraf, co-founder by Gitpod. Gitpod lets you spin up fresh, ephemeral, automated dev environments in the cloud in seconds.
                                         
                                         And I'm here with Johannes Landgraf, co-founder of Gitpod.
                                         
                                         Johannes, GitHub made a big announcement recently with Codespaces,
                                         
                                         validating that it is now time for dev teams to consider what automated dev environments can do for them.
                                         
                                         What do you have to say to that?
                                         
                                         I'd say, welcome to the party, GitHub and Microsoft.
                                         
                                         No, honestly, we were very excited because it validated to the developer community what
                                         
    
                                         we have been pioneering over the last years.
                                         
                                         That developer environments need to be automated and ephemeral.
                                         
                                         We are now at the right place and the right time to move software development to the cloud
                                         
                                         for everybody, not just for developers working for the Googles, Facebooks or Shopifys who
                                         
                                         left local development already for several years.
                                         
                                         Gitpod is open source and provisions for every development team on GitHub, GitLab, and Bitbucket cloud-powered dev environments. You can access
                                         
                                         your developer environments via upstream VS Code running on your desktop or in the browser and soon
                                         
                                         also all JetBrains IDEs. Very cool. If this gets you excited, learn more and get started for free
                                         
    
                                         at gitpod.io. Gitpod is free for individual developers for 50 hours a month, can be self-hosted, and
                                         
                                         is available for every developer today.
                                         
                                         Again, Getpod.io. we are back for a follow-up episode to episode 450 on vim first of all i want to say that i
                                         
                                         appreciate all of the positive feedback around our vim episode we put a lot of work into that
                                         
                                         and it sounds like everybody enjoyed it we're're happy to hear that. And one of the things that we heard over and over and over and again was
                                         
                                         when NeoVim, so similar to the crypto kitties say when moon, the NeoVim kitties were saying,
                                         
                                         hey, you've done Vim. Now give us the NeoVim treatment. So by popular demand, we have TJ
                                         
                                         DeVries here to talk NeoVim with us. TJ,
                                         
    
                                         thanks for coming on the show. Yeah, it's my pleasure. Really excited to chat and just
                                         
                                         explore some fun topics together. We are excited too. And I have with me not Adam Stack, it is
                                         
                                         Nick Nisi, my co-patriot at JS Party. Nick, welcome to the changelog.
                                         
                                         Hoi hoi. I'm happy to be here, excited to talk about NeoVim.
                                         
                                         And just for the record, it wasn't just me hounding Jared to get a NeoVim episode.
                                         
                                         That wasn't your bot just telling me over and over again.
                                         
                                         I can't confirm or deny that, but it wasn't me specifically.
                                         
                                         Well, if you know JS Party, you know Nick is often trying to turn it into Vim Party.
                                         
    
                                         And he brings up Vim whenever he has opportunity.
                                         
                                         And he has been, for a little while, a NeoVim user.
                                         
                                         How long have you been on NeoVim, Nick?
                                         
                                         It's been a couple of years.
                                         
                                         But I'm a recent convert to the NeoVim 0.5 slash Lua lifestyle that I'm excited to talk about today.
                                         
                                         I will also confess that after our Vim episode and our Modern Unix tooling episode, I've been reinvigorated
                                         
                                         and I installed NeoVim and I threw away my Vim config and I'm doing survivor style,
                                         
                                         which configs make it into the new config game, line by line, and I'm having lots of fun.
                                         
    
                                         I feel like a kid again, just tweaking and changing and kind of relearning how to use Vim
                                         
                                         because I've been using it for a very long time in a dual capacity with a full-time GUI.
                                         
                                         So I was on Sublime Text for years.
                                         
                                         I switched to VS Code, and I always had Vim open in a shell,
                                         
                                         and I would use it on servers, and I would use it kind of casually.
                                         
                                         As you know from that episode, I always use Vim mode whenever available,
                                         
                                         but I was not using it full-time as my programming editor until a few weeks ago.
                                         
                                         So I'm back and I'm giving NeoVim a try and I'm having a lot of fun.
                                         
    
                                         But TJ, give us some of the backstory here because NeoVim has been around for a while
                                         
                                         and we've never done a show on it despite multiple cries to do so.
                                         
                                         Who created NeoVim?
                                         
                                         When did they start it?
                                         
                                         Why?
                                         
                                         Why did this have to exist, et cetera?
                                         
                                         Give us the backstory.
                                         
                                         Yeah, so I think the main person who first started it was Tiago Taruta. When did they start it? Why? Why did this have to exist, et cetera? Give us the backstory.
                                         
    
                                         Yeah, so I think the main person who first started it was Tiago Taruta on GitHub.
                                         
                                         And it was probably about 10 years ago.
                                         
                                         I don't remember the exact date. The main thing that happened was Taruta was really interested in getting sort of some of the ability to run like external jobs asynchronously from within Vim
                                         
                                         right and that was the first main push and Teruda submitted some patches to Vim dev which is the
                                         
                                         mailing list for Vim but unfortunately at the time Teruda the patches didn't work for Windows
                                         
                                         and there were some other problems that would have broken compatibility with like a lot of the places that vim expects to build and so due to that it was
                                         
                                         sort of like this struggle of i don't know struggles the right word but just sort of a
                                         
                                         difficulty trying to figure out how these features could work within vim and all the places that vim
                                         
    
                                         needs to build and the size requirements and all these other things, right? Which are like super valid concerns to have if you're on all the places that Vim can build,
                                         
                                         right?
                                         
                                         Like, do you want to still be able to do that?
                                         
                                         That's one of the selling points is sort of the universalism of where Vim is.
                                         
                                         He didn't have an old Solaris machine to test it on?
                                         
                                         Right.
                                         
                                         He did not make any patches that worked there.
                                         
                                         So basically at that point, Teruda was kind of like,
                                         
    
                                         well, I don't want to necessarily have to support those.
                                         
                                         Like I want to do different things that can work differently.
                                         
                                         And I want to like push forward in some of these areas
                                         
                                         that might make us end up in a place
                                         
                                         that's not the same place that Vim is, right?
                                         
                                         And so Teruda basically started NeoVim.
                                         
                                         And then from there, Teruda also had several other
                                         
                                         sort of like large ideas in combination with people like Justin MK, who's still part of the
                                         
    
                                         project, as well as Zix, who's one of the largest early contributors to NeoVim. And they added other
                                         
                                         things like remote plugin support and started doing Lua scripting and things like that. But that was sort of the main branching
                                         
                                         point that started to allow NeoVim to go down a separate path from Vim. Exactly how different
                                         
                                         is it? Yeah, so this is, I think, a pretty common misconception that Vim and NeoVim are like very,
                                         
                                         very, very different. Vim and NeoVim still share much of the same code base. NeoVim still ports patches
                                         
                                         from Vim like all the time. We have some contributors, especially like Jan Lazo,
                                         
                                         who in the last 0.5 release helped to get us to over a thousand Vim patches ported from Vim
                                         
                                         into NeoVim. So there's still sort of like an insane amount of similarity between the
                                         
    
                                         two right and if you open them up like you won't really see in effect like any differences from uh
                                         
                                         like lightly configured and it.vim or vim rc whatever you you want you know that's an important
                                         
                                         sort of like backwards compat thing that we're interested in trying to work hard on.
                                         
                                         There are some things that are removed from NeoVim that are in Vim.
                                         
                                         Like, for example, NeoVim doesn't ship with a GUI by default like GVim.
                                         
                                         NeoVim sort of removed all of the code that tightly coupled it to a GUI application and instead implements GUIs over RPC.
                                         
                                         So that's like an example of if you
                                         
                                         were expecting to be able to just open up GVim, but with NeoVim, that doesn't happen because those
                                         
    
                                         two things have been sort of decoupled as well as various other things. Like if you installed NeoVim,
                                         
                                         it wouldn't install like view the command view, which is like opening them in read-only mode
                                         
                                         because you can instead do like NVim dash dash r or something i don't remember what it
                                         
                                         is off the top of my head sorry everybody but you could just alias that to be the same and then it
                                         
                                         would uh retain the same behavior so of course there are some you know similarities that are
                                         
                                         obvious at the start and some things that are a bit different when you're first encountering them
                                         
                                         but in general there's a incredible amount of overlap still between the two projects, I would say.
                                         
                                         That would be my experience so far is that I haven't noticed a difference in just like
                                         
    
                                         regular text editing.
                                         
                                         Like I could just alias it and never notice.
                                         
                                         Now, once I started configuring it and trying to do some more advanced things, you start
                                         
                                         to see where the seams are, the differences are.
                                         
                                         Go ahead, Nick.
                                         
                                         What were you going to say?
                                         
                                         Oh, I was going to say something similar in that when I started using it, I actually started using it, I think for the same reason that
                                         
                                         it might've been created now that I'm hearing that. And that's because I heard about this async
                                         
    
                                         job support and I had just gotten into like, you know, configuring linting and things like that.
                                         
                                         But every time it would lint, it would like completely freeze Vim. And that was just super
                                         
                                         annoying. So then I heard about NeoVim and how it could do that asynchronously. And so I set it up,
                                         
                                         but I was like, this is just temporary. I'm sure Vim's going to catch up and I'm just going to
                                         
                                         switch back to it. So I installed it and I did that alias, alias Vim equals nvim. And I still
                                         
                                         have that. And that's still how I invoke it. But that alias is like five years old at this point
                                         
                                         or five or six years old. And now I, yeah, it's just interesting that I really can't tell the difference or couldn't
                                         
                                         tell the difference in the beginning, aside from like where your config lies and that. But
                                         
    
                                         otherwise, when you start up, it said, instead of Vim, it said nvim. That was pretty much the
                                         
                                         big difference. Yeah. And like, just to mention as well, like Vim does have those capabilities
                                         
                                         now, right? Like it does have asynchronous jobs and other things. I just figure i want to throw that out there in case people are interested in adding
                                         
                                         some of those things to their own vim config but it does exist in both now yeah that's one of the
                                         
                                         cool things that i've noticed i wonder if neo vim is directly to blame or to a credit for this but
                                         
                                         it seems like vim's development picked up with regard to performance,
                                         
                                         asynchronization, and certain things that maybe weren't being advanced. And maybe there was a
                                         
                                         little bit of, you know, competition spurs innovation thing going on. That was just my
                                         
    
                                         casual observation. Is that your thoughts as well? Or if we asked Bram about it, would he say,
                                         
                                         yeah, I saw NeoVim coming and I was like, holy cow, I need to start doing more? Or
                                         
                                         what's the story there? I actually think that this is probably like a common misconception i think
                                         
                                         bram likes implementing things that he thinks people are going to use and like it wasn't really
                                         
                                         clear like from the community that this was an important thing for them to like have previous
                                         
                                         to this my personal opinion obviously I'm not inside
                                         
                                         Bram's head and we've only spoken just casually a few times, you know, on GitHub issues or email
                                         
                                         is that Bram just was like, oh, there's people requesting this now in Vim dev. And they're like
                                         
    
                                         thinking about it a lot, like, oh, we can implement that. And so then he implements it
                                         
                                         and it works well. And then he's happy with like the solution i'm not a hundred
                                         
                                         percent confident that like the neo vim like spurred him on to do that i don't necessarily
                                         
                                         think that that's exactly the case i think it's much more that bram saw that people in vim dev
                                         
                                         were like this is cool we should have this and he was like okay i'll make one that works well
                                         
                                         for inside of him and then that's what he did. Yeah. And to that point, both of them have
                                         
                                         like async and other similar features, but have they arrived there in different ways? Like, is it
                                         
                                         different APIs or ways to like invoke async, for example? Yes. So to like start external jobs,
                                         
    
                                         the jobs APIs aren't compatible. There are like plugins that sort of wrap them to make them very similar. So you could like have one that's shared and you call my shared lib dot
                                         
                                         start job or whatever, right.
                                         
                                         And you could be doing that and sort of experiencing working them in both,
                                         
                                         but their implementations are different.
                                         
                                         Like NeoVim is really focused a lot on building around like lib UV,
                                         
                                         which is right.
                                         
                                         The stuff that like, I think node,
                                         
                                         I remember correctly is built on top of probably know about that in js party land right so like
                                         
    
                                         neo vim's event loop and stuff is built around like that and so we use lib uv bindings to do
                                         
                                         like the async jobs and many of our other event loop type things that we're interested in doing
                                         
                                         and i haven't looked in depth at what then how it
                                         
                                         actually implements it. If I recall correctly, they're not using lib UV. So like the underlying
                                         
                                         implementation is not the same. Right. But their APIs are like pretty similar. And it's possible
                                         
                                         to write code that works in both. It's sometimes a bit annoying, but that's okay.
                                         
                                         And with the help of those like community plugins, is the burden on like plugin
                                         
                                         developers kind of lessened or almost non-existent by that? Or does that kind of cause some issues?
                                         
    
                                         If all you want to do is run a job asynchronously, then it is not like incredibly difficult. There
                                         
                                         are other things that are much more like difficult to maintain shims between or some things that are very specific to Vim or very
                                         
                                         specific to NeoVim that either haven't been like unified or never will be. For example, right now
                                         
                                         in Vim, there's APIs, they're all prefixed with pop up underscores, there's like pop up underscore
                                         
                                         create or pop up underscore menu or things like this, right? And they allow you to make little
                                         
                                         floaty windows. NeoVim currently doesn't have those APIs and we have not a shared floating window implementation
                                         
                                         underneath the hood. So it's not necessarily simple to just like port the patches over and
                                         
                                         get the results. But I'm working on a project and other people are contributing as well to create
                                         
    
                                         like Lua API that we can create windows with. And then we could expose a thin
                                         
                                         wrapper over that back in Vim L that's the same or looks the same to the user so that you could
                                         
                                         write plugins in Vim script and they would work in Vim or NeoVim, even though the underlying
                                         
                                         implementations aren't the same. So it's not that we've completely
                                         
                                         abandoned any hope of like still making some things the same. But like, right now, if you
                                         
                                         wanted to have floating windows in one versus the other, you'll have to write very different code.
                                         
                                         But if it's literally just like, I just want to spin up a job and have it run externally,
                                         
                                         you could probably have that working for your plugin in like five or 10 minutes for simple cases, I would say.
                                         
    
                                         So it sounds like the longer it goes,
                                         
                                         the less underpinnings they share.
                                         
                                         You mentioned that there was a thousand patches or so in the 0.5 that were like direct ports from Vim into NeoVim.
                                         
                                         Do you expect over the course of NeoVim's life that that number would decline
                                         
                                         over time?
                                         
                                         Or do you think there's enough foundation that's shared that there's always going to
                                         
                                         be massive amounts of shared porting the solutions that come with over there onto the NeoVim
                                         
                                         side?
                                         
    
                                         In general, I try not to predict the future too much because it's a difficult game to
                                         
                                         play.
                                         
                                         But what trend are you watching?
                                         
                                         Give us the trend.
                                         
                                         Yeah.
                                         
                                         In certain areas of the code,
                                         
                                         I would see us still porting patches for a long time.
                                         
                                         And port is, in some cases, very loose.
                                         
    
                                         It might be literally just applying style differences
                                         
                                         and putting them in,
                                         
                                         and then porting tests written in Viml into Lua
                                         
                                         because we write most of our tests in Lua.
                                         
                                         So some of those patches are very simple,
                                         
                                         and they are almost direct applications. So there are some areas that I would expect that to
                                         
                                         like happen for a long, long time, like a bunch of things and like eval.c, which is where you know,
                                         
                                         Vim script things get done, like it's like, okay, it was simple, we just added this new argument to
                                         
    
                                         a Vim script function. Okay, cool, we can try and port that over and then we can have
                                         
                                         that the same in both but in other areas there already exists no way to port patches for example
                                         
                                         like for floating windows code we have two separate implementations so it makes no sense
                                         
                                         to port any of those patches they get marked as not applicable for neovin But it may be that we, in effect, port some of those patches over in
                                         
                                         attempts to keep the community as close as we can, right? Like with the example I gave of the pop-up
                                         
                                         APIs, where Neovin would still like to implement those so that people don't have to worry about
                                         
                                         which one they're writing for, and they can continue serving both communities easily.
                                         
                                         More and more startups are using Retool to focus their time on their core product. And that's exactly why they launched Retool for Startups.
                                         
    
                                         This is a program that gives early stage founders free access to a lot of the software needed for great internal tooling.
                                         
                                         And Retools worked with thousands of startups.
                                         
                                         And the trend line they noticed was technical founders spending tons of time building internal tools.
                                         
                                         That means at this critical stage, these founders were distracted from their core product.
                                         
                                         The goal is simple, make it 10 times faster to build the admin panels,
                                         
                                         CRUD apps, and the dashboards most early stage teams need.
                                         
                                         And Retool has bundled together a year of free access to Retool
                                         
                                         with over $160,000 in partner discounts to save you money
                                         
    
                                         while building Retool apps with common integrations like AWS, MongoDB, Brex, and Segment.
                                         
                                         There is so much you can do with Retool.
                                         
                                         You can use these free credits to build tools that join product and billing data into a single customer view,
                                         
                                         tools that convert manual workflows into fully featured apps for your team,
                                         
                                         or tools that help non-technical teammates get access to your database to read and write data, analyze, and query.
                                         
                                         These are just a few examples.
                                         
                                         Learn more, apply and join lightning demos
                                         
                                         at retool.com slash startups.
                                         
    
                                         Again, retool.com slash startups.
                                         
                                         So let's talk Lua.
                                         
                                         Yeah, that sounds good.
                                         
                                         On our Vim episode, I asked everybody what frustrations they have with the editor,
                                         
                                         and Gary Bernhardt said, Vim script.
                                         
                                         I'm pretty good at complaining, so I'll limit myself to just one thing, Vim script.
                                         
                                         To understand Vim's relationship to its scripting language, let me contrast with Emacs.
                                         
                                         Emacs is almost like an operating system
                                         
    
                                         that happens to ship with an editor.
                                         
                                         And long-term Emacs users will effectively end up
                                         
                                         rewriting parts of that editor sometimes,
                                         
                                         but it's still Emacs because the layers underneath are still Emacs.
                                         
                                         So Emacs Lisp is a whole programming language.
                                         
                                         It was designed to be a programming language.
                                         
                                         Vim is not like this at all.
                                         
                                         Vim was designed to be a text editor. Itim is not like this at all. Vim was designed to be a text editor.
                                         
    
                                         It had a configuration language.
                                         
                                         That configuration language grew over time
                                         
                                         to acquire normal programming constructs,
                                         
                                         and that is what we call VimScript.
                                         
                                         So it's a hodgepodge, and it wasn't sort of designed all at once,
                                         
                                         and I don't think it's controversial to say it's kind of a mess.
                                         
                                         So that is the most frustrating part of Vim for me,
                                         
                                         and it also is one of the reasons that I avoid configuration when I can.
                                         
    
                                         I have a very sort of mostly stock Vim configuration
                                         
                                         despite 15 years, and VimScript is why.
                                         
                                         So this is something NeoVim's taking head on, isn't it?
                                         
                                         Yeah, I think NeoVim's choice of choosing Lua
                                         
                                         as what I would consider sort of like
                                         
                                         the de facto future of configuring NeoVim.
                                         
                                         Not that it won't be possible to write VimScript
                                         
                                         or that we will like remove the engine or anything like that.
                                         
    
                                         That is not happening.
                                         
                                         We will continue to support that and allow that to happen.
                                         
                                         I think Lua has invigorated a lot of people to be interested in both contributing
                                         
                                         and sort of being able to explore making NeoVim
                                         
                                         more their own. Not only is like Lua like a programming language that has lots of external
                                         
                                         libraries that you could install with like Lua rocks and things like that. And there's a lot of
                                         
                                         other external resources for learning Lua, but there's also really cool things like LuaJIT,
                                         
                                         which allows for crazy performance that's just like sort of insane.
                                         
    
                                         We'll talk probably a little bit about Telescope later.
                                         
                                         But like Telescope can find and fuzzy sort literally like tens of thousands of items as you're typing in one main thread attached to the UI.
                                         
                                         We currently have some stuff in progress to do a few things
                                         
                                         in a little bit smarter way so it doesn't block. But regardless, it's doing an incredible amount
                                         
                                         of work like as you're typing and that sort of like performance is just not possible with
                                         
                                         old Vim script. It's true that Bram's working on Vim 9 script and there will be performance
                                         
                                         improvements there. There's a lot of people I know that i've talked to personally that are excited to use lua because there's applications
                                         
                                         outside of neo vim right they're like oh i used this for scripting before in a video game or i've
                                         
    
                                         used this in you know whatever c application or oh i've embedded this here so they have sort of like
                                         
                                         previous experience or future experience that they'd like to have with the language that maybe makes it more accessible and exciting for them, as well as being fast.
                                         
                                         Given NeoVim's architecture on top of libUV, was JavaScript considered as a potential language?
                                         
                                         It was, I think, considered but discarded. I mean, JavaScript's ability to be embedded easily
                                         
                                         inside of a C application is not, I think, considered one of its strong suits,
                                         
                                         as well as sort of its minimalism, right?
                                         
                                         I mean, Lua can be run and is run inside of some Linux kernels,
                                         
                                         so the portability and the size and all of these other things
                                         
    
                                         are really great features,
                                         
                                         as well as NeoVim, I guess, pinned in a way to lua 5.1 which is uh
                                         
                                         the language is complete there's no changes there's no new things being added to the language
                                         
                                         there's no things being removed which is really nice for writing a plugin now and having it work
                                         
                                         in 15 years as opposed to not throwing shade at anything in j, but I feel like it is a common problem that I see
                                         
                                         people talk about on the internet that yesterday my NPM build worked and tomorrow it does not,
                                         
                                         not to mention, you know, changes within the language itself. So there's a lot of things
                                         
                                         about Lua that provide sort of an incredible match with NeoVim. Like I said, embeddability,
                                         
    
                                         size, portability, and the fact
                                         
                                         that it's sort of static are really great things for us in terms of shipping a small binary that
                                         
                                         can work in a lot of places. Yeah, it almost seems like Lua was purpose-built for use cases like this
                                         
                                         one. Yes, that is exactly what the design principles of Lua are. One of the primary design principles
                                         
                                         is embeddability. So yes, this is exactly the case where you would want to use Lua are. One of the primary design principles is embeddability.
                                         
                                         So yes, this is exactly the case where you would want to use Lua. You do not want to use Lua to write your 10 million line monolith. That is not the purpose of the language. The purpose of the
                                         
                                         language is to be embedded inside of other languages to provide relatively safe and easy ways to script and extend something,
                                         
                                         right?
                                         
    
                                         Like you're not going to have a memory like leak in the same way or a memory problem with
                                         
                                         like writing C to script your editor or something like that.
                                         
                                         That's not exactly the same kind of fun experience, at least for me.
                                         
                                         Right.
                                         
                                         Now, Nick, I know that you've been porting your Vim config
                                         
                                         over to Lua in the last couple of weeks, because as TJ mentioned, NeoVim, you can configure it in
                                         
                                         Vim script and you can also configure it in Lua. You can have it in a.vim or is it a.lua? Is
                                         
                                         that the same file name? Yeah, you can have either one. You should not have both. But Nick, you've
                                         
    
                                         had both here for a while or I don't know how you've been managing that. What's been in your experience? Because I don't think you've used
                                         
                                         Lua previous to this. Is that right? That's true. I have not used Lua before this. And
                                         
                                         I initially was hesitant to even start because I was just like, I don't want to learn Lua. I don't
                                         
                                         have any practical application for it. But then I was like, wait a minute, I'm learning VimScript.
                                         
                                         I don't have any practical application for that outside of this right the thing that really pushed me into it as i mentioned i've been kind of a recent convert to
                                         
                                         that i i know that a lot of people have been using like nightlies of neo vim like i guess 0.5 maybe
                                         
                                         i'd call it the lua support version for a while but i only recently jumped on that and started
                                         
                                         using it and it was because i saw some cool plugins that I wanted to
                                         
    
                                         use. And so it initially just started out with me installing the nightly of NeoVim and then just
                                         
                                         having my init.vim and putting in like a Lua require to open up the configuration for like a
                                         
                                         specific plugin and be able to use that. And I kind of didn't like that as I started adding more
                                         
                                         and more plugins, I didn't like that. I just kept calling out to Lua for that. And I kind of didn't like that as I started adding more and more plugins, I didn't
                                         
                                         like that. I just kept calling out to Lua for that. And so I started like, I just went in and
                                         
                                         as an experiment to see like what it would take to translate my, like at the time, 600 something
                                         
                                         line of init.vim into init.lua. At the end of it, it came out as like 240 lines of Lua, which was pretty surprising.
                                         
                                         But that's because I like split out plugins into its own plugins.lua that set up all of
                                         
    
                                         that.
                                         
                                         But that was still only like 50 lines.
                                         
                                         I lost 200 lines in there somewhere and I feel like it's more powerful now.
                                         
                                         And that's losing, not like losing your car keys.
                                         
                                         That's like losing weight.
                                         
                                         You know, that's the kind of losing you want to do.
                                         
                                         Exactly.
                                         
                                         Yeah.
                                         
    
                                         But I guess from your perspective, TJ, would you say that there's a big benefit to converting like your configuration to
                                         
                                         lua or is this was the primary intention to be more like for plugin authors to be able to write
                                         
                                         more robust plugins yeah so there's like a couple i guess sort of aspects to chat about like in that
                                         
                                         area the first one is i don't think that we have yet implemented everything in NeoVim to make it like super elegant and easy to write your
                                         
                                         entire configuration in Lua. Like that's going to take time. Like I have a work in progress PR for
                                         
                                         auto commands, for example, that would allow you to directly pass Lua refs inside and like NeoVim in the C code will hold
                                         
                                         a reference to that Lua ref until it's ready to release it and then release it. But that requires
                                         
                                         like a lot of changes, but that's a story for a different day if we want. But the point being,
                                         
    
                                         you still basically have to write your auto commands in Vim script, even if you're like
                                         
                                         inside of Lua. I have a lot of InVim execs in there for that
                                         
                                         stuff. Yeah, exactly. So like that doesn't really give you any necessarily gain. So there's some
                                         
                                         parts of my config that are still in VimScript and probably will be for a long time. I mean,
                                         
                                         the other part too, is like, if it's working really great for you, I don't see any reason
                                         
                                         to change it over. Like it's going to work well, like to do a lot of the set operations or like simple
                                         
                                         things like that like vim script is a dsl for doing those it will work probably nicer than we
                                         
                                         can sometimes do inside of lua although some of them have sort of been mitigated by things like
                                         
    
                                         vim.opt which allows you to sort of use lua and metatables to set Vim options more like ergonomically, I guess.
                                         
                                         So I would say like there are things that are nice about setting up your config in Lua. Like,
                                         
                                         you know, you can use closures really easily and there's a lot of ergonomics about passing
                                         
                                         around functions or doing validation or whatever that is. But I don't see like a whole lot of gain
                                         
                                         of like just switching over to init.lua right now.
                                         
                                         I think a lot more of the benefits
                                         
                                         are about extending like particular parts
                                         
                                         of your, you know, configuration.
                                         
    
                                         Maybe you have a complicated function
                                         
                                         that, you know, shelled out to some commands
                                         
                                         and parts some strings
                                         
                                         and then would do something
                                         
                                         within a certain buffer of a certain file type.
                                         
                                         Well, that might be a lot nicer to write in Lua than it is in Vim script, right?
                                         
                                         But like changing set number to vim.op.number equals true, I don't know.
                                         
                                         That doesn't really strike me as like, wow, that's so mind blowing.
                                         
    
                                         Pulling me out right now.
                                         
                                         So maybe someday I would say like without hesitation you should
                                         
                                         just port it over but i think the primary focuses are much more about scripting the editor in a more
                                         
                                         sort of deep and customizable way than just like setting options if that makes sense for sure and
                                         
                                         yeah i think that from that translation a big thing that i really liked like yeah auto commands
                                         
                                         and things like that i I'm just like,
                                         
                                         basically it's just a string of Lua in my config that's being run. But other things like, um,
                                         
                                         I use a plugin I've used for a plugin for years called Vim startify that lets me kind of configure what the Vim start screen looks like. And, you know, it shows the recently used files and things
                                         
    
                                         like that, but it has a big like object that you configure and tell it exactly what you want it to
                                         
                                         show and do and all of that. And doing that in Vim script, like I've always just hated that syntax
                                         
                                         because you have to like, as you put things on a new line, you have to have the forward or the
                                         
                                         backslash on it everywhere. And it's, it was just really annoying. But things like that, being able
                                         
                                         to use like a Lua, do you call that a table? Yeah. Yeah, a Lua table to hold all of that information and then just be able to access it from Vim.
                                         
                                         And I can do things like access other objects like that through the, I think it's underscore
                                         
                                         capital G for the global.
                                         
                                         And then being able to access from Lua Vim functions through Vim.fn.
                                         
    
                                         That stuff is really cool, being able to do all of that and i think that
                                         
                                         i'll probably keep my config in lua going forward and just kind of adopt the new features as they
                                         
                                         come in like being able to set auto groups and things or like auto commands and things like that
                                         
                                         but yeah right now that's just glorified vim in strings being called like if you know someone is
                                         
                                         starting today and they made their config in lua, I wouldn't be like, switch
                                         
                                         it back to VimScript, it's better or something.
                                         
                                         And I wouldn't really do the same, like,
                                         
                                         vice versa either. I think, you know,
                                         
    
                                         if it's working for you and you're, like,
                                         
                                         happy with the end result, there's no reason
                                         
                                         to, like, spend a bunch of time
                                         
                                         switching the language to be something else.
                                         
                                         I think they're both, like, really good
                                         
                                         options for, like, configuration
                                         
                                         at this time.
                                         
                                         Yeah. I made the decision that I was going to start it in Lua because I'm like, I'm starting
                                         
    
                                         fresh. I'm starting in Lua. And then Nick showed me his and I'm like, nah, I'm going to go back to
                                         
                                         NIT.vim because I can just copy paste those right in when I want them without thinking.
                                         
                                         So totally. The other kind of little bit challenging thing is depending on like if you
                                         
                                         you know spend your free time perusing dot files on github if you find something cool in lua you
                                         
                                         either have to translate it to vim if you're not using lua or vice versa and understanding how to
                                         
                                         do that translation is going to be fun for everybody not the most transferable of skills
                                         
                                         you know you're not going to put that on your resume. I can translate script configurations between Vim script and Lua. Oh, wow. Speak for yourself. decent amount of stuff for which is trying to basically transpile vim9 script the new language
                                         
                                         that bram is making into lua and then keeping as much of the semantics as we can between the two
                                         
    
                                         one of my goals is like i would hope that we can keep them in neovim like as close and friendly
                                         
                                         as possible like no one on the neovim team has any animosity with people on the vim team i don't really think vice versa either so like it's a long-term project that i can't decide if
                                         
                                         it's real or not or how much of my life i will devote to it i have like some preliminary things
                                         
                                         and i can generate like valid lua from vim 9 script so there's like still even in places where people might at first glance think
                                         
                                         that it's going to be impossible for Vim and NeoVim to like live together and be friendly.
                                         
                                         I still have goals to make them be friends. That's interesting because that's been one of my
                                         
                                         kind of lines of questioning that I'm thinking about here is that I'm starting to see most
                                         
                                         recently we'll get into TreeSitter and stuff like that. But yeah that I'm starting to see most recently, we'll get into tree sitter and stuff like that.
                                         
    
                                         But yeah,
                                         
                                         most recently starting to see some plugins.
                                         
                                         There's one called limelight,
                                         
                                         which was written in Lua for Neo Vim using tree sitter for better dimming.
                                         
                                         And it was the first time,
                                         
                                         cause you know,
                                         
                                         I watch a lot of these things,
                                         
                                         what people are working on,
                                         
    
                                         et cetera,
                                         
                                         for change log news.
                                         
                                         And a lot of times it's like,
                                         
                                         this is a Vim slash Neo Vim thing.
                                         
                                         And that was like for years,
                                         
                                         it was either Vim only or Vim slash Neo Vim. And I'm starting to see like, this is a Vim slash NeoVim thing. And that was like for years, it was either Vim only or Vim slash NeoVim.
                                         
                                         And I'm starting to see like, this is a NeoVim thing.
                                         
                                         And there's no Vim equivalent.
                                         
    
                                         There's no, they didn't take the time to whatever you have to do to maybe write it twice or
                                         
                                         whatever it is.
                                         
                                         And so I started wondering like, will that start to pull people away from Vim on a NeoVim?
                                         
                                         And it's interesting your perspective of like, you don't necessarily want that to happen.
                                         
                                         Yeah. I mean, some of them are just impossible, at least today,
                                         
                                         like there's no way to get TreeSitter, at least that I know of, like inside of Vim, right? So no matter what you do, if you want to build something on top of TreeSitter, which is a really
                                         
                                         powerful and interesting technology, like that's going to most likely end up being NeoVim only like plugin.
                                         
                                         And I mean, even for me, like, you know, I will probably talk about Telescope a little
                                         
    
                                         bit, but like Telescope's NeoVim only because it uses a ton of NeoVim specific APIs that
                                         
                                         are only available in NeoVim and like uses the window things in complicated and interesting
                                         
                                         ways. And like, it relies heavily on the fact that you have LuaJIT installed and uses native C
                                         
                                         modules that we can link against C that optionally you can use to do sorting,
                                         
                                         to make sorting even faster.
                                         
                                         So I think like there will be plugins that exist that are only for NeoVim and
                                         
                                         there will be plugins that exist only for Vim
                                         
                                         and that's fine.
                                         
    
                                         My goal and like the NeoVim team goal,
                                         
                                         I think that I was trying to say before
                                         
                                         is basically just like,
                                         
                                         we're not actively trying to make the community not work
                                         
                                         for both, right?
                                         
                                         Yeah.
                                         
                                         Well, I really appreciate that perspective
                                         
                                         because so many times when there are projects
                                         
    
                                         and efforts like these,
                                         
                                         so often it's like a hostile takeover kind of a thing
                                         
                                         or a long, you know, it's a long con. Like, so often it's like a hostile takeover kind of a thing or a lot,
                                         
                                         you know,
                                         
                                         it's a long con like,
                                         
                                         well,
                                         
                                         we're going to slowly take over.
                                         
                                         And I think that,
                                         
    
                                         I mean,
                                         
                                         at the end of the day,
                                         
                                         it's Vim,
                                         
                                         you know,
                                         
                                         it's a different Vim.
                                         
                                         It's a newer Vim.
                                         
                                         It's got things Vim doesn't have,
                                         
                                         and it takes things out,
                                         
    
                                         but still the same editor that we all know and love has been around for all
                                         
                                         these years.
                                         
                                         Like,
                                         
                                         why would you want to crush that?
                                         
                                         Why would you want to kill it?
                                         
                                         Yeah, and I mean, like, I respect Bram a lot.
                                         
                                         Like, he's made an incredible piece of software,
                                         
                                         and it's, like, pretty bonkers if you just think about, like,
                                         
    
                                         where it started to where it is now
                                         
                                         and all the things that he's done for it.
                                         
                                         And, like, plus, Neovim is literally a fork,
                                         
                                         and so it's like we share a bunch of code that we never wrote.
                                         
                                         Like, I don't know, it feels kind of not very grateful and like not very thankful to just be like, and now we're our own thing.
                                         
                                         And I don't like, you know, it's like an angry teenager, like, I don't even like you, dad.
                                         
                                         You know, it's not exactly like the pinnacle of maturity, I think, necessarily all the time to like have that kind of situation.
                                         
                                         And so it frustrates me when I see it online between people as well. It's just like, if they
                                         
    
                                         want to use Vim, that's cool. Why would you be mad about that? You know what I mean? That just
                                         
                                         seems cool to let, to have them do that. That's great. Yeah. I mean, if we're going to hate on
                                         
                                         something, hate on the Emacs people, come on, what's wrong with you?
                                         
                                         Oh, I mean, Emacs is now closer to Vim and NeoVim in spirit
                                         
                                         than many other places, right? So
                                         
                                         not to name any other names, obviously.
                                         
                                         Yeah.
                                         
                                         They need to join forces to take on the onslaught
                                         
    
                                         of the graphical editors.
                                         
                                         Oh, yes. The evil graphical
                                         
                                         editors from faraway lands.
                                         
                                         In my browser now. Yeah. This episode is brought to you by our friends at Square.
                                         
                                         Square is the platform that sellers trust.
                                         
                                         There is a massive opportunity for developers to support Square sellers by building apps for today's business needs.
                                         
                                         And I'm here with Shannon Skipper, head of developer relations at Square.
                                         
                                         Shannon, can you share some details about the opportunity for developers on the Square platform?
                                         
    
                                         Absolutely. So we have millions of sellers who have unique needs.
                                         
                                         And Square has apps like our point of sale app, like our restaurants app.
                                         
                                         But there are so many different sellers, tuxedo shops, florists who need specific solutions for their domain. And so we have a node SDK written in TypeScript that allows you to
                                         
                                         access all of the backend APIs and SDKs that we use to power the billions of transactions that we
                                         
                                         do annually. And so there's this massive market of sellers who need help from developers. They
                                         
                                         either need a bespoke solution built for themselves on their own node stack, where they are working
                                         
                                         with Square Dashboard, working with Square Hardware
                                         
                                         or with the e-com,
                                         
    
                                         you know, what you see is what you get builder.
                                         
                                         And they need one more thing.
                                         
                                         They need an additional build.
                                         
                                         And then finally, we have the app marketplace
                                         
                                         where you can make a node app
                                         
                                         and then distribute it
                                         
                                         so it can get in front of millions of sellers
                                         
                                         and be an option for them to adopt.
                                         
    
                                         Very cool.
                                         
                                         All right.
                                         
                                         If you want to learn more,
                                         
                                         head to developer.squareup.com
                                         
                                         to dive into the docs,
                                         
                                         APIs, SDKs, and to create your Square Developer account.
                                         
                                         Start developing on the platform sellers trust. Again, that's developer.squareup.com. so nick you mentioned that you were waiting for the lewis stuff to land or to be official 0.5
                                         
                                         came out this summer july 2nd i believe a huge release 4 000 commits as i mentioned before
                                         
    
                                         a thousand of those reports from vim, but lots of new stuff.
                                         
                                         And the community rejoiced.
                                         
                                         I mean, this must have been a long time coming, TJ.
                                         
                                         How much work went into this release?
                                         
                                         Well, yeah, there was a lot of work.
                                         
                                         There was probably, if I had to take a guess, probably, I don't know, three or four weeks of time of me just answering when will NeoVim 0.5 come out.
                                         
                                         You know, just replying to messages like that online.
                                         
                                         We started a meme on my Twitch channel
                                         
    
                                         when people would ask that.
                                         
                                         We did exclamation, the rule,
                                         
                                         and then that took a bot command back
                                         
                                         and it explained that every time someone asks
                                         
                                         about NeoVim 0.5 release,
                                         
                                         the release date has to be pushed back one day.
                                         
                                         Yeah, but in all seriousness, I mean, it's been a long time
                                         
                                         coming. And it, you know, was a culmination of a lot of sort of really long term project and vision
                                         
    
                                         that the team had, I can't take credit for all of it, or even probably, you know, I can't take
                                         
                                         credit for most of it or anything. But, you know, seeing things like the LSP come to fruition,
                                         
                                         there's some fun history there where
                                         
                                         you can go dig up some of the original issues and my first PR probably in 2016 or 2017,
                                         
                                         where I proposed a lot of the first ideas about how we would put LSP inside of NeoVim and have it
                                         
                                         be in such a way that it still is the spirit of them.
                                         
                                         You know, that it's not, we're trying to smash everything in here and re-implement every
                                         
                                         wheel that we can.
                                         
    
                                         How can we do it in that way?
                                         
                                         So for me, it's been very fun to see that finally released.
                                         
                                         You know, it's been in my head for a long time and other people who helped along the
                                         
                                         way to finally implement it.
                                         
                                         And then as well, you know, putting in TreeSitter,
                                         
                                         which has also been sort of a long-term vision
                                         
                                         about making NeoVim as an editor understand the text
                                         
                                         at a much higher and more, I'd say, interesting or semantic level
                                         
    
                                         than just like strings of characters, right,
                                         
                                         which is one of the goals of TreeSitter.
                                         
                                         Let's focus in on LSP, the language server protocol.
                                         
                                         So this part didn't make the Vim show, but I did ask each person what they
                                         
                                         FOMOed from other editors, and we wanted to keep it tight, so we dropped that
                                         
                                         section out.
                                         
                                         But I'll tell you, Drew Neal mentioned LSP specifically in VS Code.
                                         
                                         Yeah, well, I come back to language servers again i mean uh about a year or two ago i started
                                         
    
                                         learning typescript and i know that typescript has a very good language server i mean pretty much
                                         
                                         um language servers and vs code and typescript were all kind of invented under the same roof
                                         
                                         and so they're very very well integrated. And I knew that I wanted to understand
                                         
                                         what a good TypeScript development experience is.
                                         
                                         And so I made a decision not to use Vim
                                         
                                         while I was learning TypeScript.
                                         
                                         I thought, okay, VS Code is an editor
                                         
                                         that's very well positioned for beginners.
                                         
    
                                         And while I'm being a beginner in TypeScript,
                                         
                                         I'm gonna be a beginner in VS Code as well,
                                         
                                         and just learn the way that good language server integration
                                         
                                         would feel like so that I can sort of take that learning
                                         
                                         and bring it back to Vim so that when I make that step of,
                                         
                                         okay, I'm going to now switch all my TypeScript development
                                         
                                         back over to Vim, I know what I'm looking for.
                                         
                                         For those who don't even know what LSP is,
                                         
    
                                         can you just explain what it is, where it came from,
                                         
                                         and then we'll talk about it in context in the OVM.
                                         
                                         Yeah, sure. So LSP is a protocol designed by Microsoft.
                                         
                                         It's actually what Microsoft's VS Code uses to communicate and basically get the language smarts that it has.
                                         
                                         Its big goal is, if you think about, you have M editors, right, and N languages.
                                         
                                         And when you want to implement support for the next language, you have to implement that M editors, right, in N languages. And when you want to implement support for the next
                                         
                                         language, you have to implement that M times, right? And so I think as developers, we're very
                                         
                                         familiar with M times N problems being very difficult and feeling intractable and also not
                                         
    
                                         fun to solve, right? Because even if you solve it once, you feel you're going to have to solve it N times again later.
                                         
                                         So LSP is basically a protocol designed to talk from editors to some sort of server that's giving you information about what you're editing, right?
                                         
                                         So if you have your cursor on somewhere in a document, you can say, hey, what's the definition
                                         
                                         of this?
                                         
                                         And so there's a protocol, text document slash definition. You send that over the wire to something that's running. It can be anything
                                         
                                         you want. It can be on your machine, another machine, doesn't matter. Just a protocol that
                                         
                                         you send over the wire and ask, hey, what's the definition of this text document at this position?
                                         
                                         And it will return you back a list of possible definitions or one, you know, whatever the result
                                         
    
                                         is. And you'll be able to go there in the editor, right? So the editor will receive that response and know what
                                         
                                         to do. So this is really powerful because in theory, it's not always exactly like this.
                                         
                                         It'll turn the problem from M times N to M plus N, which is a much better problem to solve. And
                                         
                                         it's probably more like M plus N plus, you N plus Z, right? There's some extra work
                                         
                                         still. Yeah, it still has to happen. Some language servers have specific commands that only make
                                         
                                         sense for their language or things like that. But that's okay. That's still a much more fun
                                         
                                         problem to solve. And so that's sort of the basics of what happened. And like in the context of NeoVim, what we saw was that this is sort of, in a lot of ways, just like an interface to your editor. And that was one of
                                         
                                         my big pushes for how we should think about LSP inside of NeoVim, is this is really just defining
                                         
    
                                         a standard way that is shareable between other pieces of technology in how you can talk to your editor, right? So I recently implemented something
                                         
                                         for my work at Sourcegraph, where I implemented like a go to definition over LSP. But what it
                                         
                                         does, instead of running something locally, it asks this external program where the definition
                                         
                                         of this thing is, right. And so that was basically like a way for me to do that. And I didn't,
                                         
                                         I mean, obviously, I knew how to move to the file and all these other things because I am familiar with NeoBIM, but it doesn't have to be so. Right. So it allows this interface to do. And then if I can do another plug for Lua in here, right, the way that we did this with Lua is that it's very easy because everything is just a function, you can replace a function with a basically set of parameters
                                         
                                         and an expected thing to happen and replace it with some new behavior that's more suited
                                         
                                         to your purpose.
                                         
                                         I'll give an example for that, which is in Golang, we have a bunch of stub or test implementations
                                         
    
                                         for some interfaces that we have at my work.
                                         
                                         I don't want to jump to those when I hit go to implementation 99% of the time.
                                         
                                         So what I did was I can ask the LSP, hey, where are the implementations of this?
                                         
                                         I wrote some Lua code that walks through the results and says, if this file ends with underscore test
                                         
                                         or like underscore mock,
                                         
                                         discard it and throw that away from my results.
                                         
                                         Generally at work, we just have one result that remains
                                         
                                         and then I just jump straight to there
                                         
    
                                         if there's only one left.
                                         
                                         Otherwise I open quick fix list.
                                         
                                         So that's like really cool
                                         
                                         because now I only have to press the button
                                         
                                         to jump to that implementation. And it
                                         
                                         does exactly what I hope only in Go code and everywhere else it does the standard definition.
                                         
                                         Right. So there's this concept and idea of like the way that we want to design it was this is
                                         
                                         just an interface for both language tool makers and like editor tool makers to be able to interact with in a way that you can customize
                                         
    
                                         to be just the way that you want.
                                         
                                         Good explanation.
                                         
                                         It's just amazing.
                                         
                                         I'm trying to think of ways that I might implement this.
                                         
                                         Nick, sometime you're welcome to come on my stream
                                         
                                         and we can work on implementing it for you or something.
                                         
                                         It would be fun for some other case.
                                         
                                         That'd be a lot of fun.
                                         
    
                                         That does sound fun.
                                         
                                         So tell me about the client server situation is this like
                                         
                                         a network server or is this like a an embedded binary that you call how does it actually talk
                                         
                                         and explain that yeah so lsp can the primary modes that people use to communicate are either
                                         
                                         just standard in standard out or you can do it over t. Generally, if you're doing it over TCP, people just use some pipe
                                         
                                         and then pretend that it's TCP or something like that
                                         
                                         instead of actually doing TCP.
                                         
                                         But so NeoVim doesn't care what's on the other side.
                                         
    
                                         We take a list of commands, we spin up that thing and start it,
                                         
                                         and then we have standard in standard out between
                                         
                                         the two. And we just send basically JSON over the wire for request. And then they'll send JSON back
                                         
                                         over the wire to get to us. And it's just like a pipe, generally speaking, it's possible to do
                                         
                                         to do other things. So you could have anything on the other side. So for example, GoPlease, the Go language server, is written in Go.
                                         
                                         And so it's just a Go binary on your machine that you say, GoPlease, start up.
                                         
                                         You send basically a configuration request so it can understand what directory am I in,
                                         
                                         what's part of this project, all those kinds of things, right?
                                         
    
                                         That's part of the protocol to understand.
                                         
                                         And then it will just respond to requests as you send it. There's also things like Microsoft's
                                         
                                         PyLance, which you can only run in VS Code due to licensing concerns, but that's written
                                         
                                         in TypeScript. So it's not written in Python. It just does the analysis in TypeScript and then
                                         
                                         sends the responses, but you're just editing Python files. You don't care what it's written. And it's just a protocol that talks between the two.
                                         
                                         So let's say I wanted to teach NeoVim a new language.
                                         
                                         Yep.
                                         
                                         Let's say I had a language called Inc. And I wanted it to understand Inc.
                                         
    
                                         Would I then provide my own LSP or would I plug something into
                                         
                                         the LSP that NeoVim ships with? How would I get it in there?
                                         
                                         Ah, so that maybe I should take a step back. So NeoVim's LSP client isVim ships with, how would I get it in there? Ah, so maybe I should take a step back.
                                         
                                         So NeoVim's LSP client is just Lua code that's inside of NeoVim.
                                         
                                         It's an LSP client.
                                         
                                         It does not have its own language server in there.
                                         
                                         Right, that's correct.
                                         
                                         So it doesn't know how to answer any of the questions.
                                         
    
                                         It only knows how to ask.
                                         
                                         I thought maybe it had like a set number of languages
                                         
                                         that it already had all of the stuff ready to go.
                                         
                                         Yeah, no, it does not.
                                         
                                         We have nvim lsp config, which is just like a repo that helps you get some of those running.
                                         
                                         But you need to figure out how to install those and make them executable on your machine.
                                         
                                         Being a package manager is not what we're good at.
                                         
                                         We're good at being a text editor.
                                         
    
                                         Someone else can figure that out and do that.
                                         
                                         And there are various
                                         
                                         plugins to help you install. But NeoVim just has basically a bunch of Lua code that knows how to
                                         
                                         handle the responses and ask the right questions. You need to install separate executables to do
                                         
                                         that. And to that end, I'm using something called LSP install that handles installing those and then
                                         
                                         using LSP config to configure them for NeoVim.
                                         
                                         Yeah, it'll just install it for you and stuff. So we leave that to other people,
                                         
                                         you can handle that. I'm sure there will be one for specific distros or specifically for Nix,
                                         
    
                                         or there's one for Docker containers. There's a lot of different ways that you can do that. That's
                                         
                                         not our strong suit. We try and make text editors good and fast.
                                         
                                         Gotcha. Well, let's move on the tree sitter
                                         
                                         because yeah another cool technology it seems like there's they seem like they're similar right i mean
                                         
                                         you're talking about the syntax tree of a language help us understand tree sitter and how it's
                                         
                                         different than lsp yeah so this is a really common question so it's a good one for sure so a really
                                         
                                         high level way that you should
                                         
                                         start thinking about both technologies is that TreeSitter only deals with one particular file,
                                         
    
                                         and it only deals with the text that is in that file. It has no additional information.
                                         
                                         And LSP operates much more on like a project-wide level. It's going to open up and read all your
                                         
                                         files. It's going to index all of them. It's going to open up and read all your files.
                                         
                                         It's going to index all of them. It's going to put a bunch of things in memory. And then it's
                                         
                                         going to be able to have some specific way that you can ask certain questions and it will give
                                         
                                         certain responses. So that's sort of like the first aspect. The second aspect is TreeSitter
                                         
                                         is built in a lot of ways specifically to run like inside of your text editor as opposed
                                         
                                         to like an LSP which is some external process.
                                         
    
                                         So TreeSitter at a high level for those who don't know is effectively a library for writing
                                         
                                         error recovering incremental parsers and it's very good at doing that which is awesome for
                                         
                                         text editors because most of the time when you're
                                         
                                         writing code, the code is broken, right? If you type a line of code until you get to the semicolon
                                         
                                         in C, right? It is broken. So you want to write parsers that can recover and not like drop
                                         
                                         highlighting for the rest of the file or do things like that, right? You want to actually do error recovery and
                                         
                                         smart error recovery. And that's like quite difficult to do, but TreeSitter just sort of
                                         
                                         gives you that for free if you write a grammar in the correct way. So that's the first part.
                                         
    
                                         And then the second bit that's very important is that it's incremental. So it does not reparse the
                                         
                                         whole tree, which is awesome for when you're typing keystrokes
                                         
                                         in a very large file
                                         
                                         because you're going to smash 80 keystrokes.
                                         
                                         You don't want to reparse the entire file 80 times, right?
                                         
                                         Instead, it actually just incrementally parses
                                         
                                         the things that it needs to and generates a new tree.
                                         
                                         Does that make sense so far?
                                         
    
                                         Any questions there?
                                         
                                         I'm with you.
                                         
                                         Okay.
                                         
                                         So once again, TreeSitter only focuses on exactly that file.
                                         
                                         So this is cool because this lets you do things like you can request highlights for the file
                                         
                                         by asking the tree questions and basically getting back named nodes.
                                         
                                         You can write queries in this scheme-like language.
                                         
                                         It will return to you named nodes.
                                         
    
                                         And then in those nodes, they have ranges.
                                         
                                         And so you can color them in your editor if you want. It will return to you named nodes. And then in those nodes, they have ranges.
                                         
                                         And so you can color them in your editor if you want.
                                         
                                         This is sort of like the thing that everyone recognizes about TreeSitter, but I find somewhat like the least exciting of all of the TreeSitter technologies, but it is the most obvious.
                                         
                                         And it also makes sense from like a performance perspective that you would like to only change
                                         
                                         the highlights that need to be changed. So this is like a really great improvement and allows you to write much better
                                         
                                         and powerful syntax highlighting than you could with like just regexes, which is like the built
                                         
                                         in Vim syntax engine. And it prevents you from getting these situations where like, I don't know
                                         
    
                                         if you've ever had this, but in certain complicated file types, if you like scroll down the page,
                                         
                                         sometimes it like thinks everything
                                         
                                         in the rest of your file is like a string.
                                         
                                         And you're like, what is happening?
                                         
                                         Why is this all string?
                                         
                                         That can't happen when you have a tree, right?
                                         
                                         That's not going to be an option.
                                         
                                         So that's sort of like the first level of TreeSitter.
                                         
    
                                         And it doesn't communicate over the wire.
                                         
                                         This TreeSitter is running inside of NeoVim and it's like embedded inside of NeoVim.
                                         
                                         Now the parsers and the queries and things like that, those are external to NeoVim, can
                                         
                                         be configured by users.
                                         
                                         I have my own custom grammar for Lua to do some special things, etc.
                                         
                                         So those are all sort of configurable, but the engine itself is built into NeoVim.
                                         
                                         And is the engine something that was built by the NeoVim team or you're actually embedding
                                         
                                         somebody else?
                                         
    
                                         Is TreeSitter its own project?
                                         
                                         Yes, TreeSitter is its own project.
                                         
                                         It was originally made for Atom, but several other editors now have used it because it
                                         
                                         is designed to be a library to be embedded inside of other editors.
                                         
                                         And so it's very, very fast and performance and they spend a lot of time making it really awesome.
                                         
                                         And the tree sitter team is super cool. To get it started with it, you kind of similar to LSP
                                         
                                         config, you have to install a separate plugin. And is that just to help with the configuration
                                         
                                         then? I think that's where I like had confusion was because I was like,
                                         
    
                                         I thought that it was built in,
                                         
                                         but I have to install this plugin.
                                         
                                         Yeah, so to be like clear about it,
                                         
                                         you actually don't have to install plugins for either.
                                         
                                         Like you can start up the server by yourself for LSP.
                                         
                                         It just is a little bit more boilerplate.
                                         
                                         So that's why we have LSP config,
                                         
                                         but it's like certainly possible to do.
                                         
    
                                         LSP config literally only has configurations but for
                                         
                                         tree sitter you also don't necessarily have to install the plugin it'll just be more complicated
                                         
                                         like it would involve you downloading a grammar file running tree sitter to generate the bindings
                                         
                                         because it's separate executable to generate these bindings and then creating your.so shared executable and then putting that in the
                                         
                                         right place. So you could do that. And then the engine that's built inside of NeoVim will see
                                         
                                         that shared executable loaded up and appropriately attach it, I guess, to the buffer. But that is
                                         
                                         not very fun to do. So that's where Envim-tree-sitter comes in. And over time, we hope to,
                                         
                                         you know, upstream more of like nvim-tree-sitter into NeoVim core, but there's a certain level of
                                         
    
                                         backwards compatibility and polish that we want to have in the core repository. And we felt that
                                         
                                         that would really hold back a lot of experimentation and interesting
                                         
                                         things happening. We tried to squish that all inside of NeoVim core, which is where Envim
                                         
                                         TreeSitter sort of came out as a separate plugin. So the engine, all of the interior things to do,
                                         
                                         like get the tree and have it parse incrementally as you type and all of that kind of stuff,
                                         
                                         that's inside of NeoVim all the time. Someday, someday,
                                         
                                         my goal would be we would at least ship TreeSitter grammars inside of NeoVim for C, Lua, and Vim,
                                         
                                         VimScript, because those are the languages that NeoVim deals with. And I think it would be
                                         
    
                                         cool to have a really awesome experience out of the box for those languages for people,
                                         
                                         but we're just kind of far away. Not maybe maybe i don't know how far away we are but we are not there yet to be
                                         
                                         able to do that so it sounds like tree sitter is driving a lot of the innovation around these cool
                                         
                                         new plugins that i keep seeing that are neo vim only not vim as well because of the tree sitter
                                         
                                         support yeah i can give you a really cool example of a few
                                         
                                         things that people have been doing with tree sitter that are like much further beyond just
                                         
                                         highlighting please do yeah so a relatively like straightforward and easy to understand one is a
                                         
                                         plugin called nvim ts comment string i think off the top of my head i don't remember exactly the
                                         
    
                                         name but what it does is tree sitter tells you what language you are currently inside of. And those languages can
                                         
                                         be embedded inside of the same file. So for example, in JavaScript land, you can have, you
                                         
                                         know, like react elements. And so then inside of there, you're kind of like in reactor. I don't
                                         
                                         really know how any of that works because I write backend languages, but all of a sudden I'm like, am I reading HTML? I thought there was JavaScript. I don't know what's
                                         
                                         going on. But one thing that's kind of annoying is if you use like a commenting plugin and you
                                         
                                         try and comment something in the like JavaScript part versus like the HTML style part, you'll
                                         
                                         comment them incorrectly, right? So yes. And thents comment string, all it does is it will just update the
                                         
                                         comment string option, which is a built in option, depending on which language tree sitter currently
                                         
    
                                         detects. So if it detects that you're inside of JavaScript land, it'll set it to slash slash
                                         
                                         space percent s. If detects that you're inside of HTML. It sets it to the long HTML thingy. That's annoying to
                                         
                                         type. Right. That's cool. That one just honestly rocked my world because I've had that problem
                                         
                                         in my life for ever. Yeah. And so this is even cooler because it doesn't just work for those
                                         
                                         languages. In Lua, you can write FFI code, which is actually C, right? And it is somewhat deterministic how you start and end those C def blocks.
                                         
                                         So you can actually write a tree sitter query that tells NeoVim,
                                         
                                         hey, inside of these, this string, it's actually C code.
                                         
                                         And so you get C highlighting in this like random string in your file
                                         
    
                                         that you weren't expecting.
                                         
                                         And then if you're using
                                         
                                         TS comment string and you comment out a line in there, it comments out that line like it's C code.
                                         
                                         So it's very, very powerful to be able to do something like that. It's very exciting.
                                         
                                         That's awesome stuff.
                                         
                                         That's one example. I'll give you another one that I think is, for me, it's very fun. So I use a
                                         
                                         snippets plugin called Lua Snips
                                         
                                         and it's kind of interesting.
                                         
    
                                         I've just been exploring it lately,
                                         
                                         but it allows you to sort of run Lua code
                                         
                                         as you're expanding your snippets
                                         
                                         to sort of generate what the next text should be.
                                         
                                         So if you're familiar with Golang at all,
                                         
                                         you know that there's like,
                                         
                                         you write if error not equals nil,
                                         
                                         like 10,000 times a day.
                                         
    
                                         Maybe that's an understatement.
                                         
                                         I haven't profiled myself yet,
                                         
                                         but I think it's somewhere around there.
                                         
                                         And what you do inside of those error not equal nil sections
                                         
                                         is you have to write return
                                         
                                         and then the type signature basically
                                         
                                         with the default values, right?
                                         
                                         So if you return like an int and error,
                                         
    
                                         then you have to do like return zero comma air, right? So like you
                                         
                                         write this thing a ton of times. So I actually wrote a Lua snippet that will ask TreeSitter,
                                         
                                         basically, it has a custom query that I wrote inside of Golang that will ask TreeSitter,
                                         
                                         hey, what is the return type of this function? So it can query the tree. It gets back the current node that you're in.
                                         
                                         It asks for, hey, what is the nearest function scope that I'm inside of?
                                         
                                         So it's not a regex, right?
                                         
                                         It works for like inline functions inside of another function,
                                         
                                         all these kinds of things.
                                         
    
                                         It asks for that.
                                         
                                         It gets what the return signature looks like.
                                         
                                         And then it generates the snippet in the corresponding things with the
                                         
                                         default values and then error so it's very cool because i can just type like ie for if error
                                         
                                         expand my snippet and correspondingly the right signature is generated as a return value these
                                         
                                         are the kinds of things that make me very very very excited about TreeSitter. And why I say like,
                                         
                                         it's cool to get better highlighting. And like, we look at our highlighting all day. And that's
                                         
                                         very fun. But for both LSP and TreeSitter, the things that I'm most excited about, like,
                                         
    
                                         especially on NeoVim core team, is we're trying to design interfaces that empower people to have
                                         
                                         much stronger sort of tools and understanding of the code that lets
                                         
                                         them extend their editors in sort of very unique and interesting ways which is like
                                         
                                         i think the snippets one is a fun example of being able to do that goodness gracious that is really
                                         
                                         neat we're getting tight here but we've teased telescope a few times but let's yeah let's hit
                                         
                                         the nail on the head tell everybody about your peer into it oh
                                         
                                         there you go yeah that's why we pay you the big bucks so
                                         
                                         so telescope is a fuzzy finder that uh i started and i've had a lot of contributors to over the
                                         
    
                                         past year i i cannot thank enough the contributors to the project in just over the last year, it's gotten over 3,000 stars and nearly 130 contributors.
                                         
                                         And I think that by itself is somewhat of a testament to how accessible Lua is, how interested
                                         
                                         people are to extend the editor and to like continue working on it and their ability to sort
                                         
                                         of pick up little pieces and do it. But in terms of like what telescope is and why like I made it,
                                         
                                         I partially made it just to explore writing some stuff in Lua as a way to push our API and
                                         
                                         boundaries to find out what we should be including in NeoVim core. But as I was working on it,
                                         
                                         some of the things that I've struggled with doing in the past with fuzzy finders, I just wanted to
                                         
                                         try and solve. For example, like I love FZF. It's a very
                                         
    
                                         awesome tool. I use it all the time on the CLI, but it's very difficult to do something like
                                         
                                         pass a function through FZF because you have to encode it in some way and then decode it again
                                         
                                         later because FZF processes standard in and standard out, right? So Telescope is all Lua from the top of the stack down,
                                         
                                         or FFI, but that still counts.
                                         
                                         And so you can pass a function reference,
                                         
                                         which might be what you want to do if this item is selected,
                                         
                                         at the beginning of your code,
                                         
                                         and then you can pass that all the way through.
                                         
    
                                         And so when you select it, you can do something with that item.
                                         
                                         So my main goal for making it was just to basically create like the most extensible
                                         
                                         fuzzy finder that I could imagine.
                                         
                                         So like every part of telescope is configurable.
                                         
                                         So like the sorting algorithm is just an interface of a function.
                                         
                                         So you can have FZY sorting, FZF, strict matching, Ngram matching. You can write
                                         
                                         whatever you want to do and you can just plug that in and that will just work with everything else.
                                         
                                         The previewers are all just Lua functions. So some of them, like if you're previewing buffers,
                                         
    
                                         it just literally opens the preview in a NeoVim buffer. So you get exactly the same highlighting
                                         
                                         as you would if you open the file because it it is literally you opening the file, the like ability to sort and how you're sorting those.
                                         
                                         And when you filter them, those are all configurable, the display and UI and different
                                         
                                         themes, they're all like, individually configurable. And what like, my goal was, was to make the most
                                         
                                         configurable like fuzzy finder that I could do with an easy api to
                                         
                                         basically plug in whatever you can imagine that you wanted to sort on and then use it so all my
                                         
                                         to-do list was to yank nick's fzf neobim setup and use it for myself should i just bypass that
                                         
                                         is telescope ready for me should i just use it right away or is it still baking? Yeah, so there's a couple things
                                         
    
                                         still baking for sure in Telescope. I mean, FCF is just like a rock solid piece of software that's
                                         
                                         super cool. If you're doing things that might be searching millions of files, for example,
                                         
                                         you should stick with FCF. Go is going to be a better solution for you than what I can do in
                                         
                                         Lua, at least today. We'll see. Maybe someday
                                         
                                         it'll be different. We are nearing completion of merging a very important PR that will greatly
                                         
                                         improve performance for really, really large searches, like 500,000 items will still feel
                                         
                                         fast and not really block the editor. So it's up to you. I would say if your primary concern is speed, then you should probably
                                         
                                         stick with FZF at least for a while. Maybe you can talk to me again in a year and maybe I feel
                                         
    
                                         I'm close enough to FZF speed to say that we're there. We're working on some projects like in C
                                         
                                         to compile as optional dependencies that you can throw in here and work super fast and cool.
                                         
                                         But we're not there yet. And that's cool. Like I said, I like FZF, but I use it every day. I no longer use FZF
                                         
                                         inside of NeoVim. I have lots of friends who no longer use it inside of NeoVim or other fuzzy
                                         
                                         finders. They just use a telescope. So I would say it's ready for daily use, but you know,
                                         
                                         if you're going to be searching 10 million things or something like that, then running something inside of the program that you're doing is probably not a good call.
                                         
                                         You should use an external executable that's going to manage that memory maybe a little bit tighter.
                                         
                                         I have an answer for you.
                                         
    
                                         Why not both?
                                         
                                         Why not both?
                                         
                                         Yeah, I have recommended that for some use cases for people, like if they're trying to grep every line in their very large monorepo, there's no reason not to keep FCF around, at least for a while. For me, like I have a hard time if
                                         
                                         the UI like isn't as consistent. It just sometimes like, oh, like notice that or like, oh, it's not
                                         
                                         the same as what I'm used to. So for some people that really bothers them. And I understand that's
                                         
                                         totally cool. And they say they're going to stick with FCF. And I say, awesome. That's great.
                                         
                                         That is one thing that I think telescope really has going for it is
                                         
                                         it just has a really beautiful UI. Thanks. That does help, doesn't it?
                                         
    
                                         Yeah. And I mean, it is very interesting when you actually start using it and you notice that you
                                         
                                         get exactly the same colors as what the rest of your editor is. I don't have that with FZF. Yes, it is not possible as far as I understand, because like, for example, when you open up
                                         
                                         a buffer inside of NeoVim and if you have TreeSitter, it will literally TreeSitter highlight
                                         
                                         the same way with the same exact colors because it is just another buffer.
                                         
                                         It would be like if you did colon edit this file, it will show it like that in the preview.
                                         
                                         Very cool. So one thing I want to touch on as a closer
                                         
                                         is I mentioned the enthusiasm around the 0.5
                                         
                                         release. I mentioned how many people said win NeoVim on the changelog.
                                         
    
                                         There's a lot of people very excited about this project.
                                         
                                         They love the ability to write plugins in Lua. They like the new
                                         
                                         capabilities that TreeSitter is making available to them.
                                         
                                         Maybe speak to the community a little bit.
                                         
                                         I know you lead some live streams.
                                         
                                         There's a lot of fun being had.
                                         
                                         There were celebrations around the big release.
                                         
                                         And then maybe give waypoints for people
                                         
    
                                         who would love to get involved with NeoVim,
                                         
                                         the community, like where does they gather, etc. Yeah, so we did a 0.5
                                         
                                         release stream on Twitch on my live stream channel. And it was like, the excitement and enthusiasm was
                                         
                                         really mind blowing for me. You know, I've been working on NeoVim for a long time. And sometimes
                                         
                                         you're sort of like, just working and you're pushing stuff to GitHub and like,
                                         
                                         OK, cool.
                                         
                                         Like somebody's using it, I'm pretty sure.
                                         
                                         But we had like 500 people there live to do the like release drop on my stream. And it was like really crazy for me.
                                         
    
                                         And people were showing a lot of support.
                                         
                                         And so it's very exciting.
                                         
                                         Even, you know, just getting messages from people saying thanks.
                                         
                                         Just as a general note, if you're using open source software and it's especially if it's maintained
                                         
                                         by people who aren't getting
                                         
                                         fang but like salary
                                         
                                         to do the maintenance,
                                         
                                         it means a lot when you get a thank you
                                         
    
                                         or like, wow, I really like this.
                                         
                                         Do that.
                                         
                                         And I mean, I was really pleased
                                         
                                         to see Neovim in the top spot
                                         
                                         for most loved editor
                                         
                                         in Stack Overflow 2021 survey.
                                         
                                         A little shout out there.
                                         
                                         But yeah, I think the community is great and it's really exciting to see how much people
                                         
    
                                         are excited.
                                         
                                         And I've really appreciated it.
                                         
                                         And it's been fun sort of being on the receiving end of that.
                                         
                                         In terms of like, where can people get started and how can they help?
                                         
                                         First thing is we're on Element or Matrix, I guess.
                                         
                                         There's a NeoVim chat room there. I believe
                                         
                                         it's linked from the read me. If it's not, then it should be. And so you can go there or it's on
                                         
                                         Gitter or it's on IRC. They're all sort of like bridge to be the same place. And you can hang out
                                         
    
                                         there and chat or ask questions. There's a lot of issues that if you commented on and said, I want to work on this or like,
                                         
                                         how can I fix this?
                                         
                                         People are super glad to help.
                                         
                                         I actually, that's how I got involved.
                                         
                                         I did a PR in maybe during my senior year of college, adding a new thing to status line.
                                         
                                         And I just had like a ton of really nice people be there to help and to encourage me and give me advice.
                                         
                                         And they helped me grow a lot as software developer, even on just that one PR and taught
                                         
                                         me a lot of really great things.
                                         
    
                                         I hope and I think it's a goal of the other maintainers as well that we basically make
                                         
                                         a welcoming and happy place for people to learn a lot more.
                                         
                                         So don't be afraid to ask questions or to comment and say,
                                         
                                         I'd like to work on this.
                                         
                                         Where should I start?
                                         
                                         That's how I got started.
                                         
                                         And so I think that's a really great way to go.
                                         
                                         There are some labels like good first issue or mentored project or things like that
                                         
    
                                         that you could look into,
                                         
                                         but don't be afraid to leave a comment or say hello.
                                         
                                         We're super happy to see you.
                                         
                                         Or just say, thanks for working on it.
                                         
                                         That always makes me feel better and gives me energy to keep on you know improving the oven and working on it
                                         
                                         awesome we definitely appreciate all of the work that you're doing i'll just echo your sentiment
                                         
                                         if you have a piece of software that you use and love find the people that make that software and
                                         
                                         let them know especially if it's open source but proprietary as well there's people behind the scenes of proprietary software you know putting the work in so that's definitely appreciated nick i want to
                                         
    
                                         thank you for being my changelog co-pilot hopefully none of the things you generated today were gpl
                                         
                                         code but uh happy to have you here with me i think i broke the show with that one tj we really
                                         
                                         appreciate you coming on the changelog to To everybody who requested this episode, we thank you as well. We do take requests. Head to our website changelog.com slash request. Fill out the form there. Let us know guests you'd like to hear, topics you'd like to hear. If you want Nick to come back, if you'd like us to banish him into eternity, let us know. We'd like to hear from our audience. Any final words, TJ or Nick?
                                         
                                         Just thanks for having me.
                                         
                                         It's cool to see NeoVim be requested on the show,
                                         
                                         and I'm always happy to talk about it.
                                         
                                         If you want to see more of me or hear my voice,
                                         
                                         I stream a lot on twitch.tv slash teej,
                                         
    
                                         that's T-E-E-J underscore D-V.
                                         
                                         You could come hang out there.
                                         
                                         We're live pretty often,
                                         
                                         and I do a lot of NeoVim- related work there. Otherwise, just glad to be here and glad to be participating in such
                                         
                                         a fun community. Yeah. And thanks for having me on as well. And TJ would gladly take you up on
                                         
                                         that offer to dig into some custom LSP stuff. That's really cool. Cool. We are tentatively
                                         
                                         planning some related live streams. We have nothing locked in, but definitely follow TJ
                                         
                                         on Twitch and maybe on Twitter as
                                         
    
                                         well for announcements. Of course, follow
                                         
                                         Changelog on Twitter. You can also follow
                                         
                                         Nick Nisi on Twitter,
                                         
                                         but I don't know. You decide if you want
                                         
                                         to do that. Thanks, Jared. All right.
                                         
                                         That's our show for this week. We'll talk to everybody
                                         
                                         next time.
                                         
                                         Sorry, Nick.
                                         
    
                                         In true JS Party fashion, I had to roast
                                         
                                         you a little bit just at the end.
                                         
                                         Absolutely.
                                         
                                         Gotta love roasting Nick. That's it for this episode of The Change Law.
                                         
                                         Thank you so much for tuning in.
                                         
                                         Got a special show coming up soon with Corey Wilkerson
                                         
                                         on GitHub's transition to Codespaces.
                                         
                                         Adam Jacob on open source business models.
                                         
    
                                         FaunaDB with Evan Weaver.
                                         
                                         If you're not subscribed, now is a good time.
                                         
                                         Subscribe at changelog.com and everywhere you listen to podcasts. We'll see you next time. Game on.
                                         
