Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
May 20, 2022 07:26 pm GMT

Configurando Neovim com Fennel

Tudo comea na Lua

Uma das funcionalidades mais aguardadas e amadas pelos usurios do Neovim o suporte lua.

Esse suporte veio, oficialmente, na verso 0.5 do Neovim, o que passou a permitir que os usurios pudessem jogar no lixo deixar de usar seus init.vim e configurar o Neovim usando um belo init.lua.

E uma feliz consequncia disso que, no s podemos usar lua, mas podemos usar pacotes do ecossistema lua e linguagens que compilam
para lua

Hello, Peter Fennel

Fennel uma dessas linguagens que compilam para lua, o que significa que voc vai escrever cdigo fennel, o compilador vai gerar cdigo lua, que vai ser lido e executado pelo Neovim.

Fennel -> Lua -> Neovim

Mas, por que Fennel?

Essa uma pergunta bastante comum que as pessoas fazem quando eu digo que uso Fennel.

Na verdade, uma pergunta comum que as pessoas fazem para todos que usam Fennel, pelo que parece, porque no site oficial do Fennel tem a resposta para, exatamente, essa pergunta.

Vou resumir a resposta deles em alguns pontos.

Fennel menos propenso alguns erros

Lua uma tima linguagem, porm existem alguns pontos que podem facilitar a ocorrncia de erros.

Um dos pontos a facilidade com que voc acessa ou altera uma varivel global.
Se voc criar uma varivel sem a palavra chave local ela j uma varivel global. E para acessar o valor dessa varivel, basta digitar o nome da varivel, o que pode causar comportamentos inesperados, por exemplo:

-- settings.luamyVar = 'this is global'-- init.lualocal myVal = 'local'print('this is the value of local: ' . myVar)

Repare que, por um erro de digitao da palavra myVal, trocando o l pelo r acabamos acessando o valor de uma varivel global definida em outro lugar.
Erros como esse podem ser difceis de descobrir.

Fennel previne erros como esse permitindo que o acesso variveis globais sejam feitos apenas atravs da tabela _G.
Ao tentar simular o caso acima em Fennel, o compilador nos alertar que a varivel myVar no existe.

Outro ponto a falta de validao do nmero de argumentos de uma funo, ou seja, se voc tem uma funo que espera receber 3 parmetros e voc s passa 2, o cdigo vai rodar sem nenhuma indicao de erro.

Em Fennel, podemos usar a palavra chave lambda para criar funes que validam o nmero de parmetros.

(((Sintaxe) do) Lisp!)

Esse um ponto um pouco polmico porque algumas pessoas no gostam da sintaxe do Lisp, mas ela traz alguns benefcios:

  • Tudo uma expresso, ou seja, no temos statements
  • Quando lidamos com operadores, no h ambiguidade do que vem primeiro, no temos "precedncia de operadores". (Em lua, por exemplo, A or B and C or D)

Esses pontos tornam Fennel uma linguagem muito simples de se programar e de se dar manuteno.

Modernidade e facilidades

Alm dos pontos mencionados acima, vale a pena ressaltar algumas funcionalidades interessantes que o Fennel traz para facilitar a nossa vida.

Com Fennel, temos desestruturao, pattern matching, macros e mais.

Desestruturao
-- Lualocal var = require'module'.varlocal var2 = require'module'.var2
; Fennel(local {: var : var2} (require :module))
Pattern matching
-- Lualocal function get_desc(key)  if (key == "k1") then    return "Key 1"  elseif (key == "k2") then    return "Key 2"  elseif (key == "k3") then    return "Key 3"  else    return nilend
; Fennel(lambda get-desc [key]  (match key    :k1 "Key 1"    :k2 "Key 2"    :k3 "Key 3"))

Como comear a usar

Agora que eu te convenci (pelo menos espero) a usar fennel, vamos ver como comear a usa-lo para configurar o Neovim!

