<?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: Douglas Massolari</title>
    <description>The latest articles on DEV Community by Douglas Massolari (@dmass).</description>
    <link>https://dev.to/dmass</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%2F87631%2Fe7c52913-9288-4a8e-8acc-c1214304857d.jpg</url>
      <title>DEV Community: Douglas Massolari</title>
      <link>https://dev.to/dmass</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dmass"/>
    <language>en</language>
    <item>
      <title>Setting Up Neovim with Fennel</title>
      <dc:creator>Douglas Massolari</dc:creator>
      <pubDate>Tue, 06 Jun 2023 09:34:56 +0000</pubDate>
      <link>https://dev.to/dmass/setting-up-neovim-with-fennel-2apb</link>
      <guid>https://dev.to/dmass/setting-up-neovim-with-fennel-2apb</guid>
      <description>&lt;h2&gt;
  
  
  It all starts on the &lt;del&gt;moon&lt;/del&gt; Lua
&lt;/h2&gt;

&lt;p&gt;One of the most anticipated and loved features by Neovim users is the &lt;a href="https://www.lua.org/" rel="noopener noreferrer"&gt;lua&lt;/a&gt; support.&lt;/p&gt;

&lt;p&gt;This support officially came in version 0.5 of the neovim, which went on to allow the users to &lt;del&gt;throw away&lt;/del&gt; stop using their &lt;code&gt;init.vim&lt;/code&gt; and set up the neovim with a nice &lt;code&gt;init.lua&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And a happy consequence of this is that we can not only use Lua, but we can use &lt;a href="https://luarocks.org/" rel="noopener noreferrer"&gt;lua ecosystem packages&lt;/a&gt; and &lt;strong&gt;languages that compile to Lua&lt;/strong&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Hello, &lt;del&gt;Peter&lt;/del&gt; Fennel
&lt;/h2&gt;

&lt;p&gt;Fennel is one of these languages that compile to Lua, which means you will write Fennel code and the compiler will generate Lua code, which will be read and run by neovim.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Fennel -&amp;gt; Lua -&amp;gt; Neovim


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  But why Fennel?
&lt;/h3&gt;

&lt;p&gt;This is a very common question that people ask when I say that I use Fennel.&lt;/p&gt;

&lt;p&gt;It seems that's a common question that people ask everyone who uses Fennel because the official Fennel website &lt;a href="https://fennel-lang.org/rationale" rel="noopener noreferrer"&gt;has the answer to exactly this question&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I will summarize their response in a few points.&lt;/p&gt;
&lt;h4&gt;
  
  
  Fennel is less error-prone
&lt;/h4&gt;

&lt;p&gt;Lua is a great language, but some points can facilitate the occurrence of errors.&lt;/p&gt;

&lt;p&gt;One of the points is the ease with which you access or change a global variable.&lt;br&gt;
If you create a variable without the &lt;code&gt;local&lt;/code&gt; keyword it is already a global variable. And to access the value of that variable, you just need to type the name of the variable, which can cause unexpected behavior, for example:&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;-- settings.lua&lt;/span&gt;
&lt;span class="n"&gt;myVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'this is global'&lt;/span&gt;


&lt;span class="c1"&gt;-- init.lua&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;myVal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'local'&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'this is the value of local: '&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;myVar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;-- Oops&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Note that, due to a typing error in the word &lt;code&gt;myVal&lt;/code&gt;, replacing &lt;code&gt;l&lt;/code&gt; with &lt;code&gt;r&lt;/code&gt; we end up accessing the value of a global variable defined elsewhere.&lt;br&gt;
Errors like this can be difficult to find out.&lt;/p&gt;

&lt;p&gt;Fennel prevents errors like this by allowing access to global variables only through the &lt;code&gt;_G&lt;/code&gt; table.&lt;br&gt;
When trying to simulate the above case in Fennel, the compiler will alert us that the &lt;code&gt;myVar&lt;/code&gt; variable does not exist.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

(local myVal "local")
(print (.. "This is the value of local: " myVar))

:: COMPILE ERROR
  xxx settings/globals.fnl
      Compile error in settings/globals.fnl:42
        unknown identifier in strict mode: myVar

      * Try looking to see if there's a typo.
      * Try using the _G table instead, eg. _G.myVar if you really want a global.
      * Try moving this code to somewhere that myVar is in scope.
      * Try binding myVar as a local in the scope of this code.


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Another point, which can facilitate the occurrence of Lua errors, is the lack of validation of the number of arguments of a function.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;myAnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="k"&gt;end&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;myAnd&lt;/span&gt;&lt;span class="p"&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;-- nil&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Notice that I only passed 1 argument, and the function works with 2 parameters, the code in Lua ran without telling me that I forgot to pass another argument to the function.&lt;/p&gt;

&lt;p&gt;In Fennel, we can use the &lt;code&gt;lambda&lt;/code&gt; keyword to create functions that validate parameters:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

(lambda my-and [x y]
  (and x y))

(print (my-and true)) ; Error [...] Missing argument y


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Note: In Fennel, &lt;code&gt;;&lt;/code&gt; is the character used to start a comment&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  (Syntax (from (Lisp!)))
&lt;/h4&gt;

&lt;p&gt;This is a bit controversial because some people don't like Lisp's syntax, but it has some benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything is an expression, i.e. we don't have &lt;em&gt;statements&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;When dealing with operators, there is no ambiguity of what comes first, we have no "operator precedence". (In lua, for example, &lt;code&gt;A or B and C or D&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These points make Fennel a very simple language to program and maintain.&lt;/p&gt;
&lt;h4&gt;
  
  
  Modernity and facilities
&lt;/h4&gt;

&lt;p&gt;In addition to the points mentioned above, it is worth highlighting some interesting features that Fennel brings to make our lives easier.&lt;/p&gt;

&lt;p&gt;With Fennel, we have &lt;em&gt;destructuring&lt;/em&gt;, &lt;em&gt;pattern matching&lt;/em&gt;, &lt;em&gt;macros&lt;/em&gt; and more.&lt;/p&gt;
&lt;h5&gt;
  
  
  Destructuring
&lt;/h5&gt;

&lt;p&gt;While on Lua we do:&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;-- Lua&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="s1"&gt;'module'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;var&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="nb"&gt;require&lt;/span&gt;&lt;span class="s1"&gt;'module'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;var2&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;In fennel, we can simply do:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

; Fennel
(local {: var : var2} (require :module))


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h5&gt;
  
  
  Pattern matching
&lt;/h5&gt;

&lt;p&gt;When we want to test the value of a variable several times, in Lua, we make an &lt;code&gt;if&lt;/code&gt; sequence:&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;-- Lua&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get_desc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"Key 1"&lt;/span&gt;
  &lt;span class="k"&gt;elseif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"k2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"Key 2"&lt;/span&gt;
  &lt;span class="k"&gt;elseif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"k3"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"Key 3"&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Whereas, in fennel, we can use &lt;code&gt;match&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

; Fennel
(lambda get-desc [key]
  (match key
    :k1 "Key 1"
    :k2 "Key 2"
    :k3 "Key 3"))


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  How to get started
&lt;/h3&gt;

&lt;p&gt;Now that I've convinced you (at least I hope) to use Fennel, let's see how to start using it to configure Neovim!&lt;/p&gt;

&lt;p&gt;We will use two plugins for this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;tangerine &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/udayvir-singh" rel="noopener noreferrer"&gt;
        udayvir-singh
      &lt;/a&gt; / &lt;a href="https://github.com/udayvir-singh/tangerine.nvim" rel="noopener noreferrer"&gt;
        tangerine.nvim
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🍊 Sweet Fennel integration for Neovim
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🍊 Tangerine 🍊&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/03cad28e9e2c4a6b5f5324da75c8c2719d4319469ac5db12b53f25fff34ab839/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e656f76696d2d302e352d3537413134333f7374796c653d666c61742d737175617265266c6f676f3d6e656f76696d"&gt;&lt;img src="https://camo.githubusercontent.com/03cad28e9e2c4a6b5f5324da75c8c2719d4319469ac5db12b53f25fff34ab839/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e656f76696d2d302e352d3537413134333f7374796c653d666c61742d737175617265266c6f676f3d6e656f76696d" alt="Neovim version"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c00d75ac3a0fed67574f85e93d867363f578596d8707a3c5c1246f3df6c38693/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e656f76696d253230496e253230456d6163732d302e352d6461633f7374796c653d666c61742d737175617265266c6f676f3d676e75656d616373266c6f676f436f6c6f723d646166"&gt;&lt;img src="https://camo.githubusercontent.com/c00d75ac3a0fed67574f85e93d867363f578596d8707a3c5c1246f3df6c38693/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e656f76696d253230496e253230456d6163732d302e352d6461633f7374796c653d666c61742d737175617265266c6f676f3d676e75656d616373266c6f676f436f6c6f723d646166" alt="GNU Neovim in Emacs version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/udayvir-singh/tangerine.nvim#about" rel="noopener noreferrer"&gt;About&lt;/a&gt; • &lt;a href="https://github.com/udayvir-singh/tangerine.nvim#installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt; • &lt;a href="https://github.com/udayvir-singh/tangerine.nvim#setup" rel="noopener noreferrer"&gt;Setup&lt;/a&gt; • &lt;a href="https://github.com/udayvir-singh/tangerine.nvim#commands" rel="noopener noreferrer"&gt;Commands&lt;/a&gt; • &lt;a href="https://github.com/udayvir-singh/tangerine.nvim#api" rel="noopener noreferrer"&gt;API&lt;/a&gt; • &lt;a href="https://github.com/udayvir-singh/tangerine.nvim#development" rel="noopener noreferrer"&gt;Development&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/97400310/326354536-10082888-b01e-4dbe-b105-4aa74391bb52.svg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjgwNzE1MzMsIm5iZiI6MTcyODA3MTIzMywicGF0aCI6Ii85NzQwMDMxMC8zMjYzNTQ1MzYtMTAwODI4ODgtYjAxZS00ZGJlLWIxMDUtNGFhNzQzOTFiYjUyLnN2Zz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDEwMDQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQxMDA0VDE5NDcxM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBiMmM4NDdkMjQ3NGE5YWVhODRkM2ZhOTg3YzUwZjJhYjE3MTZmM2NhNGZhYWRhYTc4NDFlNjE5MDMyNDU2ODUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.XLuIe_gE_cwtdX6Pq7St_tXxQt_OYdrQN639qXrnMv0"&gt;&lt;img width="700" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F97400310%2F326354536-10082888-b01e-4dbe-b105-4aa74391bb52.svg%3Fjwt%3DeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjgwNzE1MzMsIm5iZiI6MTcyODA3MTIzMywicGF0aCI6Ii85NzQwMDMxMC8zMjYzNTQ1MzYtMTAwODI4ODgtYjAxZS00ZGJlLWIxMDUtNGFhNzQzOTFiYjUyLnN2Zz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDEwMDQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQxMDA0VDE5NDcxM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBiMmM4NDdkMjQ3NGE5YWVhODRkM2ZhOTg3YzUwZjJhYjE3MTZmM2NhNGZhYWRhYTc4NDFlNjE5MDMyNDU2ODUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.XLuIe_gE_cwtdX6Pq7St_tXxQt_OYdrQN639qXrnMv0"&gt;&lt;/a&gt;
&lt;/p&gt;


