Zulip Chat Archive

Stream: new members

Topic: Lean4 autocomplete


Vasily Ilin (Oct 09 2023 at 19:50):

I get no autocomplete in Lean4 in VS Code. Has it just not been implemented yet? I relied on autocomplete in Lean3 to find relevant theorems.

Patrick Massot (Oct 09 2023 at 19:51):

Auto-complete does not work with imports yet but it definitely works with lemma names.

Vasily Ilin (Oct 09 2023 at 19:54):

lemma names from the current namespace?

Damiano Testa (Oct 09 2023 at 20:42):

This is a little hacky, but it does produce a form of "autocomplete":

import Std.Tactic.TryThis

namespace Mathlib.Tactic.imp

open Lean Elab Command FuzzyMatching

/--  A syntax that allows strings to be printed without surrounding them by guillemets `«...»`. -/
declare_syntax_cat write_me_output_stx

@[inherit_doc Parser.Category.write_me_output_stx]
syntax "import " ident : write_me_output_stx

/-- `imp <string>` tries to find a file matching `Mathlib.<string>`.
It prints a list of candidates, taking the names from `Mathlib.lean`.
If there is only one candidate, it suggests `import Mathlib.<uniqueCandidate>` as a `Try this`.

Using `imp! <string>` uses fuzzy-matching, rather than exact matching. -/
elab (name := commandImp!) tk:"imp" fz:("!")? na:(colGt ident) : command => do
  let inp := na.getId.toString
  let dat := ( IO.FS.lines "Mathlib.lean").map (String.drop · 15)
  let cands := dat.filter <| (if fz.isSome then fuzzyMatch else String.isPrefixOf) inp
  match cands.toList with
    | [] => throwErrorAt tk "no available imports"
    | [imp] =>
      let impS  Lean.moduleNameOfFileName ("Mathlib/" ++ imp.replace "." "/" ++ ".lean") none
      let imp : TSyntax `write_me_output_stx  `(write_me_output_stx| import $(mkIdent impS))
      let stx  getRef
      liftTermElabM do
        Std.Tactic.TryThis.addSuggestion stx imp
    | cl => logInfoAt tk <| "\n".intercalate cl

@[inherit_doc commandImp!]
macro "imp!" na:(colGt ident) : command => `(command| imp ! $na)

end Mathlib.Tactic.imp

--  Here is how it works: typing
imp Data.ENat
-- produces
/-
Data.ENat.Basic
Data.ENat.Lattice
-/

-- typing
imp Data.ENat.L
--  produces
/-
Try this: import Mathlib.Data.ENat.Lattice
-/

imp! DtaENB
--  fuzzy matching!  produces
/-
Try this: import Mathlib.Data.ENat.Basic
-/

Patrick Massot (Oct 09 2023 at 20:44):

Damiano, you are not answering Vasily, are you?

Damiano Testa (Oct 09 2023 at 20:44):

Ah, I was answering your "Auto-complete does not work with imports yet"...

Patrick Massot (Oct 09 2023 at 20:45):

Yes, I understand.

Patrick Massot (Oct 09 2023 at 20:45):

This is nice, but we really need proper support from the Lean server.

Damiano Testa (Oct 09 2023 at 20:45):

Actually, I had this command a while ago, since I wanted it, so I thought of posting it here.

Damiano Testa (Oct 09 2023 at 20:46):

(In case others find it useful before proper support arrives!)

Eric Wieser (Oct 09 2023 at 20:52):

Is there a lean4 issue for this autocomplete? It so, it would maybe be a good place to keep Damiano's workaround.

Damiano Testa (Oct 09 2023 at 21:06):

I looked at the issues, but I could not find one about autocomplete imports. I remember the issue coming up a few times on Zulip, though.

Marc Huisinga (Oct 10 2023 at 07:34):

There's no issue in the Lean 4 repository for import auto-completion, but feel free to create one.

Damiano Testa (Oct 10 2023 at 19:41):

I just found out that there is a fuzzy-match algorithm in Lean, so I added fuzzy-matching capabilities to the auto-complete above! Now, if you type

imp! <string>

you will get real-time fuzzy-matching of <string> against all files in Mathlib and a Try this: import ... whenever there is a unique file fuzzy-matching your input.

Utensil Song (Oct 11 2023 at 14:02):

Users might expect imp? due to simp? etc.

Utensil Song (Oct 11 2023 at 14:13):

It seems that I have to change to IO.FS.lines "lake-packages/mathlib/Mathlib.lean" to use it, and why is Try this not clickable?

image.png

Patrick Massot (Oct 11 2023 at 14:40):

I don't think it's a good idea to invest more time in this workaround. I trust Marc to bring us the right solution in a not too distant future.

Damiano Testa (Oct 11 2023 at 15:50):

@Utensil Song, changing the ! to ? is no issue at all! Your other suggestion is easy to implement, but I only wrote this command thinking that it would help locate a single import and propose to import that one.

Anyway, as Patrick already mentioned, I had not intended this to be particularly robust or long-lived: it is a very short hack, while we wait for proper auto-complete support!

Damiano Testa (Oct 11 2023 at 15:51):

In fact, I would say that users should expect Ctrl-Space, rather than having to call a command!

Utensil Song (Oct 11 2023 at 15:55):

I fiddled with it a bit and got a clickable list:

Code

But I'm mostly struggled with the path prefix "lake-packages/mathlib" issue (I hacked my way through it but unsatisfied), do you have any idea why?

Utensil Song (Oct 11 2023 at 15:57):

Sure, better not to invest more time in this, but I was curious of the implementation so I fiddled with it a bit.

Damiano Testa (Oct 11 2023 at 15:58):

I understand: the reason I wrote this, was mostly to teach myself something about meta-programming, syntax and dealing with files in Lean.

Utensil Song (Oct 11 2023 at 15:58):

Now you have taught me (the interesting combination) :grinning:

Damiano Testa (Oct 11 2023 at 16:03):

On my computer, this line

  let dat := ( IO.FS.lines "lake-packages/mathlib/Mathlib.lean").map (String.drop · 15)

introduces lake-packages/mathlib/ which upsets the command. If I use

  let dat := ( IO.FS.lines "Mathlib.lean").map (String.drop · 15)

instead, then I get

imp! Ring
/-
Try this: import BigOperators.Ring
Try this: import BigOperators.RingEquiv
Try this: import Category.BoolRing
Try this: import Category.ModuleCat.ChangeOfRings
...
-/

Damiano Testa (Oct 11 2023 at 16:04):

(I removed both occurrences of lake-packages/mathlib/)

Utensil Song (Oct 11 2023 at 16:06):

On my Mac without them it just keeps complaining

no such file or directory (error code: 2)
  file: Mathlib.lean

So I need both of them to make it work:

image.png

Damiano Testa (Oct 11 2023 at 16:13):

Ok, I think that this is all the more reasons for preferring a more robust solution! Anyone should feel free to modify and use the code above, but I wouldn't even have guessed that what you reported could have been an issue...

Damiano Testa (Oct 11 2023 at 20:37):

By the way, Scott opened an issue for autocompletion of imports: Lean4 issue #2655.


Last updated: Dec 20 2023 at 11:08 UTC