<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Giuseppe Gadola</title>
    <description>The latest articles on DEV Community by Giuseppe Gadola (@giusgad).</description>
    <link>https://dev.to/giusgad</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1001172%2Fc917ee61-3104-474b-bce0-5ba06c58d22c.jpeg</url>
      <title>DEV Community: Giuseppe Gadola</title>
      <link>https://dev.to/giusgad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/giusgad"/>
    <language>en</language>
    <item>
      <title>Vimscript to lua: everything you need to know</title>
      <dc:creator>Giuseppe Gadola</dc:creator>
      <pubDate>Tue, 03 Jan 2023 18:25:16 +0000</pubDate>
      <link>https://dev.to/giusgad/vimscript-to-lua-everything-you-need-to-know-34j6</link>
      <guid>https://dev.to/giusgad/vimscript-to-lua-everything-you-need-to-know-34j6</guid>
      <description>&lt;h2&gt;
  
  
  Introduction to Lua
&lt;/h2&gt;

&lt;p&gt;If you already know the syntax of the Lua programming language, you can skip this section. Alternatively, you can watch a quick introduction to the language on YouTube, there are a lot of valid ones. Here, I'm going to provide a quick overview of most of the features used for vim configuration you need to know about.&lt;/p&gt;

&lt;p&gt;Before I provide some usage examples, you need to know that the Lua programming language uses one single data structure, tables, which emulate arrays and maps/dictionaries. Note that the indexing starts at 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;var1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;-- global variable&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;var2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="c1"&gt;-- local variable&lt;/span&gt;
&lt;span class="n"&gt;strings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"1"&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;"2"&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s"&gt;[[3]]&lt;/span&gt; &lt;span class="c1"&gt;-- ways to write a string and concatenation&lt;/span&gt;

&lt;span class="n"&gt;condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="c1"&gt;-- booleans and if statments&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;elseif&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;say_hi_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hi "&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"goodbye"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;-- used as array&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"world"&lt;/span&gt; &lt;span class="c1"&gt;-- and dictionary&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;ipairs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="c1"&gt;-- for range loop&lt;/span&gt;
    &lt;span class="c1"&gt;-- ipairs only gets indexed values (with no user-defined key)&lt;/span&gt;
    &lt;span class="c1"&gt;-- pairs gets all keys and values in tables&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'plugin-name'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;-- used to import files or use plugins&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;To get started configuring your neovim with Lua, you need to create an &lt;code&gt;init.lua&lt;/code&gt; file, in the same directory where you would put your vimrc for neovim. For instance, on Linux, it would be something like &lt;code&gt;$HOME/.config/nvim/init.lua&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;From here, you can have two different approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;writing your entire config inside the init file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dividing your config into different files&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you choose the second approach, you'll have to put all the files except your &lt;code&gt;init.lua&lt;/code&gt; inside the &lt;code&gt;lua&lt;/code&gt; folder, in your &lt;code&gt;nvim&lt;/code&gt; config folder. Here is an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.config/nvim/
|  init.lua
|  lua/
|  |  options.lua
|  |  plugins/
|  |  |  init.lua
|  |  |  &amp;lt;plugin-name&amp;gt;.lua
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case, your main init.lua would look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;-- no file extension&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;-- require a folder&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you require a folder, what Lua actually does is search for an &lt;code&gt;init.lua&lt;/code&gt; inside that folder, so inside that file, you would have to manually require all the other files in the folder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting options
&lt;/h2&gt;

&lt;p&gt;Now you're finally ready to start translating or writing your config in Lua. The first thing I'll go over is setting options. To do so, you'll most likely always use the &lt;code&gt;vim&lt;/code&gt; module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tabstop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;autoindent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;vim.opt&lt;/code&gt; is the most used method and works pretty much the same way &lt;code&gt;:set&lt;/code&gt; does. If you're not sure what to use, this is the recommended way to set any option, if you don't have specific needs.&lt;/p&gt;

&lt;p&gt;You can also set general settings with &lt;code&gt;vim.o&lt;/code&gt; or buffer-scoped settings with &lt;code&gt;vim.bo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In some cases, you need to use &lt;code&gt;vim.cmd&lt;/code&gt;, for example in setting the color scheme &lt;code&gt;vim.cmd.colorscheme("gruvbox")&lt;/code&gt; which is equivalent to &lt;code&gt;vim.cmd("colorscheme gruvbox")&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
The string inside&lt;code&gt;vim.cmd()&lt;/code&gt; is interpreted as Vimscript.&lt;/p&gt;

