[Haskell-cafe] autocomplete using hoogle

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