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
255 lines
7.6 KiB
Lua
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
|
|
},
|
|
}
|