From 7128edc57c305cdcd27e364b0270d8f04b9620b8 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Wed, 1 Mar 2023 17:39:03 +0100 Subject: [PATCH] nvim: Add quarto filetype setup --- nvim/.config/nvim/after/ftplugin/quarto.lua | 94 +++++++++++++++++++++ nvim/.config/nvim/lua/maps.lua | 27 ------ nvim/.config/nvim/lua/plugins.lua | 15 +++- 3 files changed, 108 insertions(+), 28 deletions(-) create mode 100644 nvim/.config/nvim/after/ftplugin/quarto.lua diff --git a/nvim/.config/nvim/after/ftplugin/quarto.lua b/nvim/.config/nvim/after/ftplugin/quarto.lua new file mode 100644 index 0000000..cbe7b57 --- /dev/null +++ b/nvim/.config/nvim/after/ftplugin/quarto.lua @@ -0,0 +1,94 @@ +-- Start quarto session +local startsession = function(file, args) + file = file or "/tmp/jupyter-magma-session.json" + if args then file = args[0] end + vim.fn.jobstart({ "jupyter", "console", "-f", file }, { + on_stdout = function(_) + vim.cmd("MagmaInit " .. file) + vim.cmd("JupyterAttach " .. file) + end, + on_exit = function(_) + vim.notify(string.format("jupyter kernel stopped: %s", file), vim.log.levels.INFO) + end, + stdin = nil + }) +end +vim.api.nvim_create_user_command("JupyterStart", function() startsession() end, + {}) + +local map = vim.keymap.set +-- filetype mappings +-- PLUGIN: magma-nvim +-- Operate jupyter notebooks from within vim +map('n', 'cc', ':MagmaEvaluateLine', { silent = true }) +map('n', 'C', '?^```{jV/```k:MagmaEvaluateVisual', + { silent = true, desc = 'Evaluate current code cell' }) +map('x', 'c', ':MagmaEvaluateVisual', { silent = true }) +map('n', 'c', "nvim_exec('MagmaEvaluateOperator', v:true)", + { expr = true, silent = true, desc = '+code-evaluation' }) +map('n', 'cr', ':MagmaReevaluateCell', { silent = true }) +map('n', 'cu', ':MagmaShowOutput', { silent = true }) +map('n', 'cU', ':noautocmd :MagmaEnterOutput', + { silent = true, desc = 'MagmaEnterOutput' }) +map('n', 'cd', ':MagmaDelete', { silent = true }) +map('n', 'cs', ':MagmaInterrupt') +map('n', 'ci', ':MagmaInit ') +map('n', 'cD', ':MagmaDeinit') +map('n', 'cR', ':MagmaRestart') + +-- jump to beginning of previous/ next cell code +map('n', ']c', '/^```{}:nohl', { desc = 'Next quarto cell' }) +map('n', '[c', '?^```n}:nohl', { desc = 'Previous quarto cell' }) +-- insert cell header above/below +map('n', 'co', 'o```{python}```k', + { desc = 'Insert quarto cell below' }) +map('n', 'cO', 'O```{python}```k', + { desc = 'Insert quarto cell above' }) + +local bufnr = 0 +map('n', '[d', 'lua vim.diagnostic.goto_prev()', + { buffer = bufnr, desc = 'Previous diagnostic' }) +map('n', ']d', 'lua vim.diagnostic.goto_next()', + { buffer = bufnr, desc = 'Next diagnostic' }) +map('n', '[e', + 'lua vim.diagnostic.goto_prev({severity = vim.diagnostic.severity.ERROR})', + { buffer = bufnr, desc = 'Previous error' }) +map('n', ']e', + 'lua vim.diagnostic.goto_next({severity = vim.diagnostic.severity.ERROR})', + { buffer = bufnr, desc = 'Next error' }) + +-- TODO find better way to enable lsp key mappings for quarto buffers +local prefix = require('which-key').register +prefix({ ['l'] = { name = "+lsp" } }) +map('n', 'li', 'LspInfo', + { buffer = bufnr, desc = 'Lsp Info' }) +map('n', 'ld', 'lua vim.diagnostic.open_float()', + { buffer = bufnr, desc = 'Line diagnostics' }) +map('n', 'la', 'lua vim.lsp.buf.code_action()', + { buffer = bufnr, desc = 'Codeactions' }) +map('n', 'ln', 'lua vim.lsp.buf.rename()', + { buffer = bufnr, desc = 'Rename element' }) +map('n', 'lr', 'lua vim.lsp.buf.references()', + { buffer = bufnr, desc = 'References' }) +if client and client.server_capabilities.document_formatting then + map('n', 'lf', "lua vim.lsp.buf.formatting()", + { buffer = bufnr, desc = 'Format document' }) +end + +map('n', 'K', 'lua vim.lsp.buf.hover()', + { buffer = bufnr, desc = 'Hover definition' }) +map('n', 'gd', 'lua vim.lsp.buf.definition()', + { buffer = bufnr, desc = 'Definition' }) +map('n', 'gD', 'lua vim.lsp.buf.declaration()', + { buffer = bufnr, desc = 'Declaration' }) +map('n', 'gs', 'lua vim.lsp.buf.signature_help()', + { buffer = bufnr, desc = 'Signature help' }) +map('n', 'gI', 'lua vim.lsp.buf.implementation()', + { buffer = bufnr, desc = 'Implementation' }) +map('n', 'gt', 'lua vim.lsp.buf.type_definition()', + { buffer = bufnr, desc = 'Type definition' }) + +if vim.b['sessionfile'] == nil then + vim.b['sessionfile'] = vim.fn.tempname() .. '.json' + startsession(vim.b['sessionfile']) +end diff --git a/nvim/.config/nvim/lua/maps.lua b/nvim/.config/nvim/lua/maps.lua index 171fee2..2980bea 100644 --- a/nvim/.config/nvim/lua/maps.lua +++ b/nvim/.config/nvim/lua/maps.lua @@ -240,30 +240,3 @@ map('n', 'ww', [[:lua require 'zettelkasten'.index_open() ]], -- PLUGIN: toggleterm.nvim -- create a lazygit window, set up in toggleterm settings map('n', 'G', ':Lazygit') - --- PLUGIN: magma-nvim --- Operate jupyter notebooks from within vim -map('n', 'mm', ':MagmaEvaluateLine', { silent = true }) -map('n', 'M', '?^```{jV/```k:MagmaEvaluateVisual', - { silent = true, desc = 'Evaluate current quarto cell' }) -map('x', 'm', ':MagmaEvaluateVisual', { silent = true }) -map('n', 'm', "nvim_exec('MagmaEvaluateOperator', v:true)", - { expr = true, silent = true }) -map('n', 'mr', ':MagmaReevaluateCell', { silent = true }) -map('n', 'ma', ':MagmaShowOutput', { silent = true }) -map('n', 'mq', ':noautocmd :MagmaEnterOutput', - { silent = true, desc = 'MagmaEnterOutput' }) -map('n', 'md', ':MagmaDelete', { silent = true }) -map('n', 'ms', ':MagmaInterrupt') -map('n', 'mI', ':MagmaInit ') -map('n', 'mD', ':MagmaDeinit') -map('n', 'mR', ':MagmaRestart') - --- jump to beginning of previous/ next cell code -map('n', ']c', '/^```{}:nohl', { desc = 'Next quarto cell' }) -map('n', '[c', '?^```n}:nohl', { desc = 'Previous quarto cell' }) --- insert cell header above/below -map('n', 'mo', 'o```{python}```k', - { desc = 'Insert quarto cell below' }) -map('n', 'mO', 'O```{python}```k', - { desc = 'Insert quarto cell above' }) diff --git a/nvim/.config/nvim/lua/plugins.lua b/nvim/.config/nvim/lua/plugins.lua index c97931d..8ea66fe 100644 --- a/nvim/.config/nvim/lua/plugins.lua +++ b/nvim/.config/nvim/lua/plugins.lua @@ -87,6 +87,18 @@ return { } end, ft = "quarto" +}, { + "lkhphuc/jupyter-kernel.nvim", + config = true, + cmd = "JupyterAttach", + build = ":UpdateRemotePlugins", + keys = { + { + "ck", + "JupyterInspect", + desc = "Inspect object in kernel" + } + } }, { 'micarmst/vim-spellsync', event = "VeryLazy" }, -- personal dict improvements for git sync { 'folke/zen-mode.nvim', config = true, event = "VeryLazy" }, -- provide distraction free writing { 'folke/twilight.nvim', event = "VeryLazy" }, -- provide even distraction free-er writing (lowlight paragraphs) @@ -137,7 +149,8 @@ return { 'nvim-treesitter/nvim-treesitter', build = ':TSUpdate', config = function() require('plug._treesitter') end - }, { 'nvim-treesitter/playground', cmd = "TSPlaygroundToggle" }, -- interactively view and query the treesitter tree + }, + { 'nvim-treesitter/playground', cmd = "TSPlaygroundToggle" }, -- interactively view and query the treesitter tree { 'romgrk/nvim-treesitter-context', event = "BufReadPre", config = true }, -- show current cursor context at top of buffer { 'RRethy/nvim-treesitter-textsubjects', -- allows using . and ; to target treesitter branches