将参数传递给 vim.api.nvim_create_user_command 以执行 bash 命令

问题描述 投票:0回答:1

我一直在服务器模式下使用 mproc 在后台启动一堆项目依赖项

mproc 当前在后台运行,服务器在 127.0.0.1:4050 接收命令。它为我启动了四个服务:docker、red、blue、green。

我想在不离开 neovim 的情况下与服务器进行交互。我能够使用以下代码部分完成此操作

local ECP_SERVICE_CODE = {
    DOCKER = 0,
    RED = 1,
    BLUE = 2,
    GREEN = 3,
}

local MPROC_CMDS = {
    RESTART = "restart",
    KILL = "kill"
}

function EcpMproc(service, command)
    return [[!mprocs --server 127.0.0.1:4050 --ctl '{c: batch, cmds:[{c: select-proc, index: ]] ..
        tostring(service) .. [[}, {c: ]] .. tostring(command) .. [[-proc }, {c: select-proc, index: 0}]}'<cr>]]
end


vim.api.nvim_create_user_command("ColorsRedServiceKill", ColorsMproc(ECP_SERVICE_CODE.RED, MPROC_CMDS.KILL), {})
vim.api.nvim_create_user_command("ColorsRedServiceRestart", ColorsMproc(ECP_SERVICE_CODE.RED, MPROC_CMDS.RESTART), {})

vim.api.nvim_create_user_command("ColorsBlueServiceKill", ColorsMproc(ECP_SERVICE_CODE.BLUE, MPROC_CMDS.KILL), {})
vim.api.nvim_create_user_command("ColorsBlueServiceRestart", ColorsMproc(ECP_SERVICE_CODE.BLUE, MPROC_CMDS.RESTART), {})

vim.api.nvim_create_user_command("ColorsGreenServiceKill", ColorsMproc(ECP_SERVICE_CODE.GREEN, MPROC_CMDS.KILL), {})
vim.api.nvim_create_user_command("ColorsGreenServiceRestart", ColorsMproc(ECP_SERVICE_CODE.GREEN, MPROC_CMDS.RESTART), {})

我现在可以使用像

:ColorsRedServiceKill<CR>
:ColorsBlueServiceRestart<CR>
这样的命令与我正在运行的 mproc 实例交互。

不必太担心鲁棒性或极端情况,我希望能够利用传递给 neovim 命令的参数,而不是用

:Colors 1 restart
或更好的方式调用此函数 (
:Colors blue restart
)

这是我最好的尝试。它没有达到预期的效果:(

vim.api.nvim_create_user_command(
    "Colors",
    function(opts)
        local service = opts.fargs[1]
        local command = opts.fargs[2]

        return ColorsMproc(service, command)
    end,
    {nargs = "+", bang = true}
)
lua neovim
1个回答
0
投票

据我了解,您不需要使用

return
。 我还假设
ColorsMproc
已经在 .lua 文件的其他地方定义,否则您需要使用
vim.fn
访问它(我很确定)。那么它可能看起来像这样:

vim.api.nvim_create_user_command(
    "Colors",
    function()
        local service = vim.fn.input "service: "
        local command = vim.fn.input "command: "

        ColorsMproc(service, command)
    end,
    {nargs = "+", bang = true}
)

我认为您可以通过执行以下操作将“服务”和“命令”放在同一行中:

local sc = vim.split(vim.fn.input "service/command: ", " ")
.

我参考了这个视频:https://www.youtube.com/watch?v=HlfjpstqXwE

© www.soinside.com 2019 - 2024. All rights reserved.