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/lua/core/options.lua b/lua/core/options.lua index c71d027..eab4ffe 100644 --- a/lua/core/options.lua +++ b/lua/core/options.lua @@ -1,3 +1,7 @@ +-- Temporary setting needed to make otter working +-- https://github.com/jmbuhr/otter.nvim/issues/179 +vim.treesitter.language.register("markdown", { "quarto", "rmd" }) + -- Search and replace -- Ignore case except when using a capital case -- Highlight found occurrences 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/markdown/zotcite.lua b/lua/plugins/markdown/zotcite.lua deleted file mode 100644 index 5591884..0000000 --- a/lua/plugins/markdown/zotcite.lua +++ /dev/null @@ -1,25 +0,0 @@ --- Install and configure zotcite --- https://github.com/jalvesaq/zotcite - -return { - "jalvesaq/zotcite", - dependencies = { - "nvim-treesitter/nvim-treesitter", - -- Add completion for zotcite - "jalvesaq/cmp-zotcite", - }, - config = function () - require("zotcite").setup({ - -- waiting for zotcite options - }) - require("cmp_zotcite").setup({ - -- Add the pandoc filetype - filetypes = { - "pandoc", - "markdown", - "rmd", - "quarto", - } - }) - end -} diff --git a/lua/plugins/nvim-cmp.lua b/lua/plugins/nvim-cmp.lua index cfc9944..94115fc 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 +}