&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;About&lt;/h1&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Tangerine provides a painless way to add fennel to your config.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;🔥   &lt;em&gt;BLAZING&lt;/em&gt; fast, compile times in milliseconds&lt;/li&gt;
&lt;li&gt;🌊  100% support for interactive evaluation&lt;/li&gt;
&lt;li&gt;🎍 Control over when and how to compile&lt;/li&gt;
&lt;li&gt;🎀 Natively loads &lt;code&gt;nvim/init.fnl&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Comparison to other plugins&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;b&gt;HOTPOT 🍲&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Abstracts too much away from the user.&lt;/li&gt;
&lt;li&gt;Hooks onto lua package searchers to compile [harder to debug].&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;ANISEED 🌿&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excessively feature rich for use in dotfiles.&lt;/li&gt;
&lt;li&gt;Blindly compiles all files that it founds, resulting in slow load times.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Installation&lt;/h1&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Create file &lt;code&gt;plugin/0-tangerine.lua&lt;/code&gt; to bootstrap tangerine:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="markdown-alert markdown-alert-important"&gt;
&lt;p class="markdown-alert-title"&gt;Important&lt;/p&gt;
&lt;p&gt;If you are using &lt;a href="https://github.com/folke/lazy.nvim" rel="noopener noreferrer"&gt;lazy.nvim&lt;/a&gt; then you should create &lt;code&gt;init.lua&lt;/code&gt; instead of &lt;code&gt;plugin/0-tangerine.lua&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href="https://github.com/udayvir-singh/tangerine.nvim/issues/20" rel="noopener noreferrer"&gt;#20&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="highlight highlight-source-lua notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;--&lt;/span&gt; ~/.config/nvim/plugin/0-tangerine.lua or ~/.config/nvim/init.lua&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;--&lt;/span&gt; pick your plugin manager&lt;/span&gt;
&lt;span class="pl-k"&gt;local&lt;/span&gt; &lt;span class="pl-smi"&gt;pack&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;tangerine&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;packer&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;paq&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;lazy&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/udayvir-singh/tangerine.nvim" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;hibiscus &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
&lt;br&gt;
  &lt;div class="readme-overview"&gt;
&lt;br&gt;
    &lt;h2&gt;
&lt;br&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;&lt;br&gt;
      &lt;a href="https://github.com/udayvir-singh" rel="noopener noreferrer"&gt;&lt;br&gt;
        udayvir-singh&lt;br&gt;
      &lt;/a&gt; / &lt;a href="https://github.com/udayvir-singh/hibiscus.nvim" rel="noopener noreferrer"&gt;&lt;br&gt;
        hibiscus.nvim&lt;br&gt;
      &lt;/a&gt;&lt;br&gt;
    &lt;/h2&gt;
&lt;br&gt;
    &lt;h3&gt;
&lt;br&gt;
      🌺 Flavored Fennel Macros for Neovim&lt;br&gt;
    &lt;/h3&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="ltag-github-body"&gt;
&lt;br&gt;
    

&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Hibiscus.nvim&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🌺 Highly opinionated macros to elegantly write your neovim config.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Companion library for &lt;a href="https://github.com/udayvir-singh/tangerine.nvim" rel="noopener noreferrer"&gt;tangerine&lt;/a&gt;
but it can also be used standalone.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9e2e7d966221aedc8f0d577c53aa41ba612f9c7d547ce741564961e36a7c00fb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466f725f4e656f76696d2d302e382d6461623f7374796c653d666f722d7468652d6261646765266c6f676f3d6e656f76696d266c6f676f436f6c6f723d646162"&gt;&lt;img src="https://camo.githubusercontent.com/9e2e7d966221aedc8f0d577c53aa41ba612f9c7d547ce741564961e36a7c00fb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466f725f4e656f76696d2d302e382d6461623f7374796c653d666f722d7468652d6261646765266c6f676f3d6e656f76696d266c6f676f436f6c6f723d646162" alt="Neovim version"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Rational&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;🍬         Syntactic eye candy over hellscape of lua api&lt;/li&gt;
&lt;li&gt;🎋 Provides missing features in both fennel and nvim api&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Installation&lt;/h1&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Create file &lt;code&gt;plugin/0-tangerine.lua&lt;/code&gt; to bootstrap hibiscus:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: if you are using &lt;a href="https://github.com/folke/lazy.nvim" rel="noopener noreferrer"&gt;lazy&lt;/a&gt; plugin manager,
you should create &lt;code&gt;/init.lua&lt;/code&gt; instead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight highlight-source-lua notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;--&lt;/span&gt; ~/.config/nvim/plugin/0-tangerine.lua or ~/.config/nvim/init.lua&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;--&lt;/span&gt; pick your plugin manager&lt;/span&gt;
&lt;span class="pl-k"&gt;local&lt;/span&gt; &lt;span class="pl-smi"&gt;pack&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;tangerine&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;packer&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;paq&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;lazy&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;

&lt;span class="pl-k"&gt;local&lt;/span&gt; &lt;span class="pl-k"&gt;function&lt;/span&gt; &lt;span class="pl-en"&gt;bootstrap&lt;/span&gt;(&lt;span class="pl-smi"&gt;url&lt;/span&gt;, &lt;span class="pl-smi"&gt;ref&lt;/span&gt;)
    &lt;span class="pl-k"&gt;local&lt;/span&gt; &lt;span class="pl-smi"&gt;name&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;url&lt;/span&gt;:&lt;span class="pl-c1"&gt;gsub&lt;/span&gt;(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;.*/&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;)
    &lt;span class="pl-k"&gt;local&lt;/span&gt; &lt;span class="pl-smi"&gt;path&lt;/span&gt;

    &lt;span class="pl-k"&gt;if&lt;/span&gt; &lt;span class="pl-smi"&gt;pack&lt;/span&gt; &lt;span class="pl-k"&gt;==&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;lazy&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;then&lt;/span&gt;
        &lt;span class="pl-smi"&gt;path&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-smi"&gt;vim&lt;/span&gt;.&lt;span class="pl-e"&gt;fn&lt;/span&gt;.&lt;span class="pl-c1"&gt;stdpath&lt;/span&gt;(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;data&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;) &lt;span class="pl-k"&gt;..&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/lazy/&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;..&lt;/span&gt; &lt;span class="pl-smi"&gt;name&lt;/span&gt;
        &lt;span class="pl-smi"&gt;vim&lt;/span&gt;.&lt;span class="pl-e"&gt;opt&lt;/span&gt;.&lt;span class="pl-en"&gt;rtp&lt;/span&gt;:&lt;span class="pl-c1"&gt;prepend&lt;/span&gt;(&lt;span class="pl-smi"&gt;path&lt;/span&gt;)
    &lt;span class="pl-k"&gt;else&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/udayvir-singh/hibiscus.nvim" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Tangerine integrates Fennel with Neovim very transparently, compiling Fennel files to Lua and bringing some interesting tools.&lt;br&gt;
hibiscus brings several macros related to the Neovim ecosystem that help us to write less&lt;/p&gt;

&lt;p&gt;The first step is to create the &lt;code&gt;~/.config/nvim/plugin/0-tangerine.lua&lt;/code&gt; file with the content:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bootstrap&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="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&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;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isdirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&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;name&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;": installing in data dir..."&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;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"clone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"--depth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&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="s"&gt;[[redraw]]&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;name&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;": finished installing"&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;end&lt;/span&gt;

&lt;span class="n"&gt;bootstrap&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;"tangerine.nvim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"https://github.com/udayvir-singh/tangerine.nvim"&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;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdpath&lt;/span&gt; &lt;span class="s2"&gt;"data"&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;"/site/pack/packer/start/tangerine.nvim"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bootstrap&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;"hibiscus.nvim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"https://github.com/udayvir-singh/hibiscus.nvim"&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;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdpath&lt;/span&gt; &lt;span class="s2"&gt;"data"&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;"/site/pack/packer/start/hibiscus.nvim"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="s1"&gt;'tangerine'&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;compiler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;verbose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;hooks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"onsave"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"oninit"&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;blockquote&gt;
&lt;p&gt;This setup assumes you use &lt;em&gt;Packer&lt;/em&gt; to manage your plugins, if you don't, check the Tangerine repository for how to install it in your plugin manager.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With this, when restarting Neovim, tangerine and Hibiscus will be downloaded and initialized.&lt;/p&gt;

&lt;p&gt;This means you can now start configuring Neovim in Fennel by creating a &lt;code&gt;~/.config/nvim/init.fnl&lt;/code&gt; file 🎉&lt;/p&gt;

&lt;p&gt;When you save this file, tangerine will already compile it and generate the lua file to be loaded by Neovim, not requiring any additional configuration for this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tips for getting started with Fennel
&lt;/h3&gt;

&lt;p&gt;Documentation is your friend!&lt;/p&gt;

&lt;p&gt;The two best sources for understanding how Fennel works are Fennel's &lt;a href="https://fennel-lang.org/tutorial" rel="noopener noreferrer"&gt;tutorial&lt;/a&gt; and &lt;a href="https://fennel-lang.org/reference" rel="noopener noreferrer"&gt;reference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'll advance some simple things for you to understand the basics.&lt;/p&gt;

&lt;h4&gt;
  
  
  Parentheses
&lt;/h4&gt;

&lt;p&gt;You will see a lot of parentheses in Fennel, they serve to delimit where an expression starts and ends.&lt;/p&gt;

&lt;p&gt;For example, to declare a variable in the local scope, in Lua, you use the keyword &lt;code&gt;local&lt;/code&gt;, whereas in Fennel you call the &lt;strong&gt;function&lt;/strong&gt; &lt;code&gt;local&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

(local myVar "myValue") ; myVar = "myValue"


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;If the value of the variable is the result of a concatenation, we will not use the operator &lt;code&gt;..&lt;/code&gt;, but the &lt;strong&gt;function&lt;/strong&gt; &lt;code&gt;..&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

(local name "Fennel")
(local myVar (.. "Hello, " name)) ; myVar = "Hello, Fennel"


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In short, every function you call will be enclosed in parentheses.&lt;/p&gt;

