I did this about 5 or 6 years ago for vim, and I'm so used to it I wouldn't want to live without it. So I definitely recommend just doing it. It was surprisingly easy to implement, it only took a few hours, and then a day or so to refine the details.
I used haskell-src-exts for parsing and ghc-pkg for all visible modules. By far the slowest part is haskell-src-exts. I have some basic local preferences to resolve name clashes, and with that using the global package list has never been much of a problem. If it were I could use a local sandbox. I don't have any fancy suggestion list, just pick the most likely. I edit the import by hand if it was wrong, which is rare enough that I don't mind. On Fri, Mar 18, 2016 at 11:27 AM, John Williams <j...@pobox.com> wrote: > I have an idea for a tool I'd like to implement, and I'm looking for advice > on the best way to do it. > > Ideally, I want to write an Emacs extension where, if I'm editing Haskell > code and I try to use a symbol that's not defined or imported, it will try > to automatically add an appropriate import for the symbol. If instance, if I > have "import Data.Maybe (isNothing)" in my module, and I try to call > "isJust", the extension would automatically change the import to "import > Data.Maybe (isJust, isNothing)". > > The Emacs part is easy, but the Haskell part has me kind of lost. Basically > I want to figure out how to heuristically resolve a name, using an existing > set of imports as hints and constraints. The main heuristic I'd like to > implement is that, if some symbols are imported from a module M, consider > importing additional symbols from M. A more advanced heuristic might suggest > that if a symbol is exported from a module M in a visible package P, the > symbol should be imported from M. Finally, if a symbol is exported by a > module in the Haskell platform, I'd like to suggest adding the relevant > package as a dependency in the .cabal and/or stack.yaml file, and adding an > import for it in the .hs file. > > Here are some implementation options I'm considering: > > 1. Add a ghci command to implement my heuristics directly, since ghc already > understands modules, packages and import statements. > 2. Load a modified version of the source file into ghci where imports like > "import M (...)" are replaced with "import M", and parse the error messages > about ambiguous symbols. > 3. Write a separate tool that reads Haskell imports and duplicates ghc and > cabal's name resolution mechanisms. > 4. Write a tool that reads Haskell imports and suggests imports from a list > of commonly imported symbols, ignoring which packages are actually visible. > > Right now the options that look best to me are 2 and 4, because the don't > require me to understand or duplicate big parts of ghc, but if modifying ghc > isn't actually that hard, then maybe 1 is the way to go. Option 3 might be a > good way to go if there are libraries I can use to do the hard work for me. > > Any thoughts? > > _______________________________________________ > Glasgow-haskell-users mailing list > Glasgow-haskell-users@haskell.org > http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users > _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users