# Editor Support

## Visual Studio Code

[vscode-opa](https://marketplace.visualstudio.com/items?itemName=tsandall.opa) - the official OPA extension for Visual Studio Code - now supports the Regal language server.

To see Regal linting as you work, install the extension at version `0.13.3` or later and open a workspace with Rego files.

The plugin will automatically find and use [Regal config](https://www.openpolicyagent.org/projects/regal#configuration).

### Debug Adapter Protocol (DAP)

From [`v0.17.0`](https://github.com/open-policy-agent/vscode-opa/blob/main/CHANGELOG.md#0170) onwards, the OPA extension for Visual Studio Code supports the [Regal Debug Adapter](https://www.openpolicyagent.org/projects/regal/debug-adapter).

To start a new debug session use the code action `Debug` found above a Rego rule or package.

![Code Action in VS Code](/assets/images/codeaction-d888ef967bb1f317f7639e5629c2f6a1.png)

Breakpoints can be added by clicking in the gutter to the left of the editor. Print statements will be shown in the debug console.

## Zed

[Zed](https://zed.dev) is a modern open-source code editor with focus on performance and simplicity.

Zed supports Rego via Regal and the [zed-rego](https://github.com/StyraInc/zed-rego) extension developed by the Styra community. The extension provides syntax highlighting, linting, and most of the other language server features provided by Regal.

## Neovim

[Neovim](https://neovim.io/) supports both the Language Server Protocol and the Debug Adapter Protocol.

Generally, the Regal binary should be [installed](https://www.openpolicyagent.org/projects/regal#getting-started) first. [`mason.vim`](https://github.com/mason-org/mason.nvim) users can install the Regal binary with `:MasonInstall regal` ([package definition](https://github.com/mason-org/mason-registry/blob/2024-07-23-asian-hate/packages/regal/package.yaml)).

### Language Server Protocol (LSP)

There are a number of different plugins available for Neovim which integrate with language servers using the Language Server Protocol.

Below are a number of different plugin options to configure a language server client for Regal in Neovim.

nvim-lspconfig

[nvim-lspconfig](https://github.com/neovim/nvim-lspconfig) has native support for the Regal language server. Use the configuration below to configure Regal:

```
require('lspconfig').regal.setup()
```

none-ls

[none-ls](https://github.com/nvimtools/none-ls.nvim) - Use Neovim as a language server to inject LSP diagnostics, code actions, and more via Lua.

Minimal installation via [VimPlug](https://github.com/junegunn/vim-plug)

```
Plug 'nvim-lua/plenary.nvim'Plug 'nvimtools/none-ls.nvim'lua <<EOFlocal null_ls = require("null-ls")null_ls.setup {    sources = { null_ls.builtins.diagnostics.regal }}EOF
```

Using sample rego file `test.rego` with following content

```
package testdefault allowRbac := true
```

Example of the diagnostics in as shown in the UI:

![regal in none-ls](data:image/png;base64,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)

nvim-cmp

[nvim-cmp](https://github.com/hrsh7th/nvim-cmp) supports the adding of language servers as a source.

To use Regal with `nvim-cmp`, it is recommended that you use the [`nvim-lspconfig` source](https://github.com/hrsh7th/cmp-nvim-lsp) and follow the instructions above to configure `nvim-lspconfig`.

Other plugins

To see live linting of Rego, your plugin must support [`textDocument/diagnostic`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_diagnostic) messages.

There are many language server integrations for Neovim, if you'd like to see another one listed, please [open an issue](https://github.com/open-policy-agent/regal/issues/new) or drop us a message in [Slack](https://slack.openpolicyagent.org).

### Debug Adapter Protocol (DAP)

nvim-dap and nvim-dap-rego

[nvim-dap](https://github.com/mfussenegger/nvim-dap) is a DAP client implementation for Neovim. This plugin provides basic functions to control debuggers from Neovim.

[nvim-dap-rego](https://github.com/rinx/nvim-dap-rego) provides basic configurations for Regal's DAP interface.

To set up Regal's debugger,

```
require('dap-rego').setup()
```

Then you can launch debug sessions by calling `:lua require('dap').continue()`.

## Helix

The [Helix](https://helix-editor.com/) editor comes with a default config that tries to use `regols` for Rego files. You can make it use Regal instead via this `languages.toml` config:

```
[[language]]name = "rego"scope = "source.rego"roots = [".regal/config.yaml"]file-types = ["rego"]indent = { tab-width = 4, unit = "\t" }comment-token = "#"language-servers = [ { name = "regal" } ][language-server.regal]command = "regal"args = ["language-server"]config = { provideFormatter = true }
```

[See the languages docs](https://docs.helix-editor.com/languages.html#language-configuration) for details.

## Kakoune

The [Kakoune](https://kakoune.org) editor has a plugin for LSP support, [kakoune-lsp](https://github.com/kakoune-lsp/kakoune-lsp). You can use Regal with this plugin using this config:

```
hook global BufCreate .+\.rego %{    set-option buffer filetype rego}hook global BufSetOption filetype=rego %{    set-option buffer lsp_language_id rego    set-option buffer lsp_servers %{        [regal]        root_globs = [".git", ".hg", ".regal"]        command = "regal"        args = ["language-server"]        # these three lines are optional, to configure initializationOptions        settings_section = "regal"        [regal.settings.regal]        formatter = "opa fmt --rego-v1"    }}
```