dotfiles/nvim/.config/nvim/lua/plugins/data_analysis.lua
Marty Oehme ff2ae79878
nvim: Move to image.nvim fork which works with typst
Though ostensibly compatible with typst, there is a show-stopping issue
with the main image.nvim fork which means an error message whenever
there is more than one typst buffer open (e.g. two side-by-side, or
opening a fzf-lua windows with typst previews, and so on).

Until that is fixed, use this fork. Issue here: https://github.com/3rd/image.nvim/pull/280
2025-03-19 21:30:02 +01:00

255 lines
7.6 KiB
Lua

return {
{
"jmbuhr/otter.nvim",
config = function()
require("otter").setup({
buffers = {
set_filetype = true,
write_to_disk = false,
},
})
end,
},
{
"quarto-dev/quarto-nvim",
dependencies = {
"jmbuhr/otter.nvim",
"neovim/nvim-lspconfig",
"nvim-treesitter/nvim-treesitter",
{ "benlubas/molten-nvim", optional = true },
},
config = function()
require("core.util").set_python_env()
require("quarto").setup({
lspFeatures = {
enabled = true,
languages = { "r", "python", "julia", "bash" },
},
codeRunner = {
enabled = true,
default_method = "slime",
ft_runners = {
python = "molten",
quarto = "molten",
},
},
})
local map = vim.keymap.set
map("n", "<localleader>C", require("quarto.runner").run_cell, { desc = "run cell" })
map("n", "<localleader>ca", require("quarto.runner").run_above, { desc = "run cells above" })
map("n", "<localleader>cb", require("quarto.runner").run_below, { desc = "run cells below" })
map("n", "<localleader>cA", require("quarto.runner").run_all, { desc = "run all similar cells" })
-- TODO: overwritten by other moves, i.e. comment?
map("n", "]c", "/^```{<cr>}:nohl<cr>", { desc = "Codecell forward" })
map("n", "[c", "?^```<cr>n}:nohl<cr>", { desc = "Codecell last" })
map("n", "<localleader>co", "o```{python}<cr><cr>```<esc>k", { desc = "Insert code cell below" })
map("n", "<localleader>cO", "O```{python}<cr><cr>```<esc>k", { desc = "Insert code cell above" })
if require("core.util").is_available("which-key") then
require("which-key").add({ "<localleader>c", group = "codecells" })
end
end,
ft = { "quarto" },
},
-- image display
{
-- "3rd/image.nvim", -- using Fork until https://github.com/3rd/image.nvim/pull/280 is merged
"UnaTried/image.nvim",
name = "image.nvim",
version = false,
dependencies = {
{ "leafo/magick" }, -- luarock, ensure global luarock51 dependency
{ "nvim-treesitter/nvim-treesitter", optional = true },
},
opts = {
backend = "kitty",
editor_only_render_when_focused = true,
-- TODO: Check that this works without TS md parser, norg or typst installed
-- If errors go back to commit before 87691932 when this check was still here
integrations = {
markdown = {
only_render_image_at_cursor = true,
filetypes = { "markdown", "vimwiki", "quarto" },
},
neorg = { only_render_image_at_cursor = true },
typst = { only_render_image_at_cursor = true },
},
},
config = function(_, opts)
require("image").setup(opts)
-- if Molten is running, we directly inject the option
if vim.fn.exists("MoltenDeinit") > 0 then
pcall(vim.fn.MoltenUpdateOption, "molten_image_provider", "image.nvim")
else
vim.g.molten_image_provider = "image.nvim"
end
vim.keymap.set("n", "<localleader>pi", function()
for k, v in pairs(opts.integrations) do
if v["only_render_image_at_cursor"] ~= nil then
v["only_render_image_at_cursor"] = not v["only_render_image_at_cursor"]
end
print(k, v)
end
require("image").setup(opts)
end, { desc = "toggle image rendering", silent = true })
end,
ft = { "markdown", "vimwiki", "quarto", "norg", "typst", "python" },
priority = 60,
},
-- REPL work
{
"benlubas/molten-nvim",
dependencies = {
{ "willothy/wezterm.nvim", config = true },
{ "image.nvim", optional = true },
},
build = ":UpdateRemotePlugins",
init = function()
vim.g.molten_image_provider = vim.g.molten_image_provider or "wezterm"
vim.g.molten_auto_open_output = false
vim.g.molten_virt_text_output = true
if vim.fn.has("nvim-0.10") then
vim.g.molten_output_show_more = true
end
vim.api.nvim_create_autocmd("User", {
pattern = "MoltenInitPost",
callback = function()
local map = vim.keymap.set
if require("core.util").is_available("which-key") then
require("which-key").add({ "<localleader>c", group = "codecells" })
end
-- Operate jupyter notebooks from within vim
map(
"n",
"<localleader>cc",
":MoltenEvaluateOperator<cr>",
{ desc = "evaluate operator", silent = true }
)
map("n", "<localleader>cl", ":MoltenEvaluateLine<cr>", { desc = "evaluate line", silent = true })
map(
"x",
"<localleader>c",
":<C-u>MoltenEvaluateVisual<cr>gv",
{ desc = "evaluate visual", silent = true }
)
map(
"n",
"<localleader>cr",
":MoltenReevaluateCell<cr>",
{ desc = "reevaluate cell", silent = true }
)
map(
"n",
"<localleader>cp",
":noautocmd :MoltenEnterOutput<cr>",
{ silent = true, desc = "show output" }
)
map("n", "<localleader>cx", function()
vim.cmd("MoltenHideOutput")
vim.cmd("MoltenDelete")
end, { silent = true, desc = "hide output" })
map("n", "<localleader>ci", ":MoltenImagePopup<cr>", { silent = true, desc = "open image" })
map("n", "<localleader>cI", ":MoltenInterrupt<cr>", { desc = "interrupt cell", silent = true })
map("n", "<localleader>cD", ":MoltenDeinit<cr>", { desc = "de-init molten", silent = true })
map("n", "<localleader>cR", ":MoltenRestart<cr>", { desc = "restart molten", silent = true })
-- FIXME: Works for toggling TO virt text but not back
local function toggle_virtual_text_output()
if vim.g.molten_virt_text_output then
vim.fn.MoltenUpdateOption("molten_virt_text_output", false)
return
end
vim.fn.MoltenUpdateOption("molten_virt_text_output", true)
end
map(
"n",
"<localleader>cV",
toggle_virtual_text_output,
{ desc = "toggle virtual output", silent = true }
)
end,
})
vim.api.nvim_create_autocmd("User", {
pattern = "MoltenDeinitPost",
callback = function()
local unmap = require("core.util").unmap_key
unmap("<localleader>cc")
unmap("<localleader>cl")
unmap("<localleader>c", "x")
unmap("<localleader>cr")
unmap("<localleader>cR")
unmap("<localleader>cp")
unmap("<localleader>cP")
unmap("<localleader>co")
unmap("<localleader>cD")
unmap("<localleader>ci")
unmap("<localleader>cV")
local map = vim.keymap.set
map("n", "<localleader>cJ", ":JupyterStart<cr>", { desc = "start jupyter", silent = true })
end,
})
end,
ft = { "norg", "quarto", "python" },
keys = {
{ "<leader>vn", ":MoltenInfo<cr>" },
},
},
-- Edit code blocks in md/quarto using whatever language is
{
"AckslD/nvim-FeMaco.lua",
cmd = { "FeMaco" },
ft = { "markdown", "rmd", "quarto" },
opts = {
ensure_newline = function(base_ft)
if base_ft == "quarto" or base_ft == "markdown" then
return true
end
return false
end,
},
config = function(_, opts)
vim.keymap.set("n", "<localleader>ce", ":FeMaco<cr>", { desc = "edit codecell" })
require("femaco").setup(opts)
end,
dependencies = {
"nvim-treesitter/nvim-treesitter",
},
},
-- MARKDOWN ONLY
-- Evaluate markdown code blocks
{ -- TODO: Have results appear as virtual text instead of real text?
"jubnzv/mdeval.nvim",
cmd = { "MdEval" },
ft = { "markdown" },
opts = {
require_confirmation = false,
eval_options = {},
},
},
-- Open ipynb Jupyter notebooks as if they're quarto files
-- requires jupytext to be installed
{
"GCBallesteros/jupytext.nvim",
opts = {
style = "light",
custom_language_formatting = {
python = {
extension = "qmd",
style = "quarto",
force_ft = "quarto",
},
r = {
extension = "qmd",
style = "quarto",
force_ft = "quarto",
},
},
},
cond = vim.fn.executable("jupytext") == 1, -- only runs if jupytext installed
lazy = false, -- does not work in lazy mode
},
}