From 455c17a81d858876dd8411bbbe0a3f1536ce152f Mon Sep 17 00:00:00 2001 From: iGor milhit Date: Fri, 4 Oct 2024 13:56:39 +0200 Subject: [PATCH] wip plugins: configure environment for quarto - Installs and configures the nvim-quarto plugin. - Adds needed plugins and configuration from diving in the quarto kickstart configuration, which is damn huge. - Adds the marksman parser for markdown, with its configuration. - Adds the quarto filetype to the pandoc pluging. - Loads the markdown snippets for the quarto filetype. - Adds language support for treesitter. - Sets folding based on treesitter method for quarto files. - Installs and configure vim-slime plugin in order to execute emmbedded code (but it doesn't work as it misses a LOT of configuration). - Documents very shortly the added plugins in the README. Co-Authored-by: iGor milhit --- README.md | 4 +++ after/ftplugin/quarto.lua | 2 ++ lua/plugins/lsp/mason.lua | 21 +++++++++++++++- lua/plugins/nvim-cmp.lua | 8 ++++-- lua/plugins/quarto.lua | 16 ++++++++++++ lua/plugins/treesitter.lua | 21 +++++++++------- lua/plugins/vim-slime.lua | 50 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 110 insertions(+), 12 deletions(-) create mode 100644 after/ftplugin/quarto.lua create mode 100644 lua/plugins/quarto.lua create mode 100644 lua/plugins/vim-slime.lua diff --git a/README.md b/README.md index 202c43b..2be2ff5 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,10 @@ I won't provide links for each of these plugins as they are easily to be found. - `rainbow-csv.nvim` to manage CSV files. - `venv-selector.nvim` to ease python virtual env. - `vim-grammalecte` to get a good grammar checker for French. +- Quarto: + - `nvim-quarto` to add quarto environment configuration. + - `otter` for the embedded code completion. + - `vim-slime` for the embedded code execution. diff --git a/after/ftplugin/quarto.lua b/after/ftplugin/quarto.lua new file mode 100644 index 0000000..0a060e7 --- /dev/null +++ b/after/ftplugin/quarto.lua @@ -0,0 +1,2 @@ +vim.opt.foldmethod = "expr" +vim.opt.foldexpr = "nvim_treesitter#foldexpr()" diff --git a/lua/plugins/lsp/mason.lua b/lua/plugins/lsp/mason.lua index ac2b820..37d68c7 100644 --- a/lua/plugins/lsp/mason.lua +++ b/lua/plugins/lsp/mason.lua @@ -17,6 +17,8 @@ return { -- Import lspconfig local lspconfig = require("lspconfig") + local util = require("lspconfig.util") + -- Import mason-tool-installer local mason_tool_installer = require("mason-tool-installer") @@ -51,6 +53,7 @@ return { "html", "jsonls", "lua_ls", + "marksman", "pylsp", "yamlls", }, @@ -105,7 +108,7 @@ return { end, jsonls = function() - lspconfig.lua_ls.setup({ + lspconfig.jsonls.setup({ settings = { json = { schemas = require("schemastore").json.schemas(), @@ -113,6 +116,22 @@ return { } } }) + end, + + marksman = function() + lspconfig.marksman.setup({ + setting = { + filetypes = { + "markdown", + "quarto", + }, + root_dir = util.root_pattern( + '.git', + '.marksman.toml', + '_quarto.yml' + ), + } + }) end }, }) diff --git a/lua/plugins/nvim-cmp.lua b/lua/plugins/nvim-cmp.lua index 4ff16ce..75fd02d 100644 --- a/lua/plugins/nvim-cmp.lua +++ b/lua/plugins/nvim-cmp.lua @@ -28,6 +28,9 @@ return { "hrsh7th/cmp-emoji", -- vs-code pictrograms "onsails/lspkind.nvim", + + -- Completion source for code emmbedded in other documents + "jmbuh/otter.nvim", }, -- Configure nvim-cmp @@ -40,16 +43,17 @@ return { luasnip.config.setup { -- Extend markdown snippets to pandoc filetype - -- https://github.com/L3MON4D3/LuaSnip/issues/132#issuecomment-1101710309 + -- https://github.com/L3MON4D3/LuaSnip/issues/132#issuecomment-1101731222 snippets = { markdown = {}, }, luasnip.filetype_extend("pandoc", {"markdown"}), + luasnip.filetype_extend("quarto", {"markdown"}), } -- Load snippets from ~/.config/nvim/my_snippets/ require("luasnip.loaders.from_lua").lazy_load( - {paths = "~/.config/nvim/my_snippets/"} + { paths = "~/.config/nvim/my_snippets/" } ) require("luasnip.loaders.from_vscode").lazy_load() diff --git a/lua/plugins/quarto.lua b/lua/plugins/quarto.lua new file mode 100644 index 0000000..39cbdc6 --- /dev/null +++ b/lua/plugins/quarto.lua @@ -0,0 +1,16 @@ +-- Install and configure `quarto-nvim` +-- https://github.com/quarto-dev/quarto-nvim + +return { + { + "quarto-dev/quarto-nvim", + lazy = true, + ft = { + "quarto", + }, + dependencies = { + "jmbuhr/otter.nvim", + "nvim-treesitter/nvim-treesitter", + }, + }, +} diff --git a/lua/plugins/treesitter.lua b/lua/plugins/treesitter.lua index fa606fc..1a2114b 100644 --- a/lua/plugins/treesitter.lua +++ b/lua/plugins/treesitter.lua @@ -39,6 +39,7 @@ return { -- Configure treesitter config = function() + ---@diagnostic disable-next-line: missing-fields local config = require("nvim-treesitter.configs") config.setup({ @@ -55,26 +56,28 @@ return { -- Installed and configured languages ensure_installed = { "bash", + "css", "dot", "gitignore", "html", + "javascript", "json", + "julia", "latex", "lua", + "markdown", + "markdown_inline", + "mermaid", + "norg", "python", + "query", + "r", + "typescript", "vim", + "vimdoc", "yaml", }, - -- Empty option, to avoid warning - modules = {}, - - -- List of parsers to ignore installing - ignore_install = { - "markdown", - "markdown_inline" - }, - -- Do not install parses synchronously sync_install = false, diff --git a/lua/plugins/vim-slime.lua b/lua/plugins/vim-slime.lua new file mode 100644 index 0000000..3258aed --- /dev/null +++ b/lua/plugins/vim-slime.lua @@ -0,0 +1,50 @@ +-- Install and configure vim-slime +-- https://github.com/jpalardy/vim-slime + +return { + 'jpalardy/vim-slime', + dev = false, + init = function() + vim.b['quarto_is_python_chunk'] = false + Quarto_is_in_python_chunk = function() + require('otter.tools.functions').is_otter_language_context 'python' + end + + vim.cmd [[ + let g:slime_dispatch_ipython_pause = 100 + function SlimeOverride_EscapeText_quarto(text) + call v:lua.Quarto_is_in_python_chunk() + if exists('g:slime_python_ipython') && len(split(a:text,"\n")) > 1 && b:quarto_is_python_chunk && !(exists('b:quarto_is_r_mode') && b:quarto_is_r_mode) + return ["%cpaste -q\n", g:slime_dispatch_ipython_pause, a:text, "--", "\n"] + else + if exists('b:quarto_is_r_mode') && b:quarto_is_r_mode && b:quarto_is_python_chunk + return [a:text, "\n"] + else + return [a:text] + end + end + endfunction + ]] + + vim.g.slime_target = 'neovim' + vim.g.slime_no_mappings = true + vim.g.slime_python_ipython = 1 + end, + config = function() + vim.g.slime_input_pid = false + vim.g.slime_suggest_default = true + vim.g.slime_menu_config = false + vim.g.slime_neovim_ignore_unlisted = true + + local function mark_terminal() + local job_id = vim.b.terminal_job_id + vim.print('job_id: ' .. job_id) + end + + local function set_terminal() + vim.fn.call('slime#config', {}) + end + vim.keymap.set('n', 'cm', mark_terminal, { desc = '[m]ark terminal' }) + vim.keymap.set('n', 'cs', set_terminal, { desc = '[s]et terminal' }) + end +}