This project includes two parts: a JupyterLab extension
and a Neovim plugin
JupyterLab extension
exposes functions of Jupyter lab
, and provides a remote procedure call(RPC) serviceNeovim plugin
calls the RPC service when it receives events from Neovim
via autocmd
proxy | direct |
---|---|
This project provides two working modes for different network environments. If the browser where your jupyiter lab is
located cannot directly access nvim, you must use proxy
mode; If you need to collaborate and use the same Jupyter with
others, you must use direct mode
proxy
mode: Jupyterlab server
proxies the RPC service as a TCP server which Neovim
s plugin connects todirect
mode: Neovim plugin accesses these RPC service directlyUltimately, Neopyter
can control Juppyter lab
. Neopyter
can implement abilities like jupynium.nvim.
Completion | Cell Magic | Line Magic |
---|---|---|
nvim-lua/plenary.nvim
AbaoFromCUG/websocket.nvim
(optional for mode="direct"
)To install the jupyterlab extension, execute:
pip install neopyter
Configure JupyterLab
in side panel
mode
: refer to the previous introduction about modeIP
: if mode=proxy
, set to the IP of the host where jupyter is located. If proxy=direct
, set to the IP of the
host where neovim is locatedport
: idle portWith 💤lazy.nvim:
{
"SUSTech-data/neopyter",
opts = {
-- auto define autocmd
auto_attach = true,
-- auto connect rpc service
auto_connect = true,
mode="direct",
-- same with JupyterLab settings
remote_address = "127.0.0.1:9001",
file_pattern = { "*.ju.*" },
on_attach = function(bufnr)
end,
highlight = {
enable = true,
shortsighted = true,
}
},
}
nvim-cmp
lspkind.nvim
local lspkind = require("lspkind")
local cmp = require("cmp")
cmp.setup({
sources = cmp.config.sources({
-- addition source
{ name = "neopyter" },
}),
formatting = {
format = lspkind.cmp_format({
mode = "symbol_text",
maxwidth = 50,
ellipsis_char = "...",
menu = {
neopyter = "[Neopyter]",
},
symbol_map = {
-- specific complete item kind icon
["Magic"] = "🪄",
["Path"] = "📁",
["Dict key"] = "🔑",
["Instance"]="",
["Statement"]="",
},
}),
},
)}
-- menu item highlight
vim.api.nvim_set_hl(0, "CmpItemKindMagic", { bg = "NONE", fg = "#D4D434" })
vim.api.nvim_set_hl(0, "CmpItemKindPath", { link = "CmpItemKindFolder" })
vim.api.nvim_set_hl(0, "CmpItemKindDictkey", { link = "CmpItemKindKeyword" })
vim.api.nvim_set_hl(0, "CmpItemKindInstance", { link = "CmpItemKindVariable" })
vim.api.nvim_set_hl(0, "CmpItemKindStatement", { link = "CmpItemKindVariable" })
More information, see nvim-cmp wiki
Supported captures in textobjects
query group
require'nvim-treesitter.configs'.setup {
textobjects = {
move = {
enable = true,
goto_next_start = {
["]j"] = "@cellseparator",
["]c"] = "@cellcontent",
},
goto_previous_start = {
["[j"] = "@cellseparator",
["[c"] = "@cellcontent",
},
},
},
}
jupyter lab
, there is a sidebar named Neopyter
, which display neopyter ip+port*.ju.py
file in neovim# %%
in Neovim to create a code cell.Server
:Neopyter connect [remote 'ip:port']
, e.g. :Neopyter command 127.0.0.1:9001
, connect Jupyter lab
manually:Neopyter disconnect
:Neopyter status
alias to :checkhealth neopyter
currentlySync
:Neopyter sync current
, make sync current *.ju.*
file with the currently open *.ipynb
:Neopyter sync [filename]
, e.g. :Neopyter sync main.ipynb
Run
:Neopyter run current
, same as Run
>Run Selected Cell and Do not Advance
menu in Jupyter lab
:Neopyter run allAbove
, same as Run
>Run All Above Selected Cell
menu in Jupyter lab
:Neopyter run allBelow
, same as Run
>Run Selected Cell and All Below
menu in Jupyter lab
:Neopyter run all
, same as Run
>Run All Cells
menu in Jupyter lab
Kernel
:Neopyter kernel restart
, same as Kernel
>Restart Kernel
menu in Jupyter lab
:Neopyter kernel restartRunAll
, same as Kernel
>Restart Kernel and Run All Cells
menu in Jupyter lab
Jupyter
:Neopyter execute [command_id] [args]
, execute Jupyter lab
's command directly, e.g. :Neopyter execute notebook:export-to-format {"format":"html"}
Neopyter
provides rich lua APIs
Jupyter Lab
Neopyter execute ...
<-> require("neopyter.jupyter").jupyterlab:execute_command(...)
:lua =require("neopyter.jupyter.jupyterlab").__injected_methods
Notebook
:Neopyter run current
<-> require("neopyter.jupyter").notebook:run_selected_cell()
:Neopyter run allAbove
<-> require("neopyter.jupyter").notebook:run_all_above()
:Neopyter run allBelow
<-> require("neopyter.jupyter").notebook:run_all_below()
:lua =require("neopyter.jupyter.notebook").__injected_methods
.ipynb
manuallyip:port
RpcClient
, support async rpc request
vim.rpcrequest
and vim.rpcnotify