digitallyserviced / sg.nvim

The official Sourcegraph/Cody plugin for Neovim

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

sg.nvim

Status: Beta

Table of Contents

sg.nvim is a plugin focused on bringing many of the features of sourcegraph.com into Neovim.

Setup

To configure logging in:

  • Log in on your Sourcegraph instance.
  • Click your user menu in the top right, then select Settings > Access tokens.
  • Create your access token, and then run :SourcegraphLogin in your neovim editor after installation.
  • Type in the link to your Sourcegraph instance (for example: https://sourcegraph.com)
  • And then paste in your access token.

An alternative to this is to use the environment variables specified for src-cli.

You can check that you're logged in by then running :checkhealth sg

Installation

Requirements

Requires:

  • nvim 0.9 or nvim nightly
  • Cargo to build (pre-built binary/dylibs options to come)
  • Node.js >= 18.17.0 (LTS) at runtime for cody-agent.js - sourcegraph

Install

lazy.nvim
-- Use your favorite package manager to install, for example in lazy.nvim
return {
  {
    "sourcegraph/sg.nvim",
    dependencies = { "nvim-lua/plenary.nvim" },

    -- If you have a recent version of lazy.nvim, you don't need to add this!
    build = "nvim -l build/init.lua",
  },
}
packer.nvim
-- Packer.nvim, also make sure to install nvim-lua/plenary.nvim
use { 'sourcegraph/sg.nvim', run = 'nvim -l build/init.lua' }
vim-plug
" Using vim-plug
Plug 'sourcegraph/sg.nvim', { 'do': 'nvim -l build/init.lua' }

After installation, run :checkhealth sg.

(Nix instructions at the end of the readme)

Configuration:

-- Sourcegraph configuration. All keys are optional
require("sg").setup {
  -- Pass your own custom attach function
  --    If you do not pass your own attach function, then the following maps are provide:
  --        - gd -> goto definition
  --        - gr -> goto references
  on_attach = your_custom_lsp_attach_function
}
" Example mapping for doing searches from within neovim (may change) using telescope.
" (requires telescope.nvim to be installed)
nnoremap <space>ss <cmd>lua require('sg.extensions.telescope').fuzzy_search_results()<CR>

Demos:

Features:

Cody:

  • Chat interface and associated commands
  • Autocompletions, prompted
  • Autocompletions, suggested

Sourcegraph Browsing:

  • Read files:
    • Directly from sourcegraph links: :edit <sourcegraph url>
      • sg.nvim will automatically add protocols for handling https://sourcegraph.com/* links.
    • Directly from buffer names: :edit sg://github.com/tjdevries/sam.py/-/src/sam.py
    • Use :SourcegraphLink to get a link for the location under your cursor
  • Reading non-files:
    • Repository roots
    • Folders
      • Expand Folders
      • Unexpand Folders
      • Open file from folder
  • Use builtin LSP client to connect to SG
    • Goto Definition
    • Goto References
      • <20 references
      • kind of broken right now for lots of references
  • Basic Search
    • literal, regexp and structural search support
    • type:symbol support
    • repo support
  • Advanced Search Features
    • Autocompletion
    • Memory of last searches
  • More? Make an issue with something you're missing :)

Nix(OS)

The project is packaged as a Nix Flake. Consume it as you normally would. In your Nix configuration, make sure that sg-nvim is included both as a Neovim plugin and as an environment/user package (because sg-lsp needs to be on your PATH).

See Neovim guide on NixOS wiki for more details on configuration See gh:willruggiano/neovim.drv for a practical configuration.

For Nix contributors and maintainers:

  • Feel free to nix flake update every once in a while to make sure flake.lock is up-to-date
  • Minimal sg.nvim-integrated neovim package for testing and example
  • Integrate sg.nvim + Cody onto nixpkgs:vimPlugins

You will also need to add the built .cdylib onto package.cpath. Here is one example using gh:willruggiano/neovim.nix:

sg = let
  system = "x86_64-linux";
  package = inputs.sg-nvim.packages.${system}.default;
in {
  inherit package;
  init = pkgs.writeTextFile {
    name = "sg.lua";
    text = ''
      return function()
        package.cpath = package.cpath .. ";" .. "${package}/lib/?.so;${package}/lib/?.dylib"
      end
    '';
  };
};

About

The official Sourcegraph/Cody plugin for Neovim


Languages

Language:Lua 69.0%Language:Rust 28.1%Language:Nix 2.9%