Vamos usar dois plugins para isso:

  1. tangerine

    GitHub logo udayvir-singh / tangerine.nvim

    Sweet Fennel integration for Neovim

    About

    Tangerine provides a painless way to add fennel to your config.

    Features

    • BLAZING fast, compile times in milliseconds
    • 200% support for interactive evaluation
    • Control over when and how to compile
    • Natively loads nvim/init.fnl

    Comparison to other plugins

    HOTPOT
    • Abstracts too much away from user.
    • Hooks onto lua package searchers to compile [harder to debug]
    ANISEED
    • Excessively feature rich to be used for dotfiles.
    • Blindly compiles all files that it founds, resulting in slow load times.

    Installation

    1. Create file plugin/0-tangerine.lua to bootstrap tangerine:
    -- ~/.config/nvim/plugin/0-tangerine.lua-- pick your plugin manager, default [standalone]local pack = "tangerine" or "packer" or "paq"local function bootstrap (url)    local name = url:gsub(".*/", "")    local path = vim.fn
  2. hibiscus

    GitHub logo udayvir-singh / hibiscus.nvim

    Flavored Fennel Macros for Neovim

    Hibiscus.nvim

    Highly opinionated macros to elegantly write your neovim config.

    Companion library for tangerinebut it can also be used standalone.

    Neovim version

    Rational

    • Syntactic eye candy over hellscape of lua api
    • Provides missing features in both fennel and nvim api

    Installation

    • Create file plugin/1-tangerine.lua to bootstrap hibiscus:
    -- ~/.config/nvim/plugin/tangerine.lua-- pick your plugin manager, default [standalone]local pack = "tangerine" or "packer" or "paq"local function bootstrap (url)    local name = url:gsub(".*/", "")    local path = vim.fn.stdpath [[data]] .. "/site/pack/".. pack .. "/start/" .. name    if vim.fn.isdirectory(path) == 0 then        print(name .. ": installing in data dir...")        vim.fn.system {"git", "clone", "--depth"

O tangerine integra de maneira bem transparente o Fennel com o Neovim, compilando os arquivos fennel para lua e trazendo umas ferramentas interessantes.
O hibiscus traz vrias macros relacionadas ao ecossistema do Neovim que nos ajudam a escrever menos

O primeiro passo criar o arquivo ~/.config/nvim/plugin/0-tangerine.lua com o contedo:

local function bootstrap (name, url, path)    if vim.fn.isdirectory(path) == 0 then        print(name .. ": installing in data dir...")        vim.fn.system {"git", "clone", "--depth", "1", url, path}        vim.cmd [[redraw]]        print(name .. ": finished installing")    endendbootstrap (  "tangerine.nvim",  "https://github.com/udayvir-singh/tangerine.nvim",  vim.fn.stdpath "data" .. "/site/pack/packer/start/tangerine.nvim")bootstrap (  "hibiscus.nvim",  "https://github.com/udayvir-singh/hibiscus.nvim",  vim.fn.stdpath "data" .. "/site/pack/packer/start/hibiscus.nvim")require'tangerine'.setup{  compiler = {    verbose = false,    hooks = { "onsave", "oninit" }  }}

Essa configurao supe que voc usa o Packer para gerenciar seus plugins, se voc no usa, verifique no repositrio do tangerine como instalar no seu gerenciador.

Com isso, ao reiniciar o Neovim, o tangerine e o hibiscus vo ser baixados e inicializados.

Isso significa que voc j pode comear a configurar o Neovim em Fennel, criando um arquivo ~/.config/nvim/init.fnl

Quando voc salvar esse arquivo, o tangerine j vai compila-lo e gerar o arquivo lua para ser carregado pelo Neovim, no sendo necessrio fazer nenhuma configurao adicional para isso.

Dicas para comear com Fennel

A documentao sua amiga!

As duas melhores fontes para entender como o Fennel funciona o tutorial e a referncia do Fennel.

Vou adiantar algumas coisas simples para voc j entender o bsico.

Parnteses

Voc vai ver muitos parnteses no Fennel, eles servem para delimitar onde uma expresso comea e termina.

Por exemplo, para declarar uma varivel no escopo local, em lua, voc usa a palavra chave local, j em fennel, voc chama a funo local:

(local myVar "myValue")

Se o valor da varivel resultado de uma concatenao, no vamos usar o operador .., mas sim, a funo ..:

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

Resumindo, toda a funo que voc chamar, voc vai colocar entre parnteses.

API do Neovim

Tudo o que voc faz com lua, voc faz com fennel, ento a mesma chamada que voc faz para uma API do Neovim em lua, voc vai fazer em Fennel.

-- Luaprint(vim.fn.stdpath"config")
(print (vim.fn.stdpath :config))

:symbol

Voc j deve ter reparado que, em alguns casos, eu escrevi algumas strings em lua usando : em fennel (se no reparou, basta olhar para o ltimo exemplo)

Isso, basicamente, outro jeito de escrever uma string. No entanto, para escrever nesse formato, a string no pode conter espaos.

(= :str "str") ; true

Agora contigo

A partir daqui, voc j est preparado para se divertir usando Fennel (e divertido mesmo).

Qualquer dvida, pergunta aqui nos comentrios!

Happy Vimming!


Original Link: https://dev.to/dmass/configurando-neovim-com-fennel-489o

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To