Attention | Topic was automatically imported from the old Question2Answer platform. | |
Asked By | Noah-Huppert |
Question
I recently switched from GDScript to C# and have been trying to setup my Emacs editor to have code completion. Emacs has a plugin called eglot which tries to provide code completion support. Behind the scenes eglot is using a tool called Omnisharp to gain intelligence about the C# code.
I was able to get eglot with Omnisharp working with my C# files. However there is one problem: The code completion has no knowledge of any of the Godot types.
As a test I setup Visual Studio Code as my external editor and clicked the edit script button in Godot. It launched Visual Studio Code with my C# file and had code completion with complete knowledge of the Godot C# types.
I’m not quite sure how it works under the hood but I did find a .sln
file for my Godot project and the .mono
directory with assemblies/GodotSharp.{dll,pdb,xml}
. I think this is how Visual Studio Code was able to find out about Godot C# types.
I then tried configuring eglot to launch Omnisharp with knowledge of the .sln
file. The Omnisharp docs point to a way telling Omnisharp about a .sln
file. My hope was that this .sln
file would tell Omnisharp about the Godot C# dll, pdb, and xml files.
Unfortunately eglot did not seem to like Omnisharp being launched in this fashion.
My question is twofold:
- How exactly does Visual Studio Code know about Godot C# types? Is my assumption correct that I need the code completion to know about the
.sln
,dll
,pdb
, andxml
files for it to have definitions of Godot C# types? - Has anyone configured Emacs with eglot C# autocomplete who could potentially guide me in my setup.
Answer
Since posting my question I figured out how to get this setup working, I hope this solution may be able to help someone in the future.
In my case I had to do 2 things to solve this issue. Item #2 might not be relevant but I want to post it just in case it is and others have this issue.
- Ensure that the OmniSharp binary is being run in your project’s directory. Due to the way I had installed OmniSharp (on Linux so it was a bit custom through a package manager) the OmniSharp binary was being run with a working directory of
/usr/local/bin
. This meant it couldn’t find my solution file because I was giving a relative path. I figured this out when I saw an error message from the OmniSharp LSP server which said it couldn’t find themyproject.sln
file. Once I editted my install to make OmniSharp run in my project directory I was able to get eglot working. - I installed the Mono version of OmnisSharp. I’m not quite sure if this is absolutely required, but I think it makes sense because Godot uses Mono and I assume there is some formatting difference of Mono vs .NET dll files which might have caused the Godot dll files to not be read properly.