Skip to content

neovim/nvim.net

Repository files navigation

Nvim.NET

Test Workflow Status

.NET client for Neovim

Plugin Host Install

Using vim-plug:

Plug 'neovim/nvim.net'

Quickstart for Linux

  1. Install dotnet
  2. Clone the Nvim .NET client (this repo):
    git clone https://github.com/neovim/nvim.net
    
  3. Run the tests, to check that everything is working:
    dotnet test test/NvimClient.Test/NvimClient.Test.csproj
    

Plugin Development with C#

  1. Create a new solution and class library project.
    mkdir my-plugin
    dotnet new sln
    dotnet new classlib --output my-plugin
    dotnet sln add my-plugin/my-plugin.csproj
    
  2. Install the NvimClient.API NuGet package
    dotnet add my-plugin/my-plugin.csproj package NvimClient.API
    
  3. Create a class like this
    using NvimClient.API;
    using NvimClient.API.NvimPlugin.Attributes;
    using NvimClient.API.NvimPlugin.Parameters;
    
    namespace MyPlugin {
      // Make sure the class is public and has the NvimPlugin attribute.
      [NvimPlugin]
      public class MyPlugin {
        private readonly NvimAPI _nvim;
        // Constructor with exactly one `NvimAPI` parameter.
        public MyPlugin(NvimAPI nvim) {
          _nvim = nvim;
        }
        // Use attributes to expose functions, commands, and autocommands.
        // Valid parameter types and return types are:
        //   string, bool, long, double, T[], and IDictionary<T, T>
        [NvimFunction]
        public long MyFunction(long num1, long num2) {
          return num1 + num2;
        }
        [NvimCommand(Range = ".", NArgs = "*")]
        public void MyCommand(long[] range, params object[] args) {
          _nvim.SetCurrentLine(
            $"Command with args: {args}, range: {range[0]}-{range[1]}");
        }
        [NvimAutocmd("BufEnter", Pattern = "*.cs")]
        public void OnBufEnter(
            [NvimEval("expand('<afile>')")] string filename) {
          _nvim.OutWrite($"my-plugin is in '{filename}'\n");
        }
      }
    }
  4. Make the directory rplugin/dotnet in the same directory as the solution file. If you are using git, you will need to create a file inside the directory so it can be tracked.
    mkdir rplugin/dotnet
    echo '' > rplugin/dotnet/.keep
    git add rplugin/dotnet
    
  5. Start nvim and run :UpdateRemotePlugins.

Build

dotnet build

Generate API

The API generator takes two arguments: the output path of the generated C# class file and the path to the Neovim source directory. nvim and doxygen must be in the PATH.

 dotnet run --project src/NvimClient.APIGenerator/NvimClient.APIGenerator.csproj
   src/NvimClient.API/NvimAPI.generated.cs
   /usr/local/src/neovim/

Test

Run all tests (nvim must be in the PATH):

dotnet test test/NvimClient.Test/NvimClient.Test.csproj

Run only the TestMessageDeserialization test:

dotnet test --filter TestMessageDeserialization test/NvimClient.Test/NvimClient.Test.csproj

Release

  1. Update version as necessary in src/NvimClient.API/NvimClient.API.csproj.
  2. Ensure the repository secret NUGET_API_KEY is set to a nuget.org API key with package push permission. No extra GitHub Packages secret is required; the workflow uses the built-in GITHUB_TOKEN.
  3. Run the publish workflow from the branch or tag to release. Leave package-version empty to use the project version, or set it to override PackageVersion for that run.
  4. The workflow builds, packs, uploads the .nupkg and .snupkg artifacts, then pushes the .nupkg packages to GitHub Packages and nuget.org.

About

Nvim .NET client and plugin host

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors