Begin learning elixir recently, and i was setup the elixirls in neovim following this guide. I could get most of the lsp elixirls feature work, such as doc hover, snippet, autocompletion, and so on, but I found I just can’t get the autocompeletion work for local module in another file. I’ll describe my problem as follows:
I’ve got two files in same directory, person.exs
and main.exs
:
![file1](/Users/huibosa/Desktop/Screenshot 2023-10-03 at 4.14.18 PM.png)
![file2](/Users/huibosa/Desktop/Screenshot 2023-10-03 at 4.15.35 PM.png)
which can be seen from the pictures that the autocompeletion source for module Person
failed in main.exs. However, when I move the statements to
person.exs`, I could get the expected autocompeletion:
![file3](/Users/huibosa/Desktop/Screenshot 2023-10-03 at 4.16.36 PM.png)
At first I thought this would be a lack of implementation of something in elixirls, but when I switch to vscode, where I’ve installed the elixirls viscose extension, finding that the autocompeletion works as ecpected:
![file4](/Users/huibosa/Desktop/Screenshot 2023-10-03 at 3.59.40 PM.png)
To give you more information:
- Neovim version: v0.9.2
- Elixirs version: v0.16.0
- OS: mac
Autocompletion for files outside a mix project should only be limited to the current open file. So you can’t get auto completion from “person.exs” in “main.exs”. And I’ve tested it in both Neovim and VSCode.
Can you reupload those broken images if I misunderstood something?
1 Like
Thanks for your generous help. Since the forum system tells me that the new user can’t upload a picture, I’ve get the help from the github issue.
Furtherly, for any beginner like me from other languages who wants to get the autocompletion in a “single-file-script”, I recommend just move the code snippets inside the module, like the run()
function below:
defmodule People.Person do
alias People.Person
defstruct first_name: nil,
last_name: nil,
birthday: nil,
location: "home"
def full_name(%__MODULE__{first_name: first_name, last_name: nil}) do
"#{first_name}"
end
def full_name(%__MODULE__{first_name: first_name, last_name: last_name}) do
"#{first_name} #{last_name}"
end
def age(%__MODULE__{birthday: birthday}) do
days = Date.diff(Date.utc_today(), birthday)
days / 365.25
end
def toggle_location(%__MODULE__{location: "home"} = person) do
person |> set_location("away")
end
def toggle_location(%__MODULE__{location: "away"} = person) do
person |> set_location("home")
end
defp set_location(%__MODULE__{} = person, location) do
%{person | location: location}
end
def run() do
person = %Person{
first_name: "foo",
last_name: "bla",
birthday: ~D{1995-03-19}
}
person |> Person.full_name() |> IO.puts()
end
end
People.Person.run()