Giter VIP home page Giter VIP logo

dante's Introduction

Dante: Emacs mode for Interactive Haskell

https://badges.gitter.im/dante-mode/Lobby.svg https://melpa.org/packages/dante-badge.svg https://stable.melpa.org/packages/dante-badge.svg

Dante is a fork of Intero mode which aims exclusively at providing a convenient frontend to GHCi. It steals good ideas from Intero, but it aims for light weightedness (see below for a detailed comparison).

Features

FeatureCommandKeybinding
Flycheck type checkingflycheck-mode (†)
Company completioncompany-mode
Type of selectiondante-type-atC-c .
Info at pointdante-infoC-c ,
Apply Ghc suggestion for error at pointattrap-attrapC-c /
Goto definitionxref-find-definitionsM-.
Find usesxref-find-referencesM-?
REPLoid (∗)dante-eval-blockC-c ”
Restartdante-restart
Diagnosisdante-diagnose
Remote operation over ssh, via trampN/AN/A

REPLoid (∗)

You can evaluate code by writing it in a comment of the form -- >>> and run dante-eval-block.

Example:

example :: [String]
example = ["This is an example", "of", "interactive", "evaluation"]

-- >>> intercalate " " example

In the above file, if you invoke dante-eval-block on the line containing “intercalate”, you’ll get:

-- >>> intercalate " " example
-- "This is an example of interactive evaluation"
--

Several commands in the same block will be executed in at once, so you can have local let statements.

-- >>> let foo = "foo"
--
-- >>> foo ++ "bar"
-- "foobar"
---

Any GHCi command can be put in such a block, but note however that:

  1. There is no guarantee that state will be maintained across several calls to dante-eval-block. In fact, Dante liberally calls :r and :l, and (re)sets various GHCi options.
  2. It is not supported to load and/or unload modules in such blocks, or set unexpected options. This may work, or may mess with Dante internals.

So if your goal is run your webserver/database/etc. within GHCi, you should not do it using dante.

Installation

Turn on Dante in your haskell-mode-hook. I recommend:

(use-package dante
  :ensure t
  :after haskell-mode
  :commands 'dante-mode
  :init
  (add-hook 'haskell-mode-hook 'flycheck-mode)
  ;; OR:
  ;; (add-hook 'haskell-mode-hook 'flymake-mode)
  (add-hook 'haskell-mode-hook 'dante-mode)
  )

(†) Dante can only check saved buffers. Therefore, it will save the current buffer every time that a check is triggered. To avoid any surprise (and a bug where GHCi does not see file changes), you may want to disable checks on idle after change:

(setq flymake-no-changes-timeout nil)
(setq flymake-start-syntax-check-on-newline nil)
(setq flycheck-check-syntax-automatically '(save mode-enabled))

You may additionally want to save buffer after some idle time after a change. With Emacs 26:

(auto-save-visited-mode 1)
(setq auto-save-visited-interval 1)

Using dante + hlint

You can activate the hlint checker in addition to the dante checker as follows:

(add-hook 'dante-mode-hook
   '(lambda () (flycheck-add-next-checker 'haskell-dante
                '(warning . haskell-hlint))))

Customization

Customization can be important to make sure that GHCi is properly loaded by dante. Notably the dante-repl-command-line-methods can be especially useful to check. For more fine-grained configuration, check dante-project-root and dante-repl-command-line. Use M-x customize-group dante to read the documentation for all customizable variables. Note in particular that customization can be done on a per-file, per-package or per-project basis by using file- and directory-local variables.

Another useful variable to customize is dante-load-flags.

Comparison with Intero

To the best of my knowledge, here is how Dante compares with Intero:

  • Dante has no dependency on “Stack”
  • Dante’s Emacs code is about half as long as that of Intero.
  • Dante does not depend on custom Haskell code, contrary to Intero. Thus, it will work if (and only if) GHCi works for your project. (Including via “Stack”.)
  • Dante supports xref-find-definitions and xref-find-references.
  • With Dante, Flychecking is optional (yet recommended), whereas Intero demands that you flycheck your code.
  • Dante has has a different approach to Haskell evaluation
  • Dante offers no support for eldoc, nor Hoogle.

dante's People

Contributors

jyp avatar purcell avatar drvink avatar gridaphobe avatar matthewbauer avatar dudebout avatar endgame avatar puffnfresh avatar conal avatar jhenahan avatar aljce avatar ljli avatar marsam avatar tmcgilchrist avatar leungbk avatar

Watchers

 avatar James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.