<?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: Lucas Bulhões</title>
    <description>The latest articles on DEV Community by Lucas Bulhões (@lb1998).</description>
    <link>https://dev.to/lb1998</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%2F758914%2F1e8d21c3-6d2a-4c8f-b605-9340d7eb5a1c.jpeg</url>
      <title>DEV Community: Lucas Bulhões</title>
      <link>https://dev.to/lb1998</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lb1998"/>
    <language>en</language>
    <item>
      <title>Configurando ambiente de desenvolvimento haskell no emacs</title>
      <dc:creator>Lucas Bulhões</dc:creator>
      <pubDate>Thu, 03 Mar 2022 08:23:57 +0000</pubDate>
      <link>https://dev.to/lb1998/configurando-ambiente-de-desenvolvimento-haskell-no-emacs-443d</link>
      <guid>https://dev.to/lb1998/configurando-ambiente-de-desenvolvimento-haskell-no-emacs-443d</guid>
      <description>&lt;h2&gt;
  
  
  Descrição
&lt;/h2&gt;

&lt;p&gt;Esse tutorial tem o objetivo de ajudar a preparar um ambiente de desenvolvimento simples e "funcional" para desenvolvimento na linguagem Haskell, utilizando o editor GNU/Emacs. Durante todo o "passo a passo" estarei supondo um ambiente GNU/Linux, mas você poderá acompanhar, com as devidas modificações, em qualquer outro tipo de sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação do Emacs
&lt;/h2&gt;

&lt;p&gt;Antes de tudo, devemos fazer uma instalação do emacs. Para isso podemos digitar a seguinte linha em um terminal:&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;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;emacs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Instalação do Haskell Tool Stack
&lt;/h2&gt;

&lt;p&gt;Para instalar o Stack basta digitar a seguinte linha no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &lt;span class="nt"&gt;-qO-&lt;/span&gt; https://get.haskellstack.org/ | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muito provavelmente você deve obter um "warning" avisando que o Stack armazena os binários em '/home/$USER/.local/bin' pós build, e pedindo para que o diretório seja adicionado ao PATH. Cole a seguinte linha em seu arquivo ~/.bashrc&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;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:/home/&lt;span class="nv"&gt;$USER&lt;/span&gt;/.local/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No caso de o diretório ~/.local/bin não existir, crie com o comando abaixo:&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; ~/.local/bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Instalando Haskell Language Server
&lt;/h2&gt;

&lt;p&gt;Podemos baixar haskell-language-server e haskell-language-server-wraper acessando a página abaixo:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/haskell/haskell-language-server/releases"&gt;https://github.com/haskell/haskell-language-server/releases&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Para descobrir a versão do GCH que está sendo usada, digite a seguinte linha no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stack ghc &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Extraia os dois arquivos baixados e mova ambos para a pasta ~/.local/bin. O arquivo haskell-language-server-[version] deve ser renomeado para haskell-language-server.&lt;br&gt;&lt;br&gt;
Os arquivos devem estar com permissão de execução, o que pode ser concedido com os seguintes 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;sudo chmod&lt;/span&gt; +x ~/.local/bin/haskell-language-server
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x ~/.local/bin/haskell-language-server-wrapper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configurando Emacs
&lt;/h2&gt;

&lt;p&gt;Precisamos configurar os repositórios onde o emacs irá buscar os pacotes que iremos precisar. Para isso, insira o seguinte código em seu arquivo ~/.emacs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight common_lisp"&gt;&lt;code&gt;&lt;span class="c1"&gt;;; Verifica e inicia o package.el&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="ss"&gt;'package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;;; Definição de repositórios&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;package-archives&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;"melpa"&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s"&gt;"https://melpa.org/packages/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
             &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org"&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s"&gt;"https://orgmode.org/elpa/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
             &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"elpa"&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s"&gt;"https://elpa.gnu.org/packages/"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="c1"&gt;;; Inicialização do sistema de pacotes&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;package-initialize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;unless&lt;/span&gt; &lt;span class="nv"&gt;package-archive-contents&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;package-refresh-contents&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;;; Instalação do use-package&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;unless&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;package-installed-p&lt;/span&gt; &lt;span class="ss"&gt;'use-package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;package-install&lt;/span&gt; &lt;span class="ss"&gt;'use-package&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="ss"&gt;'use-package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;use-package-always-ensure&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Devemos agora instalar os pacotes responsáveis pelos recursos fundamentais do nosso ambiente. Para instalar um pacote no emacs via &lt;strong&gt;package.el&lt;/strong&gt; basta executar M-x package-install RET nome-do-pacote RET.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lista de Pacotes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lsp-mode&lt;/li&gt;
