/company-ghc

Company-mode completion back-end for haskell-mode via ghc-mod

Primary LanguageEmacs Lisp

Company GHC travis

Table of Contents

Overview

Company-mode completion back-end for haskell-mode via ghc-mod.
It runs when the major mode is derived from haskell-mode.

Installation

Depends

  • cl-lib
  • company-mode
  • ghc-mod

    In order to make company-ghc work, ghc-comp-init needs to be called once. It is called by ghc-init, so if you follow ghc-mod manual, there is nothing else to do about it. Otherwise (if you don't want to call ghc-init), ensure ghc-comp-init is called before using company-ghc.

Optional Dependency

  • hoogle command and its database (hoogle data) for doc-buffer support and hoogle search completion.

Setup from MELPA

  1. Install from MELPA:

    M-x package-install RET company-ghc RET
  2. Add company-ghc to company-backends after loading company-mode and ghc-mod

    (add-to-list 'company-backends 'company-ghc)

Setup from Git

  1. Install from Git:

    git clone https://github.com/iquiw/company-ghc.git
  2. Add company-ghc to company-backends after loading company-mode and ghc-mod

    (add-to-list 'load-path "/path/to/company-ghc")
    (add-to-list 'company-backends 'company-ghc)

Feature

Completion

The following completions are available.

  1. Pragma names. (ghc-pragma-names)

    Completion for pragma

  2. Language extensions. (ghc-language-extensions)

    Completion for language extensions

  3. GHC option flags. (ghc-options-flags)

    Completion for GHC options

  4. Import module names. (ghc-modules-names)

    Completion for import modules

  5. Variables and functions in import spec. (ghc-module-keyword)

    Completion for import specs

  6. Qualified imported keywords.

    Completion for qualified imported keywords

  7. Keywords from imported modules.

    Completion for keywords of imported modules

Show type info in minibuffer

  • If company-ghc-show-info is t, oneline or nomodule, then type info of completion candidate is displayed in minibuffer by ghc-mod info.

    Show info in minibuffer (``nomodule``)

Show module name as annotation

  • Module name is displayed as completion annotation if company-ghc-show-module is non-nil (default) as in the above images.

Display Hoogle document as doc-buffer

  • If hoogle is installed and its database is prepared, then pressing <f1> displays hoogle searched documentation in the doc-buffer.

    Display documentation in docbuffer

Special completion command

  1. In-module completion (M-x company-ghc-complete-in-module)

    It takes a module name in minibuffer, and provides candidates from keywords defined in the specified module. You can use this as an alternative to :browse command of GHCi.

    In-module completion

  2. Hoogle search completion (M-x company-ghc-complete-by-hoogle)

    It takes a query text in minibuffer, and provide candidates from hoogle search results. For example, candidates is like the following if the query is (a -> b) -> (f a -> f b).

    Hoogle search completion

    If hoogle search completion failed by async timeout, increase the value of company-async-timeout (default 2).

    If you want to get more search results at a time, increase the value of company-ghc-hoogle-search-limit (default 20).

Note

  • Currently, company-ghc treats all symbols as completion prefix unless it starts from line beginning. This means other back-ends after company-ghc have no chance to provide completion candidates in haskell-mode.

    As of now, if you want to use other back-ends with company-ghc, use grouped back-end like below.

    (add-to-list 'company-backends '(company-ghc :with company-dabbrev-code))
  • company-ghc add automatic scan module function to local after-save-hook. It might cause serious problem if there is a bug in it. If you have any trouble at save, turn off autoscan by M-x company-ghc-turn-off-autoscan.

    If customized variable company-ghc-autoscan is nil, autoscan won't be added to local after-save-hook.

    If scan module is not performed in the buffer, completion by company-ghc does not work properly. scan module can be invoked by M-x company-ghc-scan-modules.

Diagnostic

There are some cases that completion by company-ghc does not work. If there is something wrong, run M-x company-ghc-diagnose, which shows diagnostic info like the following:

* company-ghc backend found: company-ghc
* automatic scan module is enabled
* ghc-boot process has been done

Module                                  Alias               Candidates
-------------------------------------------------------------------------------
Data.Maybe                              -                        12
Data.Map                                M                        111
Data.Attoparsec.ByteString.Char8        -                        76
Control.Applicative                     -                        22
Prelude                                 -                        212

The first item shows if company-ghc is added to company-backends or not.

The second item shows if company-ghc auto scan is enabled or not.

The third item shows if ghc-boot has been processed properly.

The table shows rows of imported module in the current buffer, its qualified import alias and number of candidates in the module.

If company-ghc-autoscan is non-nil but company-ghc auto scan is disabled, it is possibly initialization step of company-ghc is not performed by some reason. Check company-ghc configuration. For workaround, run M-x company-ghc-turn-on-autoscan manually.

If ghc-boot process has not been done or failed to run, check ghc-mod configuration (Ref. ghc-mod manual) or whether ghc-mod boot command from shell or command prompt succeeds in the project directory.

If some module is not in the table, it is possibly bug of company-ghc.

If number of candidates is 0 or nil, it might be problem related to ghc-mod. Try again with setting ghc-debug to t and see if there is any error in *GHC Debug* buffer.

License

Licensed under the GPL 3+ license.