From 989886a936dd51bf158cf4243b86db66685d8c38 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 31 Jan 2023 10:06:55 +0100 Subject: [PATCH] nvim: Replace slime et al with magma So far, my repl integration consisted of vim-slime and vim-ipython-cell. I am basically purely working in the python repl for now and while the two plugins (together with tmux) *worked* they didn't work well enough that I used them in an extensive way. Just as often as I could make use of their productivity enhacements, I had to wrangle with the plugins themselves to get what I wanted out of them. Hence the switch to magma. It integrates more deeply into python, and neovim both - showing cell outputs in floating windows and so on. It does not, on its own, recognize e.g. jupyter cells or quarto code cells, so I have set up some simple key binds to improve inter-operability between those. Especially [r and ]r to jump between quarto cells and R to execute the contents of the cell the cursor is currently in may be of interest. They are fairly crude and probably have edge cases where they will not work but until then they provide an easy quality of life improvement. Lastly, I silently added a plugin for markdown previews (that also scrolls with the editing cursor). I don't foresee myself using it *too* often but it might come handy for smaller articles and writing. It can be invoked with mp - a binding which I will no doubt also have to overhaul at some point. --- nvim/.config/nvim/lua/maps.lua | 34 ++++++++-------- nvim/.config/nvim/lua/plugins.lua | 66 +++++++++++++------------------ 2 files changed, 46 insertions(+), 54 deletions(-) diff --git a/nvim/.config/nvim/lua/maps.lua b/nvim/.config/nvim/lua/maps.lua index 5b43433..06d0b24 100644 --- a/nvim/.config/nvim/lua/maps.lua +++ b/nvim/.config/nvim/lua/maps.lua @@ -178,12 +178,13 @@ vim.g.nv_fzf_binds = { map.n.nore['n'] = ':NV' map.n.nore['N'] = ':NV!' --- Mostly dealing with Prose writing from here on out -- Format current Paragraph (esp useful in prose writing) map.n.nore.silent['q'] = 'gqap' map.x.nore.silent['q'] = 'gq' map.n.nore.silent['Q'] = 'vapJgqap' +map.n.silent['mp'] = 'MarkdownPreviewToggle' + -- FORMAT code with -- PLUGIN: formatter.nvim map.n.nore.silent['f'] = ':FormatLock' @@ -248,21 +249,22 @@ map.n.nore['ww'] = [[:lua require 'zettelkasten'.index_open() ]] -- create a lazygit window, set up in toggleterm settings map.n.nore['G'] = ':Lazygit' --- PLUGIN: slime and ipython-cell --- send line / region, not adhering to cells -map.n['cs'] = 'SlimeLineSend' -map.x['cs'] = 'SlimeRegionSend' --- send complete script to repl / benchmark execution -map.n.nore['cr'] = ':IPythonCellRun' -map.n.nore['cR'] = ':IPythonCellRunTime' --- send current cell / send and go to next -map.n.nore['cc'] = ':IPythonCellExecuteCellVerbose' -map.n.nore['C'] = ':IPythonCellExecuteCellVerboseJump' --- clear ipython repl -map.n.nore['cl'] = ':IPythonCellClear' --- jump to previous/ next cell -map.n.nore[']c'] = ':IPythonCellNextCell' -map.n.nore['[c'] = ':IPythonCellPrevCell' +-- PLUGIN: magma-nvim +-- Operate jupyter notebooks from within vim +map.n.nore.silent['rr'] = ':MagmaEvaluateLine' +map.n.nore.silent['R'] = '?^```{jV/```k:MagmaEvaluateVisual' +map.x.nore.silent['r'] = ':MagmaEvaluateVisual' +map.n.nore.expr.silent['r'] = "nvim_exec('MagmaEvaluateOperator', v:true)" +map.n.nore.silent['re'] = ':MagmaReevaluateCell' +map.n.nore.silent['ro'] = ':MagmaShowOutput' +map.n.nore.silent['rq'] = ':noautocmd :MagmaEnterOutput' +map.n.nore.silent['rc'] = ':MagmaDelete' +map.n.nore.silent['rd'] = ':MagmaInterrupt' + +map.n.nore.silent['rO'] = ':lua vim.g.magma_automatically_open_output = not(vim.g.magma_automatically_open_output)' +-- jump to beginning of previous/ next cell code +map.n.nore[']r'] = '/^```{}:nohl' +map.n.nore['[r'] = '?^```n}:nohl' -- insert cell header above/below map.n.nore['cO'] = ':IPythonCellInsertAbovea' map.n.nore['co'] = ':IPythonCellInsertBelowa' diff --git a/nvim/.config/nvim/lua/plugins.lua b/nvim/.config/nvim/lua/plugins.lua index 868ce6e..028aa7d 100644 --- a/nvim/.config/nvim/lua/plugins.lua +++ b/nvim/.config/nvim/lua/plugins.lua @@ -1,7 +1,7 @@ local ensure_packer = function() local fn = vim.fn local install_path = fn.stdpath('data') .. - '/site/pack/packer/start/packer.nvim' + '/site/pack/packer/start/packer.nvim' if fn.empty(fn.glob(install_path)) > 0 then fn.system({ 'git', 'clone', '--depth', '1', @@ -16,11 +16,11 @@ end local packer_bootstrap = ensure_packer() -- Compile on plugin edits -vim.api.nvim_create_autocmd({"BufWritePost"}, { +vim.api.nvim_create_autocmd({ "BufWritePost" }, { pattern = "plugins.lua", command = "PackerCompile", desc = "Compile plugins after editing plugin list", - group = vim.api.nvim_create_augroup('compilepackages', {clear = true}) + group = vim.api.nvim_create_augroup('compilepackages', { clear = true }) }) local use = require("packer").use @@ -42,7 +42,7 @@ require("packer").startup(function() use 'vifm/vifm.vim' -- integrate file manager use { 'lewis6991/gitsigns.nvim', -- show vcs changes on left-hand gutter - requires = {'nvim-lua/plenary.nvim'}, + requires = { 'nvim-lua/plenary.nvim' }, tag = 'release', config = function() require('plug._gitsigns') end, event = "BufRead" @@ -98,52 +98,42 @@ require("packer").startup(function() -- statusline use { 'nvim-lualine/lualine.nvim', - requires = {'kyazdani42/nvim-web-devicons', opt = true}, + requires = { 'kyazdani42/nvim-web-devicons', opt = true }, config = function() require('plug._lualine') end } -- writing - use {'vim-pandoc/vim-pandoc-syntax'} - use {'vim-pandoc/vim-pandoc'} - use {'vim-pandoc/vim-criticmarkup'} + use { 'vim-pandoc/vim-pandoc-syntax' } + use { 'vim-pandoc/vim-pandoc' } + use { 'vim-pandoc/vim-criticmarkup' } use { "quarto-dev/quarto-vim", - requires = {{"vim-pandoc/vim-pandoc-syntax"}}, - ft = {"quarto"} + requires = { { "vim-pandoc/vim-pandoc-syntax" } }, + ft = { "quarto" } } use 'micarmst/vim-spellsync' -- personal dict improvements for git sync - use {'folke/zen-mode.nvim', config = require('zen-mode').setup()} -- provide distraction free writing + use { 'folke/zen-mode.nvim', config = require('zen-mode').setup() } -- provide distraction free writing use 'folke/twilight.nvim' -- provide even distraction free-er writing (lowlight paragraphs) use 'alok/notational-fzf-vim' -- quickly search through the wiki + use({ + "iamcco/markdown-preview.nvim", -- generate an auto-updating html preview for md files + run = function() vim.fn["mkdp#util#install"]() end + }) -- languages - use {'euclidianAce/BetterLua.vim', ft = 'lua'} -- better syntax highlighting for lua + use { 'euclidianAce/BetterLua.vim', ft = 'lua' } -- better syntax highlighting for lua use 'aliou/bats.vim' -- enable syntax for bats shell-code testing library -- REPL work use { - 'jpalardy/vim-slime', -- send arbitrary code chunks to REPLs + 'WhiteBlackGoose/magma-nvim-goose', + run = ":UpdateRemotePlugins", config = function() - vim.g.slime_target = 'tmux' - vim.g.slime_paste_file = vim.fn.tempname() - vim.g.slime_default_config = { - socket_name = "default", - target_pane = "{last}" - } - vim.g.slime_python_ipython = 1 - vim.g.slime_no_mappings = 1 - end - } - use { - 'hanschen/vim-ipython-cell', -- send code 'cells' to REPL - ft = "python", - config = function() - vim.g.ipython_cell_highlight_cells_ft = {'python'} - vim.g.ipython_cell_insert_tag = "## Cell" + vim.g.magma_image_provider = "kitty" + vim.g.magma_automatically_open_output = false end } - -- -- nvim plugs use { 'echasnovski/mini.nvim', @@ -173,19 +163,19 @@ require("packer").startup(function() use { "nvim-telescope/telescope.nvim", requires = { - {"nvim-lua/popup.nvim"}, {"nvim-lua/plenary.nvim"}, - {"nvim-telescope/telescope-fzf-native.nvim", run = 'make'} + { "nvim-lua/popup.nvim" }, { "nvim-lua/plenary.nvim" }, + { "nvim-telescope/telescope-fzf-native.nvim", run = 'make' } }, config = function() require('plug._telescope') end } use { 'protex/better-digraphs.nvim', - requires = {{"nvim-telescope/telescope.nvim"}} + requires = { { "nvim-telescope/telescope.nvim" } } } -- snippeting - use {"hrsh7th/vim-vsnip", event = "InsertEnter"} -- snippet engine - use {"rafamadriz/friendly-snippets", event = "InsertEnter"} -- many snippets + use { "hrsh7th/vim-vsnip", event = "InsertEnter" } -- snippet engine + use { "rafamadriz/friendly-snippets", event = "InsertEnter" } -- many snippets -- treesitter use { @@ -198,7 +188,7 @@ require("packer").startup(function() use { 'RRethy/nvim-treesitter-textsubjects', -- allows using . and ; to target treesitter branches config = function() - require'nvim-treesitter.configs'.setup { + require 'nvim-treesitter.configs'.setup { textsubjects = { enable = true, keymaps = { @@ -225,7 +215,7 @@ require("packer").startup(function() use 'ray-x/lsp_signature.nvim' use { 'ray-x/navigator.lua', - requires = {'ray-x/guihua.lua', run = 'cd lua/fzy && make'}, + requires = { 'ray-x/guihua.lua', run = 'cd lua/fzy && make' }, config = function() require('plug._lsp') end } -- and completion @@ -241,7 +231,7 @@ require("packer").startup(function() } use { 'aspeddro/cmp-pandoc.nvim', - requires = {'nvim-lua/plenary.nvim', 'jbyuki/nabla.nvim'} + requires = { 'nvim-lua/plenary.nvim', 'jbyuki/nabla.nvim' } } require('plug._cmp')