Neovim+Lua环境下Slimv如何在当前目录启动Swank服务?
解决Neovim中Slimv的%目录占位符解析问题及指定项目目录方法
核心问题原因
你在Vim里直接设置g:slimv_swank_cmd时,%:p:h会被Vim自动解析为当前文件的父目录,但在Lua的vim.cmd([[...]])中,这个占位符不会被自动展开——因为Lua字符串里的%会被当作普通字符传递给Vimscript,而非触发Vim的路径展开逻辑。
解决方案一:用Lua动态生成命令(推荐)
直接在Lua层面获取当前文件的父目录,再拼接成完整命令赋值给全局变量,绕开占位符解析问题:
-- 获取当前打开文件的父目录 local current_file_dir = vim.fn.expand('%:p:h') -- 拼接Swank启动命令,注意转义双引号 local swank_cmd = string.format( '!osascript -e "tell application \\"Terminal\\" to do script \\"cd %s && sbcl --load ~/.local/share/nvim/slimv/lazy/slime/start-swank.lisp\\""', current_file_dir ) -- 赋值给Slimv的全局变量 vim.g.slimv_swank_cmd = swank_cmd
解决方案二:在Vimscript中手动展开占位符
如果想保留Vimscript风格,用Vim的expand()函数手动解析%:p:h,再拼接命令:
vim.cmd([[ let g:slimv_swank_cmd = '!osascript -e "tell application \"Terminal\" to do script \"cd ' . expand('%:p:h') . ' && sbcl --load ~/.local/share/nvim/slimv/lazy/slime/start-swank.lisp\""' ]])
让Slimv打开指定项目目录
如果想固定用项目根目录而非当前文件目录,只需要把上面代码里的路径部分替换成项目根路径即可:
- 固定目录:直接写死项目路径,比如
'/Users/you/projects/my-lisp-project' - 动态获取Neovim工作目录:如果打开Neovim时已经
cd到项目根,用vim.fn.getcwd()获取当前工作目录:
local project_root = vim.fn.getcwd() local swank_cmd = string.format( '!osascript -e "tell application \\"Terminal\\" to do script \\"cd %s && sbcl --load ~/.local/share/nvim/slimv/lazy/slime/start-swank.lisp\\""', project_root ) vim.g.slimv_swank_cmd = swank_cmd
这样Swank启动后就会在项目根目录运行,你可以直接用相对路径加载项目里的文件。
内容的提问来源于stack exchange,提问作者Tsarko
相关产品推荐
相关产品推荐