&lt;h4&gt;
  
  
  Neovim API
&lt;/h4&gt;

&lt;p&gt;Everything you do with Lua, you do with Fennel, so the same call you make to a Neovim API in Lua, you'll make in Fennel.&lt;br&gt;
This, on Lua:&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;-- Lua&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;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdpath&lt;/span&gt;&lt;span class="s2"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;this is it, in fennel:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

(print (vim.fn.stdpath :config))


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
  
  
  :symbol
&lt;/h4&gt;

&lt;p&gt;You may have already noticed that, in some cases, I wrote some strings in Lua using &lt;code&gt;:&lt;/code&gt; in fennel (if you didn't, just look at the last example)&lt;/p&gt;

&lt;p&gt;This is another way to write a string. However, to write in this format, the string cannot contain spaces.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

(= :str "str") ; true


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Tangerine Mappings
&lt;/h3&gt;

&lt;p&gt;The plugin we use to integrate Fennel with Neovim has some mappings and commands that help us write code that will generate what we want. I'll list the ones I use the most below:&lt;/p&gt;
&lt;h4&gt;
  
  
  gL
&lt;/h4&gt;

&lt;p&gt;It can be run both in normal mode and in visual mode.&lt;br&gt;
This mapping shows the Lua code that your Fennel code will generate.&lt;br&gt;
For example, if I press &lt;code&gt;gL&lt;/code&gt; after selecting the snippet:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

(lambda add [x y]
  (+ x y))


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;It opens a window containing the code in Lua:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;

&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;_G&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="o"&gt;~=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;"Missing argument y on globals.fnl:1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;_G&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="o"&gt;~=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;"Missing argument x on globals.fnl:1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&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;return&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Very useful for quickly checking that the fennel code you are writing will generate the Lua code you expect.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: This mapping doesn't work very well in visual mode if you select a snippet that uses some macro unless the snippet has the macro import.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  gO
&lt;/h4&gt;

&lt;p&gt;This mapping opens the lua file compiled by the open fennel file, that is, if you have the &lt;code&gt;plugins.fnl&lt;/code&gt; file open and press &lt;code&gt;gO&lt;/code&gt;, it will open the &lt;code&gt;plugins.lua&lt;/code&gt; file that was generated by the compilation of &lt;code&gt;plugins.fnl&lt;/code&gt;.&lt;br&gt;
Very useful for debugging.&lt;/p&gt;

&lt;h4&gt;
  
  
  :Fnl
&lt;/h4&gt;

&lt;p&gt;You can run any code in Fennel with the &lt;code&gt;:Fnl&lt;/code&gt; command, just like &lt;code&gt;:lua&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;:Fnl (print "hey")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Will print &lt;code&gt;hey&lt;/code&gt;, equivalent to &lt;code&gt;:lua print("hey")&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Now it's up to you
&lt;/h2&gt;

&lt;p&gt;From here, you're ready to have some fun using Fennel (and it is).&lt;/p&gt;

&lt;p&gt;Any questions, ask here in the comments!&lt;/p&gt;

&lt;p&gt;Happy Vimming!&lt;/p&gt;

</description>
      <category>neovim</category>
      <category>fennel</category>
      <category>lua</category>
      <category>vim</category>
    </item>
    <item>
      <title>Criando um ambiente de desenvolvimento com Nix</title>
      <dc:creator>Douglas Massolari</dc:creator>
      <pubDate>Sat, 09 Jul 2022 06:50:15 +0000</pubDate>
      <link>https://dev.to/dmass/criando-um-ambiente-de-desenvolvimento-com-nix-2l1k</link>
      <guid>https://dev.to/dmass/criando-um-ambiente-de-desenvolvimento-com-nix-2l1k</guid>
      <description>&lt;h2&gt;
  
  
  O que é nix?
&lt;/h2&gt;

&lt;p&gt;Se você não sabe o que é Nix, eu escrevi um &lt;a href="https://dev.to/dmass/o-que-e-nix-e-como-utiliza-lo-como-seu-gerenciador-de-pacotes-2dcb"&gt;artigo sobre como usá-lo como um gerenciador de pacotes&lt;/a&gt; onde eu falo sobre o que é Nix.&lt;/p&gt;

&lt;p&gt;Para continuar a leitura desse artigo, eu recomendo que você leia o outro, pois vamos utilizar alguns conceitos explicados lá.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparação
&lt;/h2&gt;

&lt;p&gt;Nesse artigo, vamos usar o &lt;em&gt;flakes&lt;/em&gt;, assim como no artigo passado.&lt;/p&gt;

&lt;p&gt;Se você usa o Nix como seu gerenciador de pacotes, da forma que expliquei no outro artigo, você pode pular para a próxima seção.&lt;/p&gt;

&lt;p&gt;Caso contrário, você precisa habilitar o uso do &lt;em&gt;flakes&lt;/em&gt; pelo Nix. Para isso, basta criar o arquivo &lt;code&gt;~/.config/nix/nix.conf&lt;/code&gt; com o conteúdo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;experimental-features = nix-command flakes&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Isso diz ao Nix para habilitar o &lt;em&gt;flakes&lt;/em&gt; sem precisar passar uma &lt;em&gt;flag&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Agora, vamos em frente!&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é um ambiente de desenvolvimento?
&lt;/h2&gt;

&lt;p&gt;Um ambiente de desenvolvimento é um "ambiente" onde todas as ferramentas necessárias para desenvolver um projeto estão disponíveis.&lt;/p&gt;

&lt;p&gt;Com o Nix, conseguimos utilizar pacotes sem instalá-los no nosso sistema, através de um arquivo declarativo.&lt;/p&gt;

&lt;p&gt;Ou seja, conseguimos criar um arquivo com todos os pacotes que queremos e o Nix se encarrega de disponibilizá-los temporariamente para nós.&lt;/p&gt;

&lt;p&gt;Isso é ótimo, pois, além de não precisarmos instalar ferramentas na nossa máquina para projetos específicos, se subirmos esse arquivo para o repositório do projeto, toda a equipe pode ter o mesmo ambiente sem precisar instalar nada (além do Nix, é claro)!&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando seu ambiente
&lt;/h2&gt;

&lt;p&gt;O que vamos fazer para criar um ambiente é, na verdade, bem parecido com o que você viu no outro artigo.&lt;/p&gt;

&lt;p&gt;Vamos supor que eu quero fazer uns exercícios de Rust no &lt;a href="https://exercism.org/" rel="noopener noreferrer"&gt;Exercism&lt;/a&gt;, mas não quero instalar nada de Rust na minha máquina, nem quero instalar o exercism.&lt;/p&gt;

&lt;p&gt;Vou começar criando uma pasta &lt;code&gt;Exercism&lt;/code&gt; na minha pasta &lt;em&gt;HOME&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;Exercism
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro dessa pasta, vou criar um arquivo &lt;code&gt;flake.nix&lt;/code&gt; com o conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Ambiente para exercícios de Rust"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nv"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github:nixos/nixpkgs/nixpkgs-unstable"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;flake-utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github:numtide/flake-utils"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nv"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;flake-utils&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="nv"&gt;flake-utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;eachDefaultSystem&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="kd"&gt;let&lt;/span&gt;
        &lt;span class="nv"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nv"&gt;nixpkgs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kn"&gt;inherit&lt;/span&gt; &lt;span class="nv"&gt;system&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="kn"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;devShell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kn"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;mkShell&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nv"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="nv"&gt;exercism&lt;/span&gt;
            &lt;span class="nv"&gt;cargo&lt;/span&gt;
            &lt;span class="nv"&gt;libiconv&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;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;Começamos definindo o campo &lt;code&gt;description&lt;/code&gt; com uma descrição do que se trata esse arquivo.&lt;/p&gt;

&lt;p&gt;Depois definimos nossas dependências no campo &lt;code&gt;inputs&lt;/code&gt;, que são:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O repositório do &lt;em&gt;nixpkgs&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Um utilitário chamado &lt;em&gt;flake-utils&lt;/em&gt;, que vamos utilizar para criar um ambiente que suporte várias plataformas&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No &lt;code&gt;outputs&lt;/code&gt; chamamos a função &lt;code&gt;eachDefaultSystem&lt;/code&gt; do &lt;em&gt;flake-utils&lt;/em&gt;. Essa função recebe um &lt;em&gt;callback&lt;/em&gt; onde recebemos o &lt;code&gt;system&lt;/code&gt;. O que essa função faz é chamar esse &lt;em&gt;callback&lt;/em&gt; para todas as plataformas que o Nix suporta (Linux, Mac e Windows) passando o &lt;code&gt;system&lt;/code&gt; desta plataforma.&lt;/p&gt;

&lt;p&gt;Nós definimos a variável &lt;code&gt;pkgs&lt;/code&gt; com o valor resultante do &lt;code&gt;nixpkgs&lt;/code&gt; configurado com o &lt;code&gt;system&lt;/code&gt; que recebemos. Assim, os pacotes instalados serão da plataforma correta.&lt;/p&gt;

&lt;p&gt;Por fim, definimos o campo &lt;code&gt;devShell&lt;/code&gt;, que se refere ao &lt;em&gt;shell&lt;/em&gt; que vamos criar, o valor vai ser o retorno da função &lt;code&gt;mkShell&lt;/code&gt;. Nós passamos para essa função um &lt;code&gt;set&lt;/code&gt; com um único campo &lt;code&gt;packages&lt;/code&gt;, que é a lista de pacotes que queremos disponíveis no nosso &lt;em&gt;shell&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;No nosso caso, vamos precisar de 3 pacotes, o &lt;code&gt;exercism&lt;/code&gt; que vai servir para baixar os exercícios e enviar o resultado, o &lt;code&gt;cargo&lt;/code&gt; para rodar os testes em &lt;em&gt;Rust&lt;/em&gt; e o &lt;code&gt;libiconv&lt;/code&gt; que é necessário para o &lt;code&gt;cargo&lt;/code&gt; rodar.&lt;/p&gt;

&lt;p&gt;Agora, vamos rodar o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nix develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E é aqui que a mágica acontece!&lt;/p&gt;

&lt;p&gt;O Nix vai baixar os pacotes e torná-los disponíveis para a gente em um &lt;em&gt;shell&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exercism version
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; exercism version 3.0.13

cargo &lt;span class="nt"&gt;-V&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; cargo 1.61.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso significa que eu posso baixar um exercício executando, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exercism download &lt;span class="nt"&gt;--exercise&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;reverse-string &lt;span class="nt"&gt;--track&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;rust
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E ele vai criar a pasta &lt;code&gt;rust/reverse-string&lt;/code&gt; dentro da pasta &lt;code&gt;Exercism&lt;/code&gt; que estamos.&lt;/p&gt;

&lt;p&gt;Eu posso ir até essa pasta e rodar os testes usando o &lt;code&gt;cargo&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;rust/reverse-string
cargo &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando eu terminar, é só eu sair do &lt;em&gt;shell&lt;/em&gt; com &lt;code&gt;exit&lt;/code&gt; e os pacotes que estavam disponíveis não estão mais.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exercism version             
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; zsh: &lt;span class="nb"&gt;command &lt;/span&gt;not found: exercism

cargo &lt;span class="nt"&gt;-V&lt;/span&gt;   
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; zsh: &lt;span class="nb"&gt;command &lt;/span&gt;not found: cargo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sistema limpo! ✨&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Esse foi um exemplo bem bobo, mas deu para ter um gosto do que é capaz de fazer.&lt;/p&gt;

&lt;p&gt;Você pode colocar qualquer ferramenta, como formatadores de código, &lt;em&gt;language-servers&lt;/em&gt; etc.&lt;/p&gt;

&lt;p&gt;No final, você vai ter o seu arquivo &lt;code&gt;flake.nix&lt;/code&gt; e outro arquivo, criado pelo Nix, chamado &lt;code&gt;flake.lock&lt;/code&gt;, esse último contém a versão de todos os pacotes baixados, assim, sempre que você ou uma pessoa da sua equipe rodar o &lt;code&gt;nix develop&lt;/code&gt;, o ambiente vai ser o mesmo até na versão dos pacotes utilizados.&lt;/p&gt;

&lt;p&gt;Espero que esse artigo tenha sido útil!&lt;/p&gt;

&lt;p&gt;Boa sorte criando seus ambientes!&lt;/p&gt;

&lt;p&gt;Até a próxima! 👋&lt;/p&gt;

</description>
      <category>nix</category>
      <category>flakes</category>
      <category>environment</category>
      <category>portuguese</category>
    </item>
    <item>
      <title>O que é Nix e como utilizá-lo como seu gerenciador de pacotes</title>
      <dc:creator>Douglas Massolari</dc:creator>
      <pubDate>Sat, 18 Jun 2022 00:20:31 +0000</pubDate>
      <link>https://dev.to/dmass/o-que-e-nix-e-como-utiliza-lo-como-seu-gerenciador-de-pacotes-2dcb</link>
      <guid>https://dev.to/dmass/o-que-e-nix-e-como-utiliza-lo-como-seu-gerenciador-de-pacotes-2dcb</guid>
      <description>&lt;p&gt;Quando eu comecei a trabalhar na &lt;a href="//tweag.io"&gt;Tweag&lt;/a&gt;, eu conheci uma ferramenta chamada Nix.&lt;br&gt;
Na &lt;em&gt;Tweag&lt;/em&gt; praticamente todo mundo ama e usa Nix e eu me senti encorajado a aprender mais sobre ele.&lt;br&gt;
Então, depois de ler, estudar e de receber uma grande ajuda do pessoal do trabalho, eu comecei a usar Nix como meu gerenciador de pacotes e configurações e estou gostando bastante.&lt;/p&gt;

&lt;p&gt;Antes de mais nada, vamos partir do princípio...&lt;/p&gt;
&lt;h2&gt;
  
  
  O que é Nix?
&lt;/h2&gt;

&lt;p&gt;Diretamente do &lt;a href="https://nixos.org/" rel="noopener noreferrer"&gt;site oficial&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Nix&lt;/em&gt; is a tool that takes a unique approach to package management and system configuration. Learn how to make reproducible, declarative and reliable systems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Traduzindo de forma livre&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Nix&lt;/em&gt; é uma ferramenta que possui uma forma única de gerenciamento de pacotes e configuração de sistema. Aprenda como criar sistemas reprodutíveis, declarativos e confiáveis.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso não nos diz muita coisa, que "forma única" é essa? Vamos falar sobre os 3 pontos descritos acima: configuração declarativa, reprodutiva e confiável&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuração declarativa
&lt;/h3&gt;

&lt;p&gt;Em &lt;em&gt;Nix&lt;/em&gt; não instalamos pacotes como em gerenciadores de pacotes tradicionais, isto é, executando um comando como &lt;code&gt;apt install&lt;/code&gt; ou &lt;code&gt;brew install&lt;/code&gt;. Até podemos fazer isso, mas não é a proposta, pois isso é um comando &lt;strong&gt;imperativo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A proposta do &lt;em&gt;Nix&lt;/em&gt; é configurar de forma &lt;strong&gt;declarativa&lt;/strong&gt; e nós fazemos isso através de um arquivo de configuração aonde listamos todos pacotes e configurações, ou seja, nós &lt;strong&gt;declaramos&lt;/strong&gt; quais pacotes queremos instalar e como configura-los.&lt;/p&gt;

&lt;p&gt;Por exemplo, em vez de &lt;code&gt;sudo apt install git wget yarn&lt;/code&gt;, eu tenho, em meu arquivo de configuração, as linhas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="nv"&gt;home&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kn"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nv"&gt;wget&lt;/span&gt;
    &lt;span class="nv"&gt;yarn&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nv"&gt;programs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;enable&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="nv"&gt;userName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Douglas M."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;userEmail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"douglasmassolari@hotmail.com"&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;Repare que, além de listar os pacotes que quero instalar,  posso configurar, diretamente, o git, através do Nix. Essas configurações serão, automaticamente, aplicadas por ele no arquivo de configuração do git.&lt;/p&gt;

&lt;p&gt;Isso, obviamente, não se limita ao git, sendo possível configurar diversas aplicações como zsh, gh, kitty etc.&lt;br&gt;
Outro ponto interessante é que, olhando o arquivo de configuração, fica bem claro quais os pacotes eu instalei, diferentemente de eu fazer um &lt;code&gt;apt list&lt;/code&gt;, onde ele lista tudo o que eu instalei &lt;strong&gt;E&lt;/strong&gt; as dependências instaladas.&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuração reprodutível
&lt;/h3&gt;

&lt;p&gt;Como temos esse arquivo de configuração, no qual declaramos os pacotes e temos a configuração dos mesmos, é fácil reproduzir um ambiente.&lt;/p&gt;

&lt;p&gt;E é ainda mais fácil quando usamos o &lt;a href="https://nixos.wiki/wiki/Flakes" rel="noopener noreferrer"&gt;&lt;strong&gt;flakes&lt;/strong&gt;&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Flakes permite que, além dos pacotes do repositório oficial do Nix, nós possamos declarar pacotes diretamente do GitHub, além disso, ele cria um arquivo &lt;code&gt;flake.lock&lt;/code&gt; que contém a versão exata do pacote. Assim você consegue reproduzir de forma mais fiel uma configuração.&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuração confiável
&lt;/h3&gt;

&lt;p&gt;Umas das funcionalidades mais interessantes do &lt;em&gt;Nix&lt;/em&gt; são as &lt;em&gt;generations&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para aplicar as suas configurações, você manda o &lt;em&gt;Nix&lt;/em&gt; fazer o &lt;em&gt;build&lt;/em&gt; do arquivo. Ele vai ler o seu arquivo, gerar os binários dos pacotes e o resultado disso é uma &lt;em&gt;generation&lt;/em&gt;, cada vez que você faz um &lt;em&gt;build&lt;/em&gt;  que difere do anterior, uma nova &lt;em&gt;generation&lt;/em&gt; é criada. Sendo que ele não apaga a anterior automaticamente, o que torna possível que você consiga aplicar uma &lt;em&gt;generation&lt;/em&gt; criada anteriormente!&lt;/p&gt;

&lt;p&gt;Isso é muito útil porque, caso você desconfigure alguma coisa, você pode simplesmente voltar para a última configuração funcional que você tinha.&lt;/p&gt;

&lt;p&gt;É útil também para testar qualquer coisa sem medo de quebrar alguma coisa.&lt;/p&gt;

&lt;p&gt;Um ponto interessante disso tudo é que ele só gera os binários e arquivos daquilo que está no seu arquivo de configuração, ou seja, nunca mais você vai ter "lixo" no seu sistema de coisas que você instalou e desinstalou.&lt;/p&gt;
&lt;h2&gt;
  
  
  Começando a utilizar o Nix
&lt;/h2&gt;

&lt;p&gt;Depois de tanta explicação, vamos colocar a mão na massa e começar a instalar e a utilizar o &lt;em&gt;Nix&lt;/em&gt; para gerenciar nossos pacotes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Instalação do Nix
&lt;/h3&gt;

&lt;p&gt;Primeiro, claro, precisamos instalar o Nix.&lt;/p&gt;

&lt;p&gt;Na &lt;a href="https://nixos.org/download.html" rel="noopener noreferrer"&gt;página oficial de instalação&lt;/a&gt; tem as instruções bem claras, basta segui-las e vai dar tudo certo 🤞🏻&lt;/p&gt;
&lt;h3&gt;
  
  
  Criação do arquivo &lt;code&gt;flake.nix&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Vamos começar a criar o arquivo que vai conter nossas configurações.&lt;/p&gt;

&lt;p&gt;Esse arquivo precisa estar em um repositório, então, se você ainda não tiver um repositório de &lt;strong&gt;dotfiles&lt;/strong&gt;, você pode criar com os comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;dotfiles
&lt;span class="nb"&gt;cd &lt;/span&gt;dotfiles
git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro dessa pasta, crie o arquivo &lt;code&gt;flake.nix&lt;/code&gt; com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github:nixos/nixpkgs/nixpkgs-unstable"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;home-manager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github:nix-community/home-manager/master"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;inputs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;follows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"nixpkgs"&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;span class="nv"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;nixpkgs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;home-manager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt;
      &lt;span class="nv"&gt;system&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"x86_64-linux"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;# Se usa Mac: "x86_64-darwin"&lt;/span&gt;
      &lt;span class="nv"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"USERNAME"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nv"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nv"&gt;nixpkgs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;inherit&lt;/span&gt; &lt;span class="nv"&gt;system&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;allowUnfree&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="p"&gt;};&lt;/span&gt;
    &lt;span class="kn"&gt;in&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;homeConfigurations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;home-manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;homeManagerConfiguration&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;inherit&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;modules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;home&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="nv"&gt;stateVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"22.11"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="kn"&gt;inherit&lt;/span&gt; &lt;span class="nv"&gt;username&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
              &lt;span class="nv"&gt;homeDirectory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/home/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;username&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;# Se usa Mac: "/Users/${username}"&lt;/span&gt;

              &lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;".config/nix/nix.conf"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;''&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;                experimental-features = nix-command flakes&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="s2"&gt;              ''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

              &lt;span class="c"&gt;# Se usa Mac, descomente o código abaixo&lt;/span&gt;
              &lt;span class="c"&gt;#&lt;/span&gt;
              &lt;span class="c"&gt;# Isso vai fazer com que os programas instalados&lt;/span&gt;
              &lt;span class="c"&gt;# apareçam no spotlight&lt;/span&gt;
              &lt;span class="c"&gt;#&lt;/span&gt;
              &lt;span class="c"&gt;# file."Applications/Home Manager Apps".source = let&lt;/span&gt;
              &lt;span class="c"&gt;#   apps = pkgs.buildEnv {&lt;/span&gt;
              &lt;span class="c"&gt;#     name = "home-manager-applications";&lt;/span&gt;
              &lt;span class="c"&gt;#     paths = config.home.packages;&lt;/span&gt;
              &lt;span class="c"&gt;#     pathsToLink = "/Applications";&lt;/span&gt;
              &lt;span class="c"&gt;#   };&lt;/span&gt;
              &lt;span class="c"&gt;# in "${apps}/Applications";&lt;/span&gt;

              &lt;span class="nv"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kn"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;pkgs&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;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="nv"&gt;programs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="nv"&gt;home-manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;enable&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="p"&gt;};&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;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;&lt;strong&gt;Nota: Onde está &lt;code&gt;USERNAME&lt;/code&gt; você precisa colocar o seu nome de usuário.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vamos falar um pouco sobre o conteúdo desse arquivo.&lt;br&gt;