&lt;li&gt;lsp-ui&lt;/li&gt;
&lt;li&gt;flycheck&lt;/li&gt;
&lt;li&gt;company&lt;/li&gt;
&lt;li&gt;lsp-treemacs&lt;/li&gt;
&lt;li&gt;helm-lsp&lt;/li&gt;
&lt;li&gt;lsp-ivy&lt;/li&gt;
&lt;li&gt;dap-mode&lt;/li&gt;
&lt;li&gt;lsp-haskell&lt;/li&gt;
&lt;li&gt;haskell-mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feito isso, adicione o seguinte código ao seu arquivo ~/.emacs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight common_lisp"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;lsp-mode&lt;/span&gt;
  &lt;span class="ss"&gt;:init&lt;/span&gt;
  &lt;span class="c1"&gt;;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l")&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;setq&lt;/span&gt; &lt;span class="nv"&gt;lsp-keymap-prefix&lt;/span&gt; &lt;span class="s"&gt;"C-c l"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="ss"&gt;:hook&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;;; replace XXX-mode with concrete major-mode(e. g. python-mode)&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;haskell-mode&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="c1"&gt;;; if you want which-key integration&lt;/span&gt;
         &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;lsp-mode&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;lsp-enable-which-key-integration&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="ss"&gt;:commands&lt;/span&gt; &lt;span class="nv"&gt;lsp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;;; optionally&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;lsp-ui&lt;/span&gt; &lt;span class="ss"&gt;:commands&lt;/span&gt; &lt;span class="nv"&gt;lsp-ui-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;;; if you are helm user&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;helm-lsp&lt;/span&gt; &lt;span class="ss"&gt;:commands&lt;/span&gt; &lt;span class="nv"&gt;helm-lsp-workspace-symbol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;;; if you are ivy user&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;lsp-ivy&lt;/span&gt; &lt;span class="ss"&gt;:commands&lt;/span&gt; &lt;span class="nv"&gt;lsp-ivy-workspace-symbol&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;lsp-treemacs&lt;/span&gt; &lt;span class="ss"&gt;:commands&lt;/span&gt; &lt;span class="nv"&gt;lsp-treemacs-errors-list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;;; optionally if you want to use debugger&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;dap-mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;;; (use-package dap-LANGUAGE) to load the dap adapter for your language&lt;/span&gt;

&lt;span class="c1"&gt;;; optional if you want which-key integration&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;use-package&lt;/span&gt; &lt;span class="nv"&gt;which-key&lt;/span&gt;
    &lt;span class="ss"&gt;:config&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;which-key-mode&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Error package is unavailable ELPA
&lt;/h2&gt;

&lt;p&gt;É possível que no passo anterior o emacs tenha problemas para encontrar algumas dependências no repositório ELPA, por exemplo, uma mensagem semelhante a: "Package spinner-1.7.3 is unavailable" pode ser exibida. Isso pode ocorrer devido à expiração da GPG keyring, que verifica a autenticidade dos pacotes baixados através do repositório GNU ELPA.&lt;/p&gt;

&lt;p&gt;Você poderá resolver isso digitando o seguinte bloco no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;keyserver hkp://keys.gnupg.net
gpg &lt;span class="nt"&gt;--homedir&lt;/span&gt; ~/.emacs.d/elpa/gnupg &lt;span class="nt"&gt;--receive-keys&lt;/span&gt; 066DAFCB81E42C40
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o emacs conseguirá coletar dados de ELPA sem nenhuma mensagem de erro. Execute &lt;strong&gt;M-x package-refresh-contents RET&lt;/strong&gt; para atualizar os pacotes e dependências. &lt;/p&gt;

&lt;h2&gt;
  
  
  Testando
&lt;/h2&gt;

&lt;p&gt;A configuração básica do nosso ambiente foi concluída. Para testar, podemos começar um novo projeto haskell via Stack e abri-lo no emacs. Basta inserir o seguinte bloco no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stack new projeto-haskell simple
&lt;span class="nb"&gt;cd &lt;/span&gt;projeto-haskell
emacs Setup.hs &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma mensagem como esta deve aparecer na parte inferior da tela. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MP6ZOoF7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e41nin2yy7a5bkhfygkm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MP6ZOoF7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e41nin2yy7a5bkhfygkm.png" alt="Image description" width="880" height="108"&gt;&lt;/a&gt;&lt;br&gt;
Você pode apertar "i" para definir a raiz do projeto como a pasta na qual você está.&lt;br&gt;&lt;br&gt;
Experimente abrir todos os arquivos do projeto utilizando treemacs, para testar se os pacotes estão funcionando corretamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Error LSP Disconnected
&lt;/h2&gt;

&lt;p&gt;Pode ocorrer de o LSP não ativar para alguns arquivos .sh e ativar para outros. Nesse caso experimente apagar todos os arquivos terminados em ".elc" na pasta dos pacotes lsp-mode e lsp-ui dentro de ~/.emacs.d/elpa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback and Contributing
&lt;/h2&gt;

&lt;p&gt;O objetivo deste guia é auxiliar na experiência do usuário iniciante no emacs, sendo assim, toda sugestão de melhorias e correção de erros é muito bem vinda.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
