• Stars
    star
    330
  • Rank 127,011 (Top 3 %)
  • Language
    Lua
  • License
    Other
  • Created about 2 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Quarto mode for Neovim

quarto-nvim

Quarto-nvim provides tools for working on quarto manuscripts in Neovim. You can get started with Quarto here.

Walkthrough

The get started section also comes with a video version to walk you through. The playlist is extened as more features are added, so join us for a "Coffee with Quarto and Neovim":

https://youtu.be/3sj7clNowlA?list=PLabWm-zCaD1axcMGvf7wFxJz8FZmyHSJ7

Setup

You can install quarto-nvim from GitHub with your favourite Neovim plugin manager like lazy.nvim, packer.nvim or VimPlug.

Because Quarto provides a lot of functionality through integration with existing plugins, some of those have to be told about the existence of quarto-nvim (like e.g. registering it as a source for the autocompletion plugin nvim-cmp).

As such, we recommend you to experiment with the quarto-nvim kickstarter configuration and then pick the relevant parts from the lua/plugins/quarto.lua file to integrate it into your own existing configuration.

Plugins and their configuration to look out for in this file are:

{
    'quarto-dev/quarto-nvim',
    'jmbuhr/otter.nvim',
    'hrsh7th/nvim-cmp',
    'neovim/nvim-lspconfig',
    'nvim-treesitter/nvim-treesitter'
}

Quarto-nvim requires Neovim >= v0.9.0 (https://github.com/neovim/neovim/releases/tag/stable). If you are unable to update Neovim, you can specify a specific version of the plugins involved instead of the latest stable version. How you do this will vary depending on your plugin manager, but you can see one example using lazy.nvim here: https://github.com/jmbuhr/quarto-nvim-kickstarter/blob/nvim-0.8.3/lua/plugins/quarto.lua

The version = ... lines to look out for are for the following plugins:

{
    'quarto-dev/quarto-nvim',
    'jmbuhr/otter.nvim',
    'nvim-treesitter/nvim-treesitter'
}

Usage

Configure

You can pass a lua table with options to the setup function as shown in quarto-nvim-kickstarter/..quarto.lua

It will be merged with the default options, which are shown below in the example. If you want to use the defaults, simply call setup without arguments or with an empty table.

require'quarto'.setup{
  debug = false,
  closePreviewOnExit = true,
  lspFeatures = {
    enabled = true,
    languages = { 'r', 'python', 'julia', 'bash' },
    chunks = 'curly', -- 'curly' or 'all'
    diagnostics = {
      enabled = true,
      triggers = { "BufWritePost" }
    },
    completion = {
      enabled = true,
    },
  },
  keymap = {
    hover = 'K',
    definition = 'gd',
    rename = '<leader>lR',
    references = 'gr',
  }
}

Preview

Use the command

QuartoPreview

or access the function from lua, e.g. to create a keybinding:

local quarto = require'quarto'
quarto.setup()
vim.keymap.set('n', '<leader>qp', quarto.quartoPreview, {silent = true, noremap = true})

Then use the keyboard shortcut to open quarto preview for the current file or project in the active working directory in the neovim integrated terminal in a new tab.

Note: While you can use QuartoPreview without configuring the plugin via quarto.setup, other features strictly require it.

Language support

Demo

demo.mp4

Usage

With the language features enabled, you can open the hover documentation for R, python and julia code chunks with K (or configure a different shortcut). You can got-to-definition with gd.

Autocompletion

quarto-nvim now comes with a completion source for nvim-cmp to deliver swift autocompletion for code in quarto code chunks. With the quarto language features enabled, you can add the source in your cmp configuration:

-- ...
  sources = {
    { name = 'otter' },
  }
-- ...

R diagnostics configuration

To make diagnostics work with R you have to configure the linter a bit, since the language buffers in the background separate code with blank links, which we want to ignore. Otherwise you get a lot more diagnostics than you probably want. Add file .lintr to your home folder and fill it with:

linters: linters_with_defaults(
    trailing_blank_lines_linter = NULL,
    trailing_whitespace_linter = NULL
  )

You can now also enable other lsp features, such as the show hover function and shortcut, independent of showing diagnostics by enabling lsp features but not enabling diagnostics.

Other edgecases

Other languages might have similar issues (e.g. I see a lot of warnings about whitespace when activating diagnostics with lua). If you come across them and have a fix, I will be very happy about a pull request! Or, what might ultimately be the cleaner way of documenting language specific issues, an entry in the wiki.

Available Commnds

QuartoPreview
QuartoClosePreview
QuartoHelp <..>
QuartoActivate
QuartoDiagnostics
QuartoHover
QuartoSendAbove
QuartoSendAll

Recommended Plugins

Quarto works great with a number of existing plugins in the neovim ecosystem. You can find semi-opinionated but still minimal configurations for nvim and tmux, for use with Quarto, R and python in these two repositories: