[Haskell-cafe] autocomplete using hoogle
Yuras Shumovich
shumovichy at gmail.com
Sun Sep 5 06:57:31 EDT 2010
Hello,
Just want to share some results of my weekend hacking.
It is clear that haskell type checker can help to build a list of
suggestions for autocomplete (very old idea). I tried to create a very basic
prototype to play with the idea.
The approach I used:
The task can be divided into the next two parts:
- find the most general type of the word we are trying to complete
that will satisfy the type checker
- find all the symbols that "match" the found type
The first task can be solved using ghc. Just replace the word with "()" and
ghc will tell you something like
Couldn't match expected type `m String' against inferred type `()'
The second task can be solved using hoogle. Just ask it to find everything
that matches "base :: type", where base -- already known part of the word;
type -- the type that ghc expects.
Source code is attached (linux only at a moment)
haskell.vim -- very basic ftplugin for vim
Place it into your ~/.vim/ftplugin directory (don't forget to backup
an existent file if any)
complete.hs -- simple script that does actual work.
How to use it.
cd to the cabal package you are working on at a moment
mkdir dist/hscomplete
copy complete.hs file to the dist/hscomplete
edit complete.hs (at least change the package name, it is hard coded)
create hoogle database for your package:
cabal haddock --hoogle
hoogle --convert=dist/doc/html/<packageName>/<packageName>.hoo +base
+directory +... (all packages you depend on)
start vim (you should be in the directory where <package>.cabal file is placed!)
Use C-X C-O to auto complete
Example:
cabalized package "tmp" contains two modules Data.Tmp and Data.Tmp1
Data.Tmp1 imports Data.Tmp
Data/Tmp.hs contains
veryLongLongName1 :: Int
veryLongLongName1 = 1
veryLongLongName2 :: Char
veryLongLongName2 = 'c'
veryLongLongName3 :: String
veryLongLongName3 = "Hello"
vim src/Data/Tmp1.hs
import Data.Tmp
tmp1 :: Monad m => [a] -> m Int
tmp1 a = very<C-x C-O> suggests veryLongLongName1
tmp2 :: Monad m => [a] -> m Char
tmp2 a = very<C-x C-O> suggests veryLongLongName2 and veryLongLongName3
tmp3 :: Monad m => [a] -> m String
tmp3 a = very<C-x C-O> suggests veryLongLongName3
Warning: not ready for real use (no error handling, a lot of hard
codes, slow, etc). Just for playing
Yuras
-------------- next part --------------
A non-text attachment was scrubbed...
Name: haskell.vim
Type: application/octet-stream
Size: 1043 bytes
Desc: not available
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20100905/8d7275fa/haskell.obj
-------------- next part --------------
A non-text attachment was scrubbed...
Name: complete.hs
Type: text/x-haskell
Size: 2169 bytes
Desc: not available
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20100905/8d7275fa/complete.bin
More information about the Haskell-Cafe
mailing list