&lt;p&gt;Lastly, global options are set with &lt;code&gt;vim.g&lt;/code&gt;, which is mostly used by plugins, and to set the leader key &lt;code&gt;vim.g.leader = " "&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting key mappings
&lt;/h2&gt;

&lt;p&gt;To set keymaps in Lua, you have mainly two options: &lt;code&gt;vim.api.nvim_set_keymap()&lt;/code&gt; or &lt;code&gt;vim.keymap.set()&lt;/code&gt;, where the latter is basically a wrapper for the former. The main difference in terms of configuration is that using &lt;code&gt;vim.keymap.set&lt;/code&gt; allows you to assign a mapping to a Lua function in a more elegant way. Here are examples for both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- opts set in a table to not repeat them everytime&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;noremap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;silent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;-- (mode, lhs, rhs, options)&lt;/span&gt;
&lt;span class="c1"&gt;-- lhs = keys to be mapped, rhs = command executed&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_set_keymap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;gv"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;-- like vnoremap&lt;/span&gt;

&lt;span class="c1"&gt;-- (mode, lhs, rhs, options)&lt;/span&gt;
&lt;span class="c1"&gt;-- here mode can be a either string or a table&lt;/span&gt;
&lt;span class="c1"&gt;-- rhs can be either a string with commands or a lua function&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;my_func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;[[echo "hello world"]]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;-- this is a string&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s2"&gt;"v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my_func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- map a command&lt;/span&gt;
&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"v"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;":wq&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Plugins
&lt;/h2&gt;

&lt;p&gt;To finish off your configuration, you'll probably want to add some plugins to your neovim, possibly replacing Vimscript plugins with Lua ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plugin manager
&lt;/h3&gt;

&lt;p&gt;Changing your plugin manager is the first step, and will make configuring all the other plugins a lot easier. You can use for example &lt;a href="https://github.com/wbthomason/packer.nvim"&gt;packer.nvim&lt;/a&gt;. Refer to the official GitHub page for installation and configuration. Here is a simple example showing how to install a plugin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"packer"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"plugin name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Plugin customization
&lt;/h3&gt;

&lt;p&gt;Most neovim plugins will then have either a setup or configure function, which will allow you to customize the plugin's options. Here is an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"plugin name"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="n"&gt;option1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;option2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"aaa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"bbb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Refer to the specific plugin wiki to see how it's possible to configure it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lua plugins
&lt;/h3&gt;

&lt;p&gt;In this section, I will try to provide some examples of plugins to act as replacements for your old vim plugins.&lt;/p&gt;

&lt;p&gt;You can try:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/nvim-lualine/lualine.nvim"&gt;lualine&lt;/a&gt; (to replace vim-airline)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/nvim-tree/nvim-tree.lua"&gt;nvim-tree&lt;/a&gt; (to replace nerdtree)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/lewis6991/gitsigns.nvim"&gt;gitsigns&lt;/a&gt; (to replace vim-gitgutter)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/nvim-telescope/telescope.nvim"&gt;telescope&lt;/a&gt; (to replace fzf, or any kind of fuzzy finding)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To replace &lt;a href="https://github.com/neoclide/coc.nvim"&gt;coc&lt;/a&gt; and &lt;a href="https://github.com/dense-analysis/ale"&gt;ale&lt;/a&gt;, you'll probably need to install more than two plugins. Neovim is in fact well known for its built-in LSP, which can be configured in many ways.&lt;br&gt;&lt;br&gt;
The quickest one is by using &lt;a href="https://github.com/VonHeikemen/lsp-zero.nvim"&gt;lsp-zero&lt;/a&gt;, which sets up automatically language servers and autocompletion, without you having to write everything on your own.&lt;br&gt;&lt;br&gt;
Alternatively, you can manually set up &lt;a href="https://github.com/williamboman/mason.nvim"&gt;mason&lt;/a&gt;, &lt;a href="https://github.com/hrsh7th/nvim-cmp"&gt;nvim-cmp&lt;/a&gt;, &lt;a href="https://github.com/jose-elias-alvarez/null-ls.nvim"&gt;null-ls&lt;/a&gt; and more, to achieve a similar result with your own efforts. I will write another blog post about this, so stay tuned.&lt;/p&gt;

&lt;p&gt;One last cool plugin I'd like to suggest is &lt;a href="https://github.com/akinsho/toggleterm.nvim"&gt;toggleterm&lt;/a&gt;, which allows you to use the terminal inside neovim in different layouts and styles.&lt;/p&gt;

</description>
      <category>vim</category>
      <category>linux</category>
      <category>neovim</category>
      <category>lua</category>
    </item>
  </channel>
</rss>