Você precisa saber algumas coisas sobre ele:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A linguagem na qual ele é escrita se chama &lt;em&gt;Nix&lt;/em&gt;.&lt;br&gt;
Pois é, além de um gerenciador de pacotes e um sistema operacional (&lt;em&gt;NixOS&lt;/em&gt;), &lt;em&gt;Nix&lt;/em&gt; também é a linguagem que usamos em arquivos &lt;code&gt;nix&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Esse arquivo é um &lt;em&gt;flake&lt;/em&gt; (você pode ter percebido pelo nome).&lt;br&gt;
Mais acima, eu falei sobre flakes e deixei um &lt;em&gt;link&lt;/em&gt; para a página oficial onde você pode saber mais sobre ele.&lt;br&gt;
Resumidamente, ele facilita a maneira com que usamos o &lt;em&gt;Nix&lt;/em&gt; para fazer nossa configuração.&lt;br&gt;
Por causa dele é que temos &lt;code&gt;inputs&lt;/code&gt; e &lt;code&gt;outputs&lt;/code&gt; no arquivo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Esse arquivo é como um arquivo JSON, é composto de chaves e valores, porém, diferentemente do JSON, ele permite que usemos alguma lógica enquanto escrevemos.&lt;br&gt;
Podemos definir variáveis, usar &lt;code&gt;if&lt;/code&gt; e mais.&lt;br&gt;
&lt;a href="https://learnxinyminutes.com/docs/nix/" rel="noopener noreferrer"&gt;Aqui tem um pequeno tutorial&lt;/a&gt; sobre a linguagem Nix.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nos &lt;code&gt;inputs&lt;/code&gt; nós declaramos nossas dependências que, neste caso, são duas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O &lt;code&gt;nixpkgs&lt;/code&gt;, que é o repositório de pacotes do Nix, estamos usando a versão &lt;em&gt;unstable&lt;/em&gt;, mas você não precisa se preocupar com isso porque os pacotes lá são bem estáveis, apesar do nome.&lt;/li&gt;
&lt;li&gt;O home-manager, que é uma ferramenta que permite gerenciarmos os pacotes e configuração à nível de usuário, que é o nosso objetivo. Você pode ler mais sobre ele na &lt;a href="https://nixos.wiki/wiki/Home_Manager" rel="noopener noreferrer"&gt;wiki do NixOS&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nos &lt;code&gt;outputs&lt;/code&gt; nós dizemos o que queremos gerar.&lt;/p&gt;

