How to Use Neovim with Devcontainers
Read full transcript 10 segments
-
hey guys my name is Misha and I'm a hey guys my name is Misha and I'm a Microsoft MVP a while ago I discovered Microsoft MVP a while ago I discovered Microsoft MVP a while ago I discovered Dev containers and I was only able to Dev containers and I was only able to Dev containers and I was only able to use them with vs code and if you know me use them with vs code and if you know me use them with vs code and if you know me then you know that I'm a hardcore Vim then you know that I'm a hardcore Vim then you know that I'm a hardcore Vim guy and I was kind of struggling with guy and I was kind of struggling with guy and I was kind of struggling with the fact that I would need to use vs the fact that I would need to use vs the fact that I would need to use vs code in order to work with Dev code in order to work with Dev code in order to work with Dev containers but I figured it out thanks containers but I figured it out thanks containers but I figured it out thanks to my good friend Rio today I'm going to to my good friend Rio today I'm going to to my good friend Rio today I'm going to show you how to use Dev containers with show you how to use Dev containers with show you how to use Dev containers with neovim so I have this little go project neovim so I have this little go project neovim so I have this little go project here and this is a tracker for my ttle here and this is a tracker for my ttle here and this is a tracker for my ttle Casas and in there is a Dev container. Casas and in there is a Dev container. Casas and in there is a Dev container. Json this takes the image uh Dev Json this takes the image uh Dev Json this takes the image uh Dev containers go and this has a feature containers go and this has a feature containers go and this has a feature neovim Home Brew so if you go to Dev neovim Home Brew so if you go to Dev neovim Home Brew so if you go to Dev container container container features uh let's see features here Fe features uh let's see features here Fe features uh let's see features here Fe containers. Dev features this is a list containers. Dev features this is a list containers. Dev features this is a list of features that you can load into your of features that you can load into your of features that you can load into your Dev container doj on and it will install Dev container doj on and it will install Dev container doj on and it will install certain features for you the one that we certain features for you the one that we certain features for you the one that we picked was brew and neovim so it's going picked was brew and neovim so it's going picked was brew and neovim so it's going to utilize Brew in order to install to utilize Brew in order to install to utilize Brew in order to install neovim for us and the way I'm doing this neovim for us and the way I'm doing this neovim for us and the way I'm doing this is by using devp pod devp pod. sh maybe is by using devp pod devp pod. sh maybe is by using devp pod devp pod. sh maybe I should show the devp pod.
-
I should show the devp pod. I should show the devp pod. sh this is Dev pod this is code spaces sh this is Dev pod this is code spaces sh this is Dev pod this is code spaces but open source it is amazing with this but open source it is amazing with this but open source it is amazing with this you can run Dev containers in either you can run Dev containers in either you can run Dev containers in either Docker or on kubernetes and that's what Docker or on kubernetes and that's what Docker or on kubernetes and that's what we're going to do now so I'm in my repo we're going to do now so I'm in my repo we're going to do now so I'm in my repo here on my local here on my local here on my local machine this is this this repo is cloned machine this is this this repo is cloned machine this is this this repo is cloned on my local machine and now I'm going to on my local machine and now I'm going to on my local machine and now I'm going to run the command def pod up let's walk run the command def pod up let's walk run the command def pod up let's walk through the command Dev pod up dot so through the command Dev pod up dot so through the command Dev pod up dot so the current directory provider the current directory provider the current directory provider kubernetes I'm I'm pointing it to my kubernetes I'm I'm pointing it to my kubernetes I'm I'm pointing it to my kubernetes home lab cluster and then I'm kubernetes home lab cluster and then I'm kubernetes home lab cluster and then I'm saying dot files and I'm pointing it to saying dot files and I'm pointing it to saying dot files and I'm pointing it to a repo that I have so I will start this a repo that I have so I will start this a repo that I have so I will start this first and then we're going to see what first and then we're going to see what first and then we're going to see what this is going to do so let's check it this is going to do so let's check it this is going to do so let's check it out I'm going to go open K9s and here we out I'm going to go open K9s and here we out I'm going to go open K9s and here we can actually see this uh starting to run can actually see this uh starting to run can actually see this uh starting to run on my kubernetes cluster this is on my on my kubernetes cluster this is on my on my kubernetes cluster this is on my home lab cluster it's running like five home lab cluster it's running like five home lab cluster it's running like five notes in my in my pantry over there on notes in my in my pantry over there on notes in my in my pantry over there on Talos Linux and now Dev pod is starting Talos Linux and now Dev pod is starting Talos Linux and now Dev pod is starting a pod on my kubernetes cluster where it a pod on my kubernetes cluster where it a pod on my kubernetes cluster where it will will load up the dev will will load up the dev will will load up the dev container now I also showed I also said container now I also showed I also said container now I also showed I also said that it should take this repo and let's that it should take this repo and let's that it should take this repo and let's let's take a look at that one Misha let's take a look at that one Misha let's take a look at that one Misha venburg repos and then this is the venburg repos and then this is the venburg repos and then this is the devbot devbot devbot brew and I'm using this is not my brew and I'm using this is not my brew and I'm using this is not my official one this is my old one I'll get official one this is my old one I'll get official one this is my old one I'll get back to that but this is the a repo that
-
back to that but this is the a repo that back to that but this is the a repo that contains a bash RC a t-mo configuration contains a bash RC a t-mo configuration contains a bash RC a t-mo configuration but also a setup script so so let's take but also a setup script so so let's take but also a setup script so so let's take a look at that here it will create the a look at that here it will create the a look at that here it will create the do config uh in XG config home you're do config uh in XG config home you're do config uh in XG config home you're following that convention and it's going following that convention and it's going following that convention and it's going to install a bunch of packages FD rip to install a bunch of packages FD rip to install a bunch of packages FD rip crap mpm and so crap mpm and so crap mpm and so forth and because I can do this because forth and because I can do this because forth and because I can do this because the dev container. Json is already the dev container. Json is already the dev container. Json is already installing Brew for us so after that is installing Brew for us so after that is installing Brew for us so after that is done it will run the setup script and done it will run the setup script and done it will run the setup script and then I'm giving it a list of packages to then I'm giving it a list of packages to then I'm giving it a list of packages to to to to install so when this is done and it's install so when this is done and it's install so when this is done and it's going to take a while the devp in it going to take a while the devp in it going to take a while the devp in it takes a while it needs to attach the takes a while it needs to attach the takes a while it needs to attach the persistent volume claim but this is just persistent volume claim but this is just persistent volume claim but this is just a onetime thing right so now the the Pod a onetime thing right so now the the Pod a onetime thing right so now the the Pod is up and now it's going to run the it's is up and now it's going to run the it's is up and now it's going to run the it's now going to build the image and run all now going to build the image and run all now going to build the image and run all of the installation scripts and so forth of the installation scripts and so forth of the installation scripts and so forth that is that is all handled by Dev pod that is that is all handled by Dev pod that is that is all handled by Dev pod now why would I want to do this why why now why would I want to do this why why now why would I want to do this why why would you want deathbots well you might would you want deathbots well you might would you want deathbots well you might have seen my full neovim have seen my full neovim have seen my full neovim t-o workflow walkth through and that was t-o workflow walkth through and that was t-o workflow walkth through and that was all based on local configuration files all based on local configuration files all based on local configuration files and in the meantime I have started to and in the meantime I have started to and in the meantime I have started to move towards a code spaces or or move towards a code spaces or or move towards a code spaces or or container based uh workflow I'm I'm container based uh workflow I'm I'm container based uh workflow I'm I'm slowly transitioning towards that now slowly transitioning towards that now slowly transitioning towards that now why do I want that well I want to have a
-
why do I want that well I want to have a why do I want that well I want to have a setup where all I need is a laptop with setup where all I need is a laptop with setup where all I need is a laptop with Docker on it and then then I can pull in Docker on it and then then I can pull in Docker on it and then then I can pull in the code that I want I can pull in my the code that I want I can pull in my the code that I want I can pull in my configuration files and be up and configuration files and be up and configuration files and be up and running I want to be as detached as running I want to be as detached as running I want to be as detached as possible from my local machine I want to possible from my local machine I want to possible from my local machine I want to be able to get up and running anywhere be able to get up and running anywhere be able to get up and running anywhere super fast and this is what Dev pods are super fast and this is what Dev pods are super fast and this is what Dev pods are enabling Me by containerizing everything enabling Me by containerizing everything enabling Me by containerizing everything I can have repost for several clients I can have repost for several clients I can have repost for several clients for example and each client will have for example and each client will have for example and each client will have their own cluster I'm a freelancer so I their own cluster I'm a freelancer so I their own cluster I'm a freelancer so I will need to separate many different will need to separate many different will need to separate many different clients so for every client I can have a clients so for every client I can have a clients so for every client I can have a fully specific environment running where fully specific environment running where fully specific environment running where I can work in and this is something I can work in and this is something I can work in and this is something revolutionary and for me and I can do revolutionary and for me and I can do revolutionary and for me and I can do this in a containerized way using Dev this in a containerized way using Dev this in a containerized way using Dev containers and by utilizing devbot so as containers and by utilizing devbot so as containers and by utilizing devbot so as you see it's now uh it has installed you see it's now uh it has installed you see it's now uh it has installed brew and now it's going to go through brew and now it's going to go through brew and now it's going to go through all of the Brew all of the Brew all of the Brew packages and can we see anything in packages and can we see anything in packages and can we see anything in kubernetes now it is just um it's just kubernetes now it is just um it's just kubernetes now it is just um it's just work it's just working very hard in the work it's just working very hard in the work it's just working very hard in the background now this is going to take a background now this is going to take a background now this is going to take a while so I'm going to pause the while so I'm going to pause the while so I'm going to pause the recording for a bit and I'll be back recording for a bit and I'll be back recording for a bit and I'll be back when this is finished all right so my defp has now finished all right so my defp has now been started we can see it running on been started we can see it running on been started we can see it running on our kubernetes cluster Here and Now what our kubernetes cluster Here and Now what our kubernetes cluster Here and Now what we can do is connect to it by using def
-
we can do is connect to it by using def we can do is connect to it by using def pod pod pod SSH this will show me the def pod that I SSH this will show me the def pod that I SSH this will show me the def pod that I currently have running and I'll select currently have running and I'll select currently have running and I'll select the settle cast and tracker and here we the settle cast and tracker and here we the settle cast and tracker and here we go we are now in the dev P this is a go we are now in the dev P this is a go we are now in the dev P this is a completely fresh environment and as we completely fresh environment and as we completely fresh environment and as we see here this just contains the files see here this just contains the files see here this just contains the files that were in this repo so it had because that were in this repo so it had because that were in this repo so it had because it's running on a kubernetes cluster it it's running on a kubernetes cluster it it's running on a kubernetes cluster it started the Pod and then it copied in started the Pod and then it copied in started the Pod and then it copied in the the files into the workspace so if I the the files into the workspace so if I the the files into the workspace so if I do PWD you see that I'm in workspaces do PWD you see that I'm in workspaces do PWD you see that I'm in workspaces settle tracker that's the convention SL settle tracker that's the convention SL settle tracker that's the convention SL workspaces now if I go to my home workspaces now if I go to my home workspaces now if I go to my home directory directory directory and see here then we'll see that the and see here then we'll see that the and see here then we'll see that the here are my DOT here are my DOT here are my DOT files in the dot files directory so if I files in the dot files directory so if I files in the dot files directory so if I go into the dot files directory here we go into the dot files directory here we go into the dot files directory here we see that there is the setup script and see that there is the setup script and see that there is the setup script and the envm and my bash RC everything was the envm and my bash RC everything was the envm and my bash RC everything was pulled in from the repo like I showed pulled in from the repo like I showed pulled in from the repo like I showed you so if I now go back to workspaces you so if I now go back to workspaces you so if I now go back to workspaces and then settle and then settle and then settle tracker and if I clear this if I now tracker and if I clear this if I now tracker and if I clear this if I now open neovim by pressing V because this open neovim by pressing V because this open neovim by pressing V because this is my Alias that I have in my bash RC is my Alias that I have in my bash RC is my Alias that I have in my bash RC which was loaded it's now going to which was loaded it's now going to which was loaded it's now going to install a completely fresh newm lazy Vim install a completely fresh newm lazy Vim install a completely fresh newm lazy Vim uh setup in my Dev container so it's uh setup in my Dev container so it's uh setup in my Dev container so it's this is completely fresh but it is using this is completely fresh but it is using this is completely fresh but it is using my config you can already see that it's my config you can already see that it's my config you can already see that it's using a non-standard color scheme it it
-
using a non-standard color scheme it it using a non-standard color scheme it it pulls in pulls in pulls in the groove box material color scheme the groove box material color scheme the groove box material color scheme that's the one that I have configured so that's the one that I have configured so that's the one that I have configured so I'll show everything when this is done I'll show everything when this is done I'll show everything when this is done it takes a little while so if I now open it takes a little while so if I now open it takes a little while so if I now open config then you see here that here are a config then you see here that here are a config then you see here that here are a few config files that I have I have my few config files that I have I have my few config files that I have I have my options my line brakes that I want to options my line brakes that I want to options my line brakes that I want to configure but you see that already configure but you see that already configure but you see that already telescope is just working right out of telescope is just working right out of telescope is just working right out of the box no no problems at all uh I have the box no no problems at all uh I have the box no no problems at all uh I have my custom keybinds in here everything my custom keybinds in here everything my custom keybinds in here everything has been brought in has been brought in has been brought in and of course my color scheme for and of course my color scheme for and of course my color scheme for example and so it has loaded my my example and so it has loaded my my example and so it has loaded my my configuration files but there's no LSP configuration files but there's no LSP configuration files but there's no LSP here yet if I open main.go we'll see here yet if I open main.go we'll see here yet if I open main.go we'll see this this does not have um my go this this does not have um my go this this does not have um my go language server yet so what we do is we language server yet so what we do is we language server yet so what we do is we run lazy run lazy run lazy extras and then here it is going to extras and then here it is going to extras and then here it is going to recommend that I it's it it's saw that I recommend that I it's it it's saw that I recommend that I it's it it's saw that I have a Docker file it's going to have a Docker file it's going to have a Docker file it's going to recommend Docker but I'm going to do recommend Docker but I'm going to do recommend Docker but I'm going to do Lango so I'm going to install Lango and Lango so I'm going to install Lango and Lango so I'm going to install Lango and I also like to install prettier for I also like to install prettier for I also like to install prettier for formatting so I install that one as well formatting so I install that one as well formatting so I install that one as well by pressing X enter and now it is going by pressing X enter and now it is going by pressing X enter and now it is going when I restart when I restart when I restart neovim and if I open may not go again neovim and if I open may not go again neovim and if I open may not go again now it's going to install all of the now it's going to install all of the now it's going to install all of the stuff that I that is packaged in these stuff that I that is packaged in these stuff that I that is packaged in these lazy extras so yes this is a bit of a lazy extras so yes this is a bit of a lazy extras so yes this is a bit of a onetime sort of setup when I am setting onetime sort of setup when I am setting onetime sort of setup when I am setting up a new Dev environment I need to yeah
-
up a new Dev environment I need to yeah up a new Dev environment I need to yeah let lazy Vim install I need to um select let lazy Vim install I need to um select let lazy Vim install I need to um select these these these um uh lazy extras but that's it like um uh lazy extras but that's it like um uh lazy extras but that's it like that's that's the tradeoff that I'm that's that's the tradeoff that I'm that's that's the tradeoff that I'm willing to make um because now it's done willing to make um because now it's done willing to make um because now it's done it's it's done like if I do LSP it's it's done like if I do LSP it's it's done like if I do LSP info it is not attached yet it has not info it is not attached yet it has not info it is not attached yet it has not been I probably have to restart if I been I probably have to restart if I been I probably have to restart if I open may not go open may not go open may not go now LSP info here now we see go please was here now we see go please was successfully installed it took a little successfully installed it took a little successfully installed it took a little bit so just a little bit impatient if I bit so just a little bit impatient if I bit so just a little bit impatient if I go LSP info again now we see that the go LSP info again now we see that the go LSP info again now we see that the other clients the attached f um it is other clients the attached f um it is other clients the attached f um it is detecting that go please should attach detecting that go please should attach detecting that go please should attach to this buffer so if I do if I just to this buffer so if I do if I just to this buffer so if I do if I just restart Vim now and open may not go now restart Vim now and open may not go now restart Vim now and open may not go now I have my I have my I have my LSP activated if I do LSP info now we'll LSP activated if I do LSP info now we'll LSP activated if I do LSP info now we'll see one client attached to the buffer see one client attached to the buffer see one client attached to the buffer and go please is installed so I have a and go please is installed so I have a and go please is installed so I have a fully functional language server if I do fully functional language server if I do fully functional language server if I do Funk it's going to um it's going to Funk it's going to um it's going to Funk it's going to um it's going to suggest that I can do a snippet for suggest that I can do a snippet for suggest that I can do a snippet for example like this I can say this hello example like this I can say this hello example like this I can say this hello and then I'm going I can just start and then I'm going I can just start and then I'm going I can just start writing my function so hello is World Etc and you see it says
-
is World Etc and you see it says undefined World it it's it's um undefined World it it's it's um undefined World it it's it's um detecting that I have not set a type and detecting that I have not set a type and detecting that I have not set a type and so forth I have a fully functional so forth I have a fully functional so forth I have a fully functional language server just by doing Lazy language server just by doing Lazy language server just by doing Lazy extras and selecting go and yes extras and selecting go and yes extras and selecting go and yes restarting a few times but now my Dev restarting a few times but now my Dev restarting a few times but now my Dev pod is running so if I just if I detach pod is running so if I just if I detach pod is running so if I just if I detach from this so now I'm detaching I can from this so now I'm detaching I can from this so now I'm detaching I can detach from this to I can completely detach from this to I can completely detach from this to I can completely close down my terminal start a new one close down my terminal start a new one close down my terminal start a new one open t-mo and if I now do Dev pod SSH I open t-mo and if I now do Dev pod SSH I open t-mo and if I now do Dev pod SSH I can now connect like it's it's still can now connect like it's it's still can now connect like it's it's still running so this Dev pod is running on my running so this Dev pod is running on my running so this Dev pod is running on my kubernetes cluster no matter no matter kubernetes cluster no matter no matter kubernetes cluster no matter no matter what happens if I close my laptop now go what happens if I close my laptop now go what happens if I close my laptop now go somewhere else I work at a client's somewhere else I work at a client's somewhere else I work at a client's office for a while in my kubernetes office for a while in my kubernetes office for a while in my kubernetes cluster this death pod is just going to cluster this death pod is just going to cluster this death pod is just going to keep running it's going to be my full keep running it's going to be my full keep running it's going to be my full configured def environment ready for me configured def environment ready for me configured def environment ready for me to go and if I then defp SSH into there to go and if I then defp SSH into there to go and if I then defp SSH into there to my settle cast and to my settle cast and to my settle cast and tracker it's is SSH and if I don't open tracker it's is SSH and if I don't open tracker it's is SSH and if I don't open main.go then I have my complete Dev main.go then I have my complete Dev main.go then I have my complete Dev environment like I had with my Hello environment like I had with my Hello environment like I had with my Hello World function here and uh if I do LSP World function here and uh if I do LSP World function here and uh if I do LSP info SP info we see that the bar the go info SP info we see that the bar the go info SP info we see that the bar the go pleas is attached to to the buffer so it pleas is attached to to the buffer so it pleas is attached to to the buffer so it is a fully functional sort of is a fully functional sort of is a fully functional sort of containerized compartmentalized Dev containerized compartmentalized Dev containerized compartmentalized Dev environment that I can adjust as I
-
environment that I can adjust as I environment that I can adjust as I please I can commit to get from here and please I can commit to get from here and please I can commit to get from here and um if I say that youve seen that it is a um if I say that youve seen that it is a um if I say that youve seen that it is a default configur that is my um adjusted default configur that is my um adjusted default configur that is my um adjusted configuration here but if I would want configuration here but if I would want configuration here but if I would want to say if I go to my uh disable Lua and to say if I go to my uh disable Lua and to say if I go to my uh disable Lua and if I delete these so I want to have the if I delete these so I want to have the if I delete these so I want to have the the normal the normal the normal lazy Vim experience so if I then open lazy Vim experience so if I then open lazy Vim experience so if I then open main.go it's going to install some mini main.go it's going to install some mini main.go it's going to install some mini Pairs and now if I for example run a Pairs and now if I for example run a Pairs and now if I for example run a command you see it the command line on command you see it the command line on command you see it the command line on the top and if I do messages like this the top and if I do messages like this the top and if I do messages like this so you see so you see so you see that the command line is in the top now that the command line is in the top now that the command line is in the top now and I don't like that that's why I and I don't like that that's why I and I don't like that that's why I disable it but you can configure your disable it but you can configure your disable it but you can configure your environment per project that you're environment per project that you're environment per project that you're working on and you can have that defined working on and you can have that defined working on and you can have that defined in code it is amazing but I'm I'm using in code it is amazing but I'm I'm using in code it is amazing but I'm I'm using the the formal def container. the the formal def container. the the formal def container. Json uh that's the great thing about Json uh that's the great thing about Json uh that's the great thing about this I'm just using the def container. this I'm just using the def container. this I'm just using the def container. Json which is also used with vs code but Json which is also used with vs code but Json which is also used with vs code but I am utilizing Dev pod to connect to I am utilizing Dev pod to connect to I am utilizing Dev pod to connect to them and because I'm installing lazy Vim them and because I'm installing lazy Vim them and because I'm installing lazy Vim neovim directly into the Container I neovim directly into the Container I neovim directly into the Container I have my fully configured Dev environment have my fully configured Dev environment have my fully configured Dev environment that I want to be able be available that I want to be able be available that I want to be able be available everywhere I can just run that in every everywhere I can just run that in every everywhere I can just run that in every container that that I want and it's container that that I want and it's container that that I want and it's amazing I now have for each project that amazing I now have for each project that amazing I now have for each project that I do I am going to have my uh own Dev I do I am going to have my uh own Dev I do I am going to have my uh own Dev container running on my kubernetes
-
container running on my kubernetes container running on my kubernetes cluster or on my Docker machine on my cluster or on my Docker machine on my cluster or on my Docker machine on my Docker running on my laptop here uh it Docker running on my laptop here uh it Docker running on my laptop here uh it doesn't really matter everything is doesn't really matter everything is doesn't really matter everything is neatly compartmentalized I can SSH into neatly compartmentalized I can SSH into neatly compartmentalized I can SSH into them as I like uh I can go other places them as I like uh I can go other places them as I like uh I can go other places it is an amazing way of working and the it is an amazing way of working and the it is an amazing way of working and the main benefit is you don't have anything main benefit is you don't have anything main benefit is you don't have anything installed locally eventually I'm still installed locally eventually I'm still installed locally eventually I'm still trans positioning but that is the goal trans positioning but that is the goal trans positioning but that is the goal so I'm now containerizing my tattle cast so I'm now containerizing my tattle cast so I'm now containerizing my tattle cast my home lab is already containerized if my home lab is already containerized if my home lab is already containerized if I open this here you see there is a Dev I open this here you see there is a Dev I open this here you see there is a Dev container here uh and here I had to do container here uh and here I had to do container here uh and here I had to do some more things because um some more things because um some more things because um U we were using Brew in order to run the U we were using Brew in order to run the U we were using Brew in order to run the dev container and to install neovim in dev container and to install neovim in dev container and to install neovim in the dev container however Brew is not the dev container however Brew is not the dev container however Brew is not available for arm on Linux unfortunately available for arm on Linux unfortunately available for arm on Linux unfortunately so when I so when I so when I run Dev pods in Docker on my M2 Mac so run Dev pods in Docker on my M2 Mac so run Dev pods in Docker on my M2 Mac so on my silicon Mac I cannot use the trick on my silicon Mac I cannot use the trick on my silicon Mac I cannot use the trick that we did with the Homebrew neovim that we did with the Homebrew neovim that we did with the Homebrew neovim then I had to do a different trick and then I had to do a different trick and then I had to do a different trick and for that I used NYX as a package manager for that I used NYX as a package manager for that I used NYX as a package manager and that's what I'm going to show you in and that's what I'm going to show you in and that's what I'm going to show you in the next video so let me know what you the next video so let me know what you the next video so let me know what you think try it out you don't need vs Cod think try it out you don't need vs Cod think try it out you don't need vs Cod to work with Dev containers you can have to work with Dev containers you can have to work with Dev containers you can have all the benefits of Dev containers Dev all the benefits of Dev containers Dev all the benefits of Dev containers Dev environments in Code by using devbot and environments in Code by using devbot and environments in Code by using devbot and neovim it is amazing so thank you so neovim it is amazing so thank you so neovim it is amazing so thank you so much for watching see you in the next much for watching see you in the next much for watching see you in the next video
Summary
This presentation demonstrates how to use Dev containers with Neovim by leveraging Dev Pod, an open-source alternative to GitHub Codespaces. The key is to utilize Dev Container Features, specifically the "brew" and "neovim" features, within a Dev Container configuration. The practical takeaway is that you can now run Dev containers, customized with Neovim, on your own Kubernetes cluster using Dev Pod.