1 需求
- 像在PyCharm中一样,在另外一个终端窗口中,部分地执行nvim中的代码,可以逐行或者多行。
- 另外一个窗口运行了类似Python, R这样的交互式环境。
2 工具
- vim/nvim
- plugin manager, lazy.nvim
vim-slime
- Terminal multiplexing tools, tmux / GNU screen
3 配置步骤
(1)安装配置vim-slime
插件
- 这里以neovim 和 lazy.nvim 插件管理器为例,但是这个插件是vim插件,配置参数跟nvim插件有差异,比方说不支持
opts
参数,要用config = functions()
- 采用 vim-slime 默认的 screen 作为中介桥梁
- tmux配置见该插件说明文档
-- ~/.config/nvim/lua/plugins/XXX.lua
{
"jpalardy/vim-slime",
ft = { "python" },
init = function()
-- vim.g.slime_target = "neovim" -- 发送到 Neovim 终端
vim.g.slime_target = "screen"
vim.g.slime_no_mappings = true
end,
config = function()
vim.g.slime_input_pid = false
vim.g.slime_suggest_default = true
vim.g.slime_menu_config = false
vim.g.slime_neovim_ignore_unlisted = false
-- options not set here are g:slime_neovim_menu_order, g:slime_neovim_menu_delimiter, and g:slime_get_jobid
-- see the documentation above to learn about those options
-- called MotionSend but works with textobjects as well
vim.keymap.set("n", "gz", "<Plug>SlimeMotionSend", { remap = true, silent = false })
vim.keymap.set("n", "gzz", "<Plug>SlimeLineSend", { remap = true, silent = false })
vim.keymap.set("x", "gz", "<Plug>SlimeRegionSend", { remap = true, silent = false })
vim.keymap.set("n", "gzc", "<Plug>SlimeConfig", { remap = true, silent = false })
end,
},
(2)安装GNU screen
$ pamac install screen
4 使用
- 在另一个终端里打开一个所谓的
screen
session,$ screen -S my_session
, 并且打开REPL交互环境。注意:对于Python, 用 IPython/bpython/ptpython等环境, 关闭自动缩进功能(另可以配置"bracketed paste mode"1), 原因是Python自带的环境自动缩进功能跟screen发射的代码不兼容. - 这时通过
$ screen -ls
能查询当前已经打开的screen
sessions - 回到 nvim 中尝试发送代码, vim-slime 会提示输入 session name 和 window name, 前者对应
my_session
, 后者是一个序号, 比方说0
. - 一切正常的话,代码就应该去到了指定的终端环境
- 可以调整代码发送目的地,参考文档
SlimeConfig
部分
5 References
- 这个不错, https://joongsup.rbind.io/post/2018/10/06/vim-and-slime/
- https://github.com/jpalardy/vim-slime/blob/main/assets/doc/targets/screen.md
- http://nicksun.fun/linux/2020/07/06/slime-time.html
详见自动缩进相关讨论 https://github.com/jpalardy/vim-slime/issues/455#issuecomment-2916692631 ↩︎