&lt;p&gt;Vou explicar passo-a-passo o que estamos fazendo aqui, mas não vou explicar detalhes da linguagem, para isso que eu passei o &lt;em&gt;link&lt;/em&gt; do tutorial acima.&lt;/p&gt;

&lt;p&gt;A gente está passando uma função e, no corpo dela, começamos declarando 3 variáveis dentro do bloco &lt;code&gt;let/in&lt;/code&gt; e definimos um valor no campo &lt;code&gt;homeConfigurations.${username}&lt;/code&gt;.&lt;br&gt;
O valor para esse campo é o retorno da função &lt;code&gt;home-manager.lib.homeManagerConfiguration&lt;/code&gt;.&lt;br&gt;
Para essa função, nós passamos um &lt;em&gt;set&lt;/em&gt;.&lt;br&gt;
&lt;code&gt;inherit nome&lt;/code&gt; é a mesma coisa que &lt;code&gt;nome = nome&lt;/code&gt;.&lt;br&gt;
Em &lt;code&gt;modules&lt;/code&gt; nós definimos os módulos que queremos configurar, que é onde fica nossa configuração de fato, com os pacotes e a configuração de cada um.&lt;br&gt;
Nós definimos um módulo com duas chaves principais: &lt;code&gt;home&lt;/code&gt;, que são as configurações relacionadas à pasta &lt;em&gt;HOME&lt;/em&gt; e a lista de pacotes que queremos instalar, e &lt;code&gt;programs&lt;/code&gt; que é onde vamos &lt;strong&gt;habilitar&lt;/strong&gt; e configurar &lt;strong&gt;programas&lt;/strong&gt; que são suportados pelo home-manager. Veremos isso melhor mais adiante. &lt;br&gt;
Começamos habilitando o &lt;code&gt;home-manager&lt;/code&gt;, assim ele mesmo se gerencia. Com essa sintaxe &lt;code&gt;PROGRAMA.enable&lt;/code&gt; dentro de &lt;code&gt;programs&lt;/code&gt; podemos instalar e configurar vários pacotes.&lt;br&gt;
Usamos &lt;code&gt;file&lt;/code&gt; dentro de &lt;code&gt;home&lt;/code&gt; para criar um arquivo do &lt;em&gt;nix&lt;/em&gt; na nossa pasta &lt;em&gt;HOME&lt;/em&gt; com uma definição para habilitar o &lt;em&gt;flakes&lt;/em&gt; sempre, assim, não precisamos passar &lt;code&gt;--extra-experimental-features&lt;/code&gt; o tempo todo.&lt;br&gt;
Em &lt;code&gt;packages&lt;/code&gt; dentro de &lt;code&gt;home&lt;/code&gt; é onde vamos declarar os pacotes que queremos instalar, repare que iniciamos com &lt;code&gt;[]&lt;/code&gt;, que é uma lista vazia.&lt;/p&gt;
&lt;h3&gt;
  
  
  Instalando o home-manager
&lt;/h3&gt;

