mirror of
https://github.com/LazyVim/LazyVim.git
synced 2026-07-25 14:01:06 +00:00
feat(extra): add slime to run code cells
This commit is contained in:
parent
cfbd358273
commit
a11a78683f
5 changed files with 160 additions and 0 deletions
127
lua/lazyvim/plugins/extras/repl/slime.lua
Normal file
127
lua/lazyvim/plugins/extras/repl/slime.lua
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
return {
|
||||
-- General vim repl code send
|
||||
{
|
||||
"jpalardy/vim-slime",
|
||||
init = function()
|
||||
vim.g.slime_no_mappings = 1
|
||||
vim.g.slime_bracketed_paste = 1
|
||||
vim.g.slime_target = "neovim"
|
||||
vim.g.slime_menu_config = true
|
||||
vim.api.nvim_create_user_command("SlimeTarget", function(opts)
|
||||
if opts.args ~= nil then
|
||||
vim.b.slime_target = opts.args
|
||||
vim.b.slime_config = nil
|
||||
else
|
||||
vim.b.slime_config = vim.g.slime_config
|
||||
vim.b.slime_target = vim.g.slime_target
|
||||
end
|
||||
vim.notify("Slime send target is: " .. vim.b.slime_target)
|
||||
end, { desc = "Change Slime target", nargs = 1 })
|
||||
end,
|
||||
cmd = { "SlimeConfig", "SlimeTarget" },
|
||||
keys = {
|
||||
{ "<S-CR>", "<Plug>SlimeRegionSend", mode = "x", desc = "Send Selection" },
|
||||
{ "<S-CR>", "<Plug>SlimeMotionSend", mode = "n", desc = "Send Textobject" },
|
||||
{ "<leader>rr", "<Plug>SlimeMotionSend", mode = "n", desc = "Send Textobject (<S-CR>)" },
|
||||
{ "<S-CR><S-CR>", "<S-CR>ir]rj", mode = "n", remap = true, desc = "Send Cell and Jump Next" },
|
||||
{ "<leader>rC", "<Cmd>SlimeConfig<CR>", desc = "Slime Run Config" },
|
||||
{ "<leader>rT", "<Cmd>SlimeTarget<CR>", desc = "Slime Run Target" },
|
||||
},
|
||||
},
|
||||
-- Separator overlay on cell marker & metadata
|
||||
{
|
||||
"echasnovski/mini.hipatterns",
|
||||
optional = true,
|
||||
opts = function(_, opts)
|
||||
local censor_extmark_opts = function(buf_id, match, data)
|
||||
local mask = string.rep("⎯", vim.api.nvim_win_get_width(0))
|
||||
return {
|
||||
virt_text = { { mask, "SignColumn" } },
|
||||
virt_text_pos = "overlay",
|
||||
virt_text_hide = true,
|
||||
priority = 200,
|
||||
right_gravity = false,
|
||||
}
|
||||
end
|
||||
opts.highlighters["cell_marker"] = {
|
||||
pattern = function(bufid)
|
||||
local cmt_str = vim.api.nvim_get_option_value("commentstring", { buf = bufid })
|
||||
return "^" .. string.gsub(cmt_str, [[%s]], "") .. [[*%%.*]]
|
||||
end,
|
||||
group = "",
|
||||
extmark_opts = censor_extmark_opts,
|
||||
}
|
||||
end,
|
||||
},
|
||||
-- Define code cell object `ir`, `ar`
|
||||
{
|
||||
"echasnovski/mini.ai",
|
||||
opts = {
|
||||
custom_textobjects = {
|
||||
r = function(ai_mode, _, _)
|
||||
local buf_nlines = vim.api.nvim_buf_line_count(0)
|
||||
local cell_markers = {}
|
||||
for line_no = 1, buf_nlines do
|
||||
local line = vim.fn.getline(line_no)
|
||||
if line:match("^# *%%%%") then
|
||||
table.insert(cell_markers, line_no)
|
||||
end
|
||||
end
|
||||
table.insert(cell_markers, 1, 0) -- Beginning
|
||||
table.insert(cell_markers, #cell_markers + 1, buf_nlines + 1)
|
||||
|
||||
local regions = {}
|
||||
for i = 1, #cell_markers - 1 do
|
||||
local from_line, to_line
|
||||
if ai_mode == "i" then
|
||||
from_line = cell_markers[i] + 1
|
||||
to_line = cell_markers[i + 1] - 1
|
||||
else
|
||||
from_line = math.max(cell_markers[i], 1)
|
||||
to_line = cell_markers[i + 1] - 1
|
||||
end
|
||||
-- for `around cell` on empty line select previous cell
|
||||
local to_line_len = vim.fn.getline(to_line):len() + 1
|
||||
table.insert(regions, {
|
||||
from = { line = from_line, col = 1 },
|
||||
to = { line = to_line, col = to_line_len },
|
||||
})
|
||||
end
|
||||
return regions
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
-- Mapping for moving between cell `]r`, `[r`
|
||||
-- defined in query/python/textobjects.scm
|
||||
{
|
||||
"nvim-treesitter",
|
||||
opts = {
|
||||
textobjects = {
|
||||
move = {
|
||||
goto_next_start = { ["]r"] = "@cell.marker" },
|
||||
goto_previous_start = { ["[r"] = "@cell.marker" },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"lualine.nvim",
|
||||
opts = function(_, opts)
|
||||
table.insert(opts.sections.lualine_y, {
|
||||
function()
|
||||
-- show terminal jobid if in a Slime connected buffer
|
||||
if vim.b.slime_config and vim.b.slime_config.jobid then
|
||||
return " " .. vim.b.slime_config.jobid
|
||||
-- or if cursor focus on a terminal buffer
|
||||
elseif vim.o.buftype == "terminal" then
|
||||
return " " .. vim.o.channel
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end,
|
||||
color = LazyVim.ui.fg("Constant"),
|
||||
})
|
||||
end,
|
||||
},
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ local Config = require("lazyvim.config")
|
|||
local prios = {
|
||||
["lazyvim.plugins.extras.editor.aerial"] = 100,
|
||||
["lazyvim.plugins.extras.editor.outline"] = 100,
|
||||
["lazyvim.plugins.extras.repl.slime"] = 100,
|
||||
["lazyvim.plugins.extras.test.core"] = 1,
|
||||
["lazyvim.plugins.extras.dap.core"] = 1,
|
||||
}
|
||||
|
|
|
|||
10
queries/python/highlights.scm
Normal file
10
queries/python/highlights.scm
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
;; extends
|
||||
|
||||
; Set highlight to @variable so it appears similar to plaintext in .md
|
||||
; otherwise will be highlighted as @string
|
||||
; # %% [markdown] cell
|
||||
((
|
||||
(comment) @_cell.marker.md
|
||||
. (expression_statement
|
||||
(string (string_content) @variable)))
|
||||
(#lua-match? @_cell.marker.md "^# %%%% %[markdown%]"))
|
||||
16
queries/python/injections.scm
Normal file
16
queries/python/injections.scm
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
;extends
|
||||
|
||||
; # %% [markdown]
|
||||
; """
|
||||
; This is markdown cell, with triple-quote multiline string
|
||||
; """
|
||||
((comment) @cell.marker
|
||||
. (expression_statement
|
||||
(string
|
||||
(string_start) @_comment_mark
|
||||
(string_content) @injection.content)
|
||||
)
|
||||
(#lua-match? @cell.marker "^# *%%%% *%[markdown%]")
|
||||
(#eq? @_comment_mark "\"\"\"")
|
||||
(#set! injection.language "markdown")
|
||||
)
|
||||
6
queries/python/textobjects.scm
Normal file
6
queries/python/textobjects.scm
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
; extends
|
||||
|
||||
; Code cells in percent format: # %%, #%% with any metadata
|
||||
((comment) @cell.marker
|
||||
(#lua-match? @cell.marker "^# *%%%%.*"))
|
||||
|
||||
Loading…
Add table
Reference in a new issue