&lt;p&gt;O primeiro passo é adicionar o arquivo &lt;code&gt;flake.nix&lt;/code&gt; ao &lt;em&gt;staging&lt;/em&gt; do repositório git, basta executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add flake.nix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, vamos fazer o &lt;em&gt;build&lt;/em&gt; do nosso &lt;code&gt;flake.nix&lt;/code&gt; executando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nix &lt;span class="nt"&gt;--extra-experimental-features&lt;/span&gt; &lt;span class="s1"&gt;'nix-command flakes'&lt;/span&gt; build .#homeConfigurations.&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;.activationPackage 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando é grande, mas não é complexo.&lt;br&gt;
Na verdade, o comando é &lt;code&gt;nix build&lt;/code&gt;, mas temos que passar o argumento &lt;code&gt;--extra-experimental-features&lt;/code&gt; para habilitar o &lt;em&gt;flakes&lt;/em&gt; e o &lt;em&gt;nix-command&lt;/em&gt;, que são necessários dessa vez.&lt;br&gt;
O que vem depois é só a gente passando o que ele tem que fazer o &lt;code&gt;build&lt;/code&gt;, nesse caso, é o arquivo flake que existe na pasta atual, por isso &lt;code&gt;.&lt;/code&gt; e, dentro desse arquivo (&lt;code&gt;#&lt;/code&gt;) queremos executar a função &lt;code&gt;activationPackage&lt;/code&gt; que existe dentro do &lt;code&gt;homeConfigurations.$USER&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Não se preocupe porque só temos que executar esse comando uma vez.&lt;/p&gt;

&lt;p&gt;Quando ele terminar, vai existir uma pasta &lt;code&gt;result&lt;/code&gt; e, dentro dela, um binário chamado &lt;code&gt;activate&lt;/code&gt;.&lt;br&gt;
Vamos executá-lo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./result/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao terminar, você já deve ter o comando &lt;code&gt;home-manager&lt;/code&gt; disponível.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;home-manager &lt;span class="nt"&gt;--version&lt;/span&gt;
22.05
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A partir daqui, já conseguimos utilizar o &lt;em&gt;Nix&lt;/em&gt; com home-manager para instalar e configurar nossos pacotes 🎉&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalando e configurando pacotes
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Usando &lt;code&gt;programs&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Vamos começar com o &lt;code&gt;git&lt;/code&gt;, que é um programa comum que todos devemos ter.&lt;/p&gt;

&lt;p&gt;Adicione, dentro de &lt;code&gt;programs&lt;/code&gt;, as linhas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;enable&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="nv"&gt;userName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"NOME DE USUÁRIO"&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;Salve o arquivo e, no terminal, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;home-manager switch &lt;span class="nt"&gt;--flake&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse é o comando que você vai usar sempre que alterar sua configuração.&lt;/p&gt;

&lt;p&gt;Ele vai fazer o &lt;em&gt;build&lt;/em&gt; e criar uma &lt;em&gt;generation&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ao executar &lt;code&gt;which git&lt;/code&gt; você deve reparar que o caminho fica na pasta &lt;code&gt;.nix-profile/bin&lt;/code&gt;, o que significa que o &lt;code&gt;git&lt;/code&gt; foi instalado pelo nix.&lt;/p&gt;

&lt;p&gt;Ao executar &lt;code&gt;git config user.name&lt;/code&gt;, você deve receber como retorno o valor que você definiu em seu arquivo de configuração.&lt;/p&gt;

&lt;p&gt;Repare que não usamos a lista de pacotes &lt;code&gt;packages&lt;/code&gt; em &lt;code&gt;home&lt;/code&gt;, isso porque o home-manager possui a &lt;strong&gt;opção&lt;/strong&gt; &lt;code&gt;programs.git&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para saber quais opções do home-manager existem, como &lt;code&gt;programs.git&lt;/code&gt;, você pode olhar &lt;a href="https://rycee.gitlab.io/home-manager/options.html" rel="noopener noreferrer"&gt;na página de opções do home-manager&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na linguagem Nix, os dois códigos abaixo, para habilitar o &lt;code&gt;git&lt;/code&gt;, são equivalentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="nv"&gt;programs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;enable&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="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nv"&gt;programs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;enable&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na documentação de opções do home-manager, você vai ver as opções sendo descritas do segundo modo, mas você pode escrever do primeiro modo, ou até uma mistura do dois, como por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="nv"&gt;programs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;enable&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="nv"&gt;userName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"userName"&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nv"&gt;bat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;enable&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="nv"&gt;fzf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;enable&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Usando &lt;code&gt;home.packages&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Agora, vamos supor que você queira instalar o &lt;code&gt;wget&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O home-manager não possui essa &lt;strong&gt;opção&lt;/strong&gt;, então não vamos usar o &lt;code&gt;programs&lt;/code&gt;, em vez disso, vamos procurar por esse pacote no &lt;strong&gt;nixpkgs&lt;/strong&gt; que é o repositório de pacotes do Nix.&lt;/p&gt;

&lt;p&gt;Para procurar por um pacote, você pode usar o comando &lt;code&gt;nix search nixpkgs PACOTE&lt;/code&gt; ou ir na &lt;a href="https://search.nixos.org/packages" rel="noopener noreferrer"&gt;página de pesquisa do nix&lt;/a&gt; e digitar o nome do pacote que deseja instalar.&lt;/p&gt;

&lt;p&gt;Se buscarmos &lt;code&gt;wget&lt;/code&gt; na página de pesquisa, encontramos o que queremos como primeiro resultado, isso significa que o pacote está no nixpkgs, então basta o colocarmos na em &lt;code&gt;home.packages&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nix"&gt;&lt;code&gt;&lt;span class="nv"&gt;home&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;# ...&lt;/span&gt;
  &lt;span class="nv"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kn"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nv"&gt;wget&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;Basta executarmos o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;home-manager switch &lt;span class="nt"&gt;--flake&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E, depois que o Nix terminar de fazer o &lt;em&gt;build&lt;/em&gt;, o &lt;code&gt;wget&lt;/code&gt; já vai estar instalado!&lt;/p&gt;

&lt;h3&gt;
  
  
  Generations
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Listar
&lt;/h3&gt;

&lt;p&gt;Cada vez que você faz o &lt;em&gt;build&lt;/em&gt;, você vai ver o número da &lt;em&gt;generation&lt;/em&gt; criada.&lt;br&gt;
Para listar as &lt;em&gt;generations&lt;/em&gt; você pode fazer&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;home-manager generations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele vai te mostrar as &lt;em&gt;generations&lt;/em&gt; existentes em ordem decrescente com o caminho para cada uma.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rollback
&lt;/h3&gt;

&lt;p&gt;Para fazer um &lt;em&gt;rollback&lt;/em&gt;, ou seja, retornar para uma &lt;em&gt;generation&lt;/em&gt; anterior, basta copiar o caminho dela e executar o arquivo &lt;code&gt;activate&lt;/code&gt; que existe dentro da pasta dela.&lt;br&gt;
Por exemplo, ao listar minhas &lt;em&gt;generations&lt;/em&gt; eu vejo que tenho:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;home-manager generations
2022-06-17 21:06 : &lt;span class="nb"&gt;id &lt;/span&gt;56 -&amp;gt; /nix/store/g5qzmkcwbxx786x8lb9xff776gffngyg-home-manager-generation
2022-06-17 21:05 : &lt;span class="nb"&gt;id &lt;/span&gt;55 -&amp;gt; /nix/store/hb4p96vhkdvwirdsrjh5zi7cljd5d6mk-home-manager-generation
2022-06-15 13:02 : &lt;span class="nb"&gt;id &lt;/span&gt;54 -&amp;gt; /nix/store/g5qzmkcwbxx786x8lb9xff776gffngyg-home-manager-generation
2022-06-08 12:46 : &lt;span class="nb"&gt;id &lt;/span&gt;53 -&amp;gt; /nix/store/hb4p96vhkdvwirdsrjh5zi7cljd5d6mk-home-manager-generation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se eu quero voltar para a 54, eu copio o caminho dela &lt;code&gt;/nix/store/g5qzmkcwbxx786x8lb9xff776gffngyg-home-manager-generation&lt;/code&gt; e executo o arquivo &lt;code&gt;activate&lt;/code&gt; dela:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;/nix/store/g5qzmkcwbxx786x8lb9xff776gffngyg-home-manager-generation/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apagar
&lt;/h3&gt;

&lt;p&gt;Como não existe almoço grátis, as &lt;em&gt;generations&lt;/em&gt; ocupam espaço em disco, então você vai querer ir deletando as mais antigas.&lt;/p&gt;

&lt;p&gt;Você pode usar o comando &lt;code&gt;home-manager remove-generations&lt;/code&gt; para remover uma &lt;em&gt;generation&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para remover uma série delas, você pode usar &lt;code&gt;{N..M}&lt;/code&gt;.&lt;br&gt;
Por exemplo, se eu quero remover todas as minhas &lt;em&gt;generations&lt;/em&gt; da 1 até a 54 eu posso fazer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;home-manager remove-generations &lt;span class="o"&gt;{&lt;/span&gt;1..54&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Dicas finais
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Makefile
&lt;/h3&gt;

&lt;p&gt;Para não ter que escrever sempre &lt;code&gt;home-manager switch --flake .&lt;/code&gt;, você pode criar um arquivo &lt;code&gt;Makefile&lt;/code&gt; com o conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    home-manager switch &lt;span class="nt"&gt;--flake&lt;/span&gt; .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim você só precisa executar &lt;code&gt;make&lt;/code&gt; e ele vai executar o comando do &lt;code&gt;home-manager&lt;/code&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  Meu repositório
&lt;/h3&gt;

&lt;p&gt;Eu ainda não tenho muita coisa configurada, mas, se quiser dar uma olhada nas minhas configurações, é só ir &lt;a href="https://github.com/Massolari/dotfiles" rel="noopener noreferrer"&gt;ao meu repositório de dotfiles&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que o &lt;em&gt;Nix&lt;/em&gt; seja útil para você! Vou ficando por aqui!&lt;/p&gt;

</description>
      <category>nix</category>
      <category>flakes</category>
      <category>homemanager</category>
    </item>
    <item>
      <title>Configurando Neovim com Fennel</title>
      <dc:creator>Douglas Massolari</dc:creator>
      <pubDate>Fri, 20 May 2022 19:26:38 +0000</pubDate>
      <link>https://dev.to/dmass/configurando-neovim-com-fennel-489o</link>
      <guid>https://dev.to/dmass/configurando-neovim-com-fennel-489o</guid>
      <description>&lt;h2&gt;
  
  
  Tudo começa na Lua
&lt;/h2&gt;

&lt;p&gt;Uma das funcionalidades mais aguardadas e amadas pelos usuários do Neovim é o suporte à &lt;a href="https://www.lua.org/" rel="noopener noreferrer"&gt;lua&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Esse suporte veio, oficialmente, na versão 0.5 do Neovim, o que passou a permitir que os usuários pudessem &lt;del&gt;jogar no lixo&lt;/del&gt; deixar de usar seus &lt;code&gt;init.vim&lt;/code&gt; e configurar o Neovim usando um belo &lt;code&gt;init.lua&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;E uma feliz consequência disso é que, não só podemos usar lua, mas podemos usar &lt;a href="https://luarocks.org/" rel="noopener noreferrer"&gt;pacotes do ecossistema lua&lt;/a&gt; e &lt;strong&gt;linguagens que compilam&lt;br&gt;
para lua&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Hello, &lt;del&gt;Peter&lt;/del&gt; Fennel
&lt;/h2&gt;

&lt;p&gt;Fennel é uma dessas linguagens que compilam para lua, o que significa que você vai escrever código fennel, o compilador vai gerar código lua, que vai ser lido e executado pelo Neovim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fennel -&amp;gt; Lua -&amp;gt; Neovim
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Mas, por que Fennel?
&lt;/h3&gt;

&lt;p&gt;Essa é uma pergunta bastante comum que as pessoas fazem quando eu digo que uso Fennel.&lt;/p&gt;

&lt;p&gt;Na verdade, é uma pergunta comum que as pessoas fazem para todos que usam Fennel, pelo que parece, porque no site oficial do Fennel &lt;a href="https://fennel-lang.org/rationale" rel="noopener noreferrer"&gt;tem a resposta para, exatamente, essa pergunta&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Vou resumir a resposta deles em alguns pontos.&lt;/p&gt;
&lt;h4&gt;
  
  
  Fennel é menos propenso à alguns erros
&lt;/h4&gt;

&lt;p&gt;Lua é uma ótima linguagem, porém existem alguns pontos que podem facilitar a ocorrência de erros.&lt;/p&gt;

&lt;p&gt;Um dos pontos é a facilidade com que você acessa ou altera uma variável global.&lt;br&gt;
Se você criar uma variável sem a palavra chave &lt;code&gt;local&lt;/code&gt; ela já é uma variável global. E para acessar o valor dessa variável, basta digitar o nome da variável, o que pode causar comportamentos inesperados, por exemplo:&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;-- settings.lua&lt;/span&gt;
&lt;span class="n"&gt;myVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'this is global'&lt;/span&gt;


&lt;span class="c1"&gt;-- init.lua&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;myVal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'local'&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'this is the value of local: '&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;myVar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Repare que, por um erro de digitação da palavra &lt;code&gt;myVal&lt;/code&gt;, trocando o &lt;code&gt;l&lt;/code&gt; pelo &lt;code&gt;r&lt;/code&gt; acabamos acessando o valor de uma variável global definida em outro lugar.&lt;br&gt;
Erros como esse podem ser difíceis de descobrir.&lt;/p&gt;

&lt;p&gt;Fennel previne erros como esse permitindo que o acesso à variáveis globais sejam feitos apenas através da tabela &lt;code&gt;_G&lt;/code&gt;.&lt;br&gt;
Ao tentar simular o caso acima em Fennel, o compilador nos alertará que a variável &lt;code&gt;myVar&lt;/code&gt; não existe.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(local myVal "local")
(print (.. "This is the value of local: " myVar))

:: COMPILE ERROR
  xxx settings/globals.fnl
      Compile error in settings/globals.fnl:42
        unknown identifier in strict mode: myVar

      * Try looking to see if there's a typo.
      * Try using the _G table instead, eg. _G.myVar if you really want a global.
      * Try moving this code to somewhere that myVar is in scope.
      * Try binding myVar as a local in the scope of this code.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Outro ponto, que pode facilitar a ocorrência de erros em lua, é a falta de validação do número de argumentos de uma função.&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="kd"&gt;local&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;myAnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="k"&gt;end&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;myAnd&lt;/span&gt;&lt;span class="p"&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;-- nil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Repare que eu apenas passei 1 argumento, sendo que a função trabalha com 2 parâmetros, o código em lua rodou sem me avisar que esqueci de passar outro argumento para a função.&lt;/p&gt;

&lt;p&gt;Em Fennel, podemos usar a palavra chave &lt;code&gt;lambda&lt;/code&gt; para criar funções que validam os parâmetros:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(lambda my-and [x y]
  (and x y))

(print (my-and true)) ; Error [...] Missing argument y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Nota: Em fennel, &lt;code&gt;;&lt;/code&gt; é o caractere usado para iniciar um comentário&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  (Sintaxe (do (Lisp!)))
&lt;/h4&gt;

&lt;p&gt;Esse é um ponto um pouco polêmico porque algumas pessoas não gostam da sintaxe do Lisp, mas ela traz alguns benefícios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tudo é uma expressão, ou seja, não temos &lt;em&gt;statements&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Quando lidamos com operadores, não há ambiguidade do que vem primeiro, não temos "precedência de operadores". (Em lua, por exemplo, &lt;code&gt;A or B and C or D&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses pontos tornam Fennel uma linguagem muito simples de se programar e de se dar manutenção.&lt;/p&gt;
&lt;h4&gt;
  
  
  Modernidade e facilidades
&lt;/h4&gt;

&lt;p&gt;Além dos pontos mencionados acima, vale a pena ressaltar algumas funcionalidades interessantes que o Fennel traz para facilitar a nossa vida.&lt;/p&gt;

&lt;p&gt;Com Fennel, temos &lt;em&gt;desestruturação&lt;/em&gt;, &lt;em&gt;pattern matching&lt;/em&gt;, &lt;em&gt;macros&lt;/em&gt; e mais.&lt;/p&gt;
&lt;h5&gt;
  
  
  Desestruturação
&lt;/h5&gt;

&lt;p&gt;Enquanto em lua fazemos:&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;-- Lua&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="s1"&gt;'module'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;var&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="nb"&gt;require&lt;/span&gt;&lt;span class="s1"&gt;'module'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;var2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Em fennel, podemos, simplesmente, fazer:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Fennel
(local {: var : var2} (require :module))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h5&gt;
  
  
  Pattern matching
&lt;/h5&gt;

&lt;p&gt;Quando queremos testar o valor de uma variável várias vezes, em lua, fazemos uma sequência de &lt;code&gt;if&lt;/code&gt;:&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;-- Lua&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get_desc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"k1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"Key 1"&lt;/span&gt;
  &lt;span class="k"&gt;elseif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"k2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"Key 2"&lt;/span&gt;
  &lt;span class="k"&gt;elseif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"k3"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"Key 3"&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Enquanto, em fennel, podemos usar o &lt;code&gt;match&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Fennel
(lambda get-desc [key]
  (match key
    :k1 "Key 1"
    :k2 "Key 2"
    :k3 "Key 3"))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Como começar a usar
&lt;/h3&gt;

&lt;p&gt;Agora que eu te convenci (pelo menos espero) a usar fennel, vamos ver como começar a usa-lo para configurar o Neovim!&lt;/p&gt;

&lt;p&gt;Vamos usar dois plugins para isso:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;tangerine &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/udayvir-singh" rel="noopener noreferrer"&gt;
        udayvir-singh
      &lt;/a&gt; / &lt;a href="https://github.com/udayvir-singh/tangerine.nvim" rel="noopener noreferrer"&gt;
        tangerine.nvim
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🍊 Sweet Fennel integration for Neovim
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🍊 Tangerine 🍊&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/03cad28e9e2c4a6b5f5324da75c8c2719d4319469ac5db12b53f25fff34ab839/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e656f76696d2d302e352d3537413134333f7374796c653d666c61742d737175617265266c6f676f3d6e656f76696d"&gt;&lt;img src="https://camo.githubusercontent.com/03cad28e9e2c4a6b5f5324da75c8c2719d4319469ac5db12b53f25fff34ab839/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e656f76696d2d302e352d3537413134333f7374796c653d666c61742d737175617265266c6f676f3d6e656f76696d" alt="Neovim version"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c00d75ac3a0fed67574f85e93d867363f578596d8707a3c5c1246f3df6c38693/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e656f76696d253230496e253230456d6163732d302e352d6461633f7374796c653d666c61742d737175617265266c6f676f3d676e75656d616373266c6f676f436f6c6f723d646166"&gt;&lt;img src="https://camo.githubusercontent.com/c00d75ac3a0fed67574f85e93d867363f578596d8707a3c5c1246f3df6c38693/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e656f76696d253230496e253230456d6163732d302e352d6461633f7374796c653d666c61742d737175617265266c6f676f3d676e75656d616373266c6f676f436f6c6f723d646166" alt="GNU Neovim in Emacs version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/udayvir-singh/tangerine.nvim#about" rel="noopener noreferrer"&gt;About&lt;/a&gt; • &lt;a href="https://github.com/udayvir-singh/tangerine.nvim#installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt; • &lt;a href="https://github.com/udayvir-singh/tangerine.nvim#setup" rel="noopener noreferrer"&gt;Setup&lt;/a&gt; • &lt;a href="https://github.com/udayvir-singh/tangerine.nvim#commands" rel="noopener noreferrer"&gt;Commands&lt;/a&gt; • &lt;a href="https://github.com/udayvir-singh/tangerine.nvim#api" rel="noopener noreferrer"&gt;API&lt;/a&gt; • &lt;a href="https://github.com/udayvir-singh/tangerine.nvim#development" rel="noopener noreferrer"&gt;Development&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/97400310/326354536-10082888-b01e-4dbe-b105-4aa74391bb52.svg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDE5NzQ1NTEsIm5iZiI6MTc0MTk3NDI1MSwicGF0aCI6Ii85NzQwMDMxMC8zMjYzNTQ1MzYtMTAwODI4ODgtYjAxZS00ZGJlLWIxMDUtNGFhNzQzOTFiYjUyLnN2Zz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAzMTQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMzE0VDE3NDQxMVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTcwNTY1YjE2YWFiYjRlMTdiODVjNjM5MWYzMmJlZmE5NzE1MjM3ZjRkNWZlMzE4MjkyNTM5ZWI0N2M3ZWEzOTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.reNbyfcfgMa39-QzqP7Lj9mxi3LdOEeiYnbAbfMjigA"&gt;&lt;img width="700" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F97400310%2F326354536-10082888-b01e-4dbe-b105-4aa74391bb52.svg%3Fjwt%3DeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDE5NzQ1NTEsIm5iZiI6MTc0MTk3NDI1MSwicGF0aCI6Ii85NzQwMDMxMC8zMjYzNTQ1MzYtMTAwODI4ODgtYjAxZS00ZGJlLWIxMDUtNGFhNzQzOTFiYjUyLnN2Zz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAzMTQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMzE0VDE3NDQxMVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTcwNTY1YjE2YWFiYjRlMTdiODVjNjM5MWYzMmJlZmE5NzE1MjM3ZjRkNWZlMzE4MjkyNTM5ZWI0N2M3ZWEzOTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.reNbyfcfgMa39-QzqP7Lj9mxi3LdOEeiYnbAbfMjigA"&gt;&lt;/a&gt;
&lt;/p&gt;


&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;About&lt;/h1&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Tangerine provides a painless way to add fennel to your config.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;🔥   &lt;em&gt;BLAZING&lt;/em&gt; fast, compile times in milliseconds&lt;/li&gt;
&lt;li&gt;🌊  100% support for interactive evaluation&lt;/li&gt;
&lt;li&gt;🎍 Control over when and how to compile&lt;/li&gt;
&lt;li&gt;🎀 Natively loads &lt;code&gt;nvim/init.fnl&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Comparison to other plugins&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;b&gt;HOTPOT 🍲&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Abstracts too much away from the user.&lt;/li&gt;
&lt;li&gt;Hooks onto lua package searchers to compile [harder to debug].&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;ANISEED 🌿&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excessively feature rich for use in dotfiles.&lt;/li&gt;
&lt;li&gt;Blindly compiles all files that it founds, resulting in slow load times.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Installation&lt;/h1&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Create file &lt;code&gt;plugin/0-tangerine.lua&lt;/code&gt; to bootstrap tangerine:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="markdown-alert markdown-alert-important"&gt;
&lt;p class="markdown-alert-title"&gt;Important&lt;/p&gt;
&lt;p&gt;If you are using &lt;a href="https://github.com/folke/lazy.nvim" rel="noopener noreferrer"&gt;lazy.nvim&lt;/a&gt; then you should create &lt;code&gt;init.lua&lt;/code&gt; instead of &lt;code&gt;plugin/0-tangerine.lua&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href="https://github.com/udayvir-singh/tangerine.nvim/issues/20" rel="noopener noreferrer"&gt;#20&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="highlight highlight-source-lua notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;--&lt;/span&gt; ~/.config/nvim/plugin/0-tangerine.lua or ~/.config/nvim/init.lua&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;--&lt;/span&gt; pick your plugin manager&lt;/span&gt;
&lt;span class="pl-k"&gt;local&lt;/span&gt; &lt;span class="pl-smi"&gt;pack&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;tangerine&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;packer&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;paq&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;lazy&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/udayvir-singh/tangerine.nvim" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;hibiscus &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
&lt;br&gt;
  &lt;div class="readme-overview"&gt;
&lt;br&gt;
    &lt;h2&gt;
&lt;br&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;&lt;br&gt;
      &lt;a href="https://github.com/udayvir-singh" rel="noopener noreferrer"&gt;&lt;br&gt;
        udayvir-singh&lt;br&gt;
      &lt;/a&gt; / &lt;a href="https://github.com/udayvir-singh/hibiscus.nvim" rel="noopener noreferrer"&gt;&lt;br&gt;
        hibiscus.nvim&lt;br&gt;
      &lt;/a&gt;&lt;br&gt;
    &lt;/h2&gt;
&lt;br&gt;
    &lt;h3&gt;
&lt;br&gt;
      🌺 Flavored Fennel Macros for Neovim&lt;br&gt;
    &lt;/h3&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="ltag-github-body"&gt;
&lt;br&gt;
    

&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Hibiscus.nvim&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;🌺 Highly opinionated macros to elegantly write your neovim config.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Companion library for &lt;a href="https://github.com/udayvir-singh/tangerine.nvim" rel="noopener noreferrer"&gt;tangerine&lt;/a&gt;
but it can also be used standalone.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9e2e7d966221aedc8f0d577c53aa41ba612f9c7d547ce741564961e36a7c00fb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466f725f4e656f76696d2d302e382d6461623f7374796c653d666f722d7468652d6261646765266c6f676f3d6e656f76696d266c6f676f436f6c6f723d646162"&gt;&lt;img src="https://camo.githubusercontent.com/9e2e7d966221aedc8f0d577c53aa41ba612f9c7d547ce741564961e36a7c00fb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466f725f4e656f76696d2d302e382d6461623f7374796c653d666f722d7468652d6261646765266c6f676f3d6e656f76696d266c6f676f436f6c6f723d646162" alt="Neovim version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Rational&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🍬         Syntactic eye candy over hellscape of lua api&lt;/li&gt;
&lt;li&gt;🎋 Provides missing features in both fennel and nvim api&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Installation&lt;/h1&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Create file &lt;code&gt;plugin/0-tangerine.lua&lt;/code&gt; to bootstrap hibiscus:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: if you are using &lt;a href="https://github.com/folke/lazy.nvim" rel="noopener noreferrer"&gt;lazy&lt;/a&gt; plugin manager,
you should create &lt;code&gt;/init.lua&lt;/code&gt; instead.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight highlight-source-lua notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;--&lt;/span&gt; ~/.config/nvim/plugin/0-tangerine.lua or ~/.config/nvim/init.lua&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;--&lt;/span&gt; pick your plugin manager&lt;/span&gt;
&lt;span class="pl-k"&gt;local&lt;/span&gt; &lt;span class="pl-smi"&gt;pack&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;tangerine&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;packer&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;paq&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;or&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;lazy&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;

&lt;span class="pl-k"&gt;local&lt;/span&gt; &lt;span class="pl-k"&gt;function&lt;/span&gt; &lt;span class="pl-en"&gt;bootstrap&lt;/span&gt;(&lt;span class="pl-smi"&gt;url&lt;/span&gt;, &lt;span class="pl-smi"&gt;ref&lt;/span&gt;)
    &lt;span class="pl-k"&gt;local&lt;/span&gt; &lt;span class="pl-smi"&gt;name&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;url&lt;/span&gt;:&lt;span class="pl-c1"&gt;gsub&lt;/span&gt;(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;.*/&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;)
    &lt;span class="pl-k"&gt;local&lt;/span&gt; &lt;span class="pl-smi"&gt;path&lt;/span&gt;

    &lt;span class="pl-k"&gt;if&lt;/span&gt; &lt;span class="pl-smi"&gt;pack&lt;/span&gt; &lt;span class="pl-k"&gt;==&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;lazy&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;then&lt;/span&gt;
        &lt;span class="pl-smi"&gt;path&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-smi"&gt;vim&lt;/span&gt;.&lt;span class="pl-e"&gt;fn&lt;/span&gt;.&lt;span class="pl-c1"&gt;stdpath&lt;/span&gt;(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;data&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;) &lt;span class="pl-k"&gt;..&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/lazy/&lt;span class="pl-pds"&gt;" &lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;..&lt;/span&gt; &lt;span class="pl-smi"&gt;name&lt;/span&gt;
        &lt;span class="pl-smi"&gt;vim&lt;/span&gt;.&lt;span class="pl-e"&gt;opt&lt;/span&gt;.&lt;span class="pl-en"&gt;rtp&lt;/span&gt;:&lt;span class="pl-c1"&gt;prepend&lt;/span&gt;(&lt;span class="pl-smi"&gt;path&lt;/span&gt;)
    &lt;span class="pl-k"&gt;else&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/udayvir-singh/hibiscus.nvim" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O tangerine integra de maneira bem transparente o Fennel com o Neovim, compilando os arquivos fennel para lua e trazendo umas ferramentas interessantes.&lt;br&gt;
O hibiscus traz várias macros relacionadas ao ecossistema do Neovim que nos ajudam a escrever menos&lt;/p&gt;

&lt;p&gt;O primeiro passo é criar o arquivo &lt;code&gt;~/.config/nvim/plugin/0-tangerine.lua&lt;/code&gt; com o conteúdo:&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="kd"&gt;local&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bootstrap&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="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&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;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isdirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&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;name&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;": installing in data dir..."&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;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"clone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"--depth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&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="s"&gt;[[redraw]]&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;name&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;": finished installing"&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;end&lt;/span&gt;

&lt;span class="n"&gt;bootstrap&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;"tangerine.nvim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"https://github.com/udayvir-singh/tangerine.nvim"&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;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdpath&lt;/span&gt; &lt;span class="s2"&gt;"data"&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;"/site/pack/packer/start/tangerine.nvim"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bootstrap&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;"hibiscus.nvim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"https://github.com/udayvir-singh/hibiscus.nvim"&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;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdpath&lt;/span&gt; &lt;span class="s2"&gt;"data"&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s2"&gt;"/site/pack/packer/start/hibiscus.nvim"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="s1"&gt;'tangerine'&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;compiler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;verbose&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;hooks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"onsave"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"oninit"&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;blockquote&gt;
&lt;p&gt;Essa configuração supõe que você usa o &lt;em&gt;Packer&lt;/em&gt; para gerenciar seus plugins, se você não usa, verifique no repositório do tangerine como instalar no seu gerenciador.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com isso, ao reiniciar o Neovim, o tangerine e o hibiscus vão ser baixados e inicializados.&lt;/p&gt;

&lt;p&gt;Isso significa que você já pode começar a configurar o Neovim em Fennel, criando um arquivo &lt;code&gt;~/.config/nvim/init.fnl&lt;/code&gt; 🎉&lt;/p&gt;

&lt;p&gt;Quando você salvar esse arquivo, o tangerine já vai compila-lo e gerar o arquivo lua para ser carregado pelo Neovim, não sendo necessário fazer nenhuma configuração adicional para isso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dicas para começar com Fennel
&lt;/h3&gt;

&lt;p&gt;A documentação é sua amiga!&lt;/p&gt;

&lt;p&gt;As duas melhores fontes para entender como o Fennel funciona é o &lt;a href="https://fennel-lang.org/tutorial" rel="noopener noreferrer"&gt;tutorial&lt;/a&gt; e a &lt;a href="https://fennel-lang.org/reference" rel="noopener noreferrer"&gt;referência&lt;/a&gt; do Fennel.&lt;/p&gt;

&lt;p&gt;Vou adiantar algumas coisas simples para você já entender o básico.&lt;/p&gt;

&lt;h4&gt;
  
  
  Parênteses
&lt;/h4&gt;

&lt;p&gt;Você vai ver muitos parênteses no Fennel, eles servem para delimitar onde uma expressão começa e termina.&lt;/p&gt;

&lt;p&gt;Por exemplo, para declarar uma variável no escopo local, em lua, você usa a palavra chave &lt;code&gt;local&lt;/code&gt;, já em fennel, você chama a &lt;strong&gt;função&lt;/strong&gt; &lt;code&gt;local&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(local myVar "myValue") ; myVar = "myValue"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se o valor da variável é resultado de uma concatenação, não vamos usar o operador &lt;code&gt;..&lt;/code&gt;, mas sim, a &lt;strong&gt;função&lt;/strong&gt; &lt;code&gt;..&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(local name "Fennel")
(local myVar (.. "Hello, " name)) ; myVar = "Hello, Fennel"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resumindo, toda a função que você chamar, você vai colocar entre parênteses.&lt;/p&gt;

&lt;h4&gt;
  
  
  API do Neovim
&lt;/h4&gt;

&lt;p&gt;Tudo o que você faz com lua, você faz com fennel, então a mesma chamada que você faz para uma API do Neovim em lua, você vai fazer em Fennel.&lt;br&gt;
Isso, em lua:&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;-- Lua&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;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdpath&lt;/span&gt;&lt;span class="s2"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;é isso, em fennel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(print (vim.fn.stdpath :config))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  :symbol
&lt;/h4&gt;

&lt;p&gt;Você já deve ter reparado que, em alguns casos, eu escrevi algumas strings em lua usando &lt;code&gt;:&lt;/code&gt; em fennel (se não reparou, basta olhar para o último exemplo)&lt;/p&gt;

&lt;p&gt;Isso, basicamente, é outro jeito de escrever uma string. No entanto, para escrever nesse formato, a string não pode conter espaços.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(= :str "str") ; true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mapeamentos do tangerine
&lt;/h3&gt;

&lt;p&gt;O plugin que usamos para integrar o Fennel com o Neovim tem uns mapeamentos e comandos que nos ajudam a garantir que estamos escrevendo um código que vai gerar o que queremos. Vou listar abaixo os que eu mais uso:&lt;/p&gt;

&lt;h4&gt;
  
  
  gL
&lt;/h4&gt;

&lt;p&gt;Pode ser executado tanto no modo normal, quando no modo visual.&lt;br&gt;
Esse mapeamento mostra o código lua que o seu código em Fennel vai gerar.&lt;br&gt;
Por exemplo, se eu apertar &lt;code&gt;gL&lt;/code&gt; após selecionar o trecho:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(lambda add [x y]
  (+ x y))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele abre uma janela contendo o código em lua:&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="kd"&gt;local&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;_G&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="o"&gt;~=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;"Missing argument y on globals.fnl:1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;_G&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt; &lt;span class="o"&gt;~=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;"Missing argument x on globals.fnl:1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&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;return&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bem útil para checar rapidamente se o código fennel que você está escrevendo vai gerar o código lua que você espera.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota: Esse mapeamento não funciona muito bem no visual mode se você selecionar um trecho que usa alguma macro, a não ser que no trecho tenha a importação da macro.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  gO
&lt;/h4&gt;

&lt;p&gt;Esse mapeamento abre o arquivo lua compilado pelo arquivo fennel que está aberto, ou seja, se você está com o arquivo &lt;code&gt;plugins.fnl&lt;/code&gt; aberto e aperta &lt;code&gt;gO&lt;/code&gt;, ele vai abrir o arquivo &lt;code&gt;plugins.lua&lt;/code&gt; que foi gerado pela compilação do &lt;code&gt;plugins.fnl&lt;/code&gt;.&lt;br&gt;
Muito útil para fazer debug.&lt;/p&gt;

&lt;h4&gt;
  
  
  :Fnl
&lt;/h4&gt;

&lt;p&gt;Com o comando &lt;code&gt;:Fnl&lt;/code&gt; você consegue executar qualquer código em fennel, da mesma forma que &lt;code&gt;:lua&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;:Fnl (print "hey")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Vai imprimir &lt;code&gt;hey&lt;/code&gt;, equivalente à &lt;code&gt;:lua print("hey")&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Agora é contigo
&lt;/h2&gt;

&lt;p&gt;A partir daqui, você já está preparado para se divertir usando Fennel (e é divertido mesmo).&lt;/p&gt;

&lt;p&gt;Qualquer dúvida, pergunta aqui nos comentários!&lt;/p&gt;

&lt;p&gt;Happy Vimming!&lt;/p&gt;

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