Add cc.shell.completion `programWithArgs` completion. (#815)
And expand monitor, shell, fg and bg to use it
This commit is contained in:
parent
53efd6b303
commit
b323db30ee
|
@ -29,8 +29,8 @@ local completion = require "cc.completion"
|
||||||
|
|
||||||
--- Complete the name of a file relative to the current working directory.
|
--- Complete the name of a file relative to the current working directory.
|
||||||
--
|
--
|
||||||
-- @tparam table shell The shell we're completing in
|
-- @tparam table shell The shell we're completing in.
|
||||||
-- @tparam { string... } choices The list of choices to complete from.
|
-- @tparam string text Current text to complete.
|
||||||
-- @treturn { string... } A list of suffixes of matching files.
|
-- @treturn { string... } A list of suffixes of matching files.
|
||||||
local function file(shell, text)
|
local function file(shell, text)
|
||||||
return fs.complete(text, shell.dir(), true, false)
|
return fs.complete(text, shell.dir(), true, false)
|
||||||
|
@ -38,8 +38,8 @@ end
|
||||||
|
|
||||||
--- Complete the name of a directory relative to the current working directory.
|
--- Complete the name of a directory relative to the current working directory.
|
||||||
--
|
--
|
||||||
-- @tparam table shell The shell we're completing in
|
-- @tparam table shell The shell we're completing in.
|
||||||
-- @tparam { string... } choices The list of choices to complete from.
|
-- @tparam string text Current text to complete.
|
||||||
-- @treturn { string... } A list of suffixes of matching directories.
|
-- @treturn { string... } A list of suffixes of matching directories.
|
||||||
local function dir(shell, text)
|
local function dir(shell, text)
|
||||||
return fs.complete(text, shell.dir(), false, true)
|
return fs.complete(text, shell.dir(), false, true)
|
||||||
|
@ -48,8 +48,8 @@ end
|
||||||
--- Complete the name of a file or directory relative to the current working
|
--- Complete the name of a file or directory relative to the current working
|
||||||
-- directory.
|
-- directory.
|
||||||
--
|
--
|
||||||
-- @tparam table shell The shell we're completing in
|
-- @tparam table shell The shell we're completing in.
|
||||||
-- @tparam { string... } choices The list of choices to complete from.
|
-- @tparam string text Current text to complete.
|
||||||
-- @tparam { string... } previous The shell arguments before this one.
|
-- @tparam { string... } previous The shell arguments before this one.
|
||||||
-- @tparam[opt] boolean add_space Whether to add a space after the completed item.
|
-- @tparam[opt] boolean add_space Whether to add a space after the completed item.
|
||||||
-- @treturn { string... } A list of suffixes of matching files and directories.
|
-- @treturn { string... } A list of suffixes of matching files and directories.
|
||||||
|
@ -74,14 +74,46 @@ end
|
||||||
|
|
||||||
--- Complete the name of a program.
|
--- Complete the name of a program.
|
||||||
--
|
--
|
||||||
-- @tparam table shell The shell we're completing in
|
-- @tparam table shell The shell we're completing in.
|
||||||
-- @tparam { string... } choices The list of choices to complete from.
|
-- @tparam string text Current text to complete.
|
||||||
-- @treturn { string... } A list of suffixes of matching programs.
|
-- @treturn { string... } A list of suffixes of matching programs.
|
||||||
-- @see shell.completeProgram
|
-- @see shell.completeProgram
|
||||||
local function program(shell, text)
|
local function program(shell, text)
|
||||||
return shell.completeProgram(text)
|
return shell.completeProgram(text)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Complete arguments of a program.
|
||||||
|
--
|
||||||
|
-- @tparam table shell The shell we're completing in.
|
||||||
|
-- @tparam string text Current text to complete.
|
||||||
|
-- @tparam { string... } previous The shell arguments before this one.
|
||||||
|
-- @tparam number starting Which argument index this program and args start at.
|
||||||
|
-- @treturn { string... } A list of suffixes of matching programs or arguments.
|
||||||
|
local function programWithArgs(shell, text, previous, starting)
|
||||||
|
if #previous + 1 == starting then
|
||||||
|
local tCompletionInfo = shell.getCompletionInfo()
|
||||||
|
if text:sub(-1) ~= "/" and tCompletionInfo[shell.resolveProgram(text)] then
|
||||||
|
return { " " }
|
||||||
|
else
|
||||||
|
local results = shell.completeProgram(text)
|
||||||
|
for n = 1, #results do
|
||||||
|
local sResult = results[n]
|
||||||
|
if sResult:sub(-1) ~= "/" and tCompletionInfo[shell.resolveProgram(text .. sResult)] then
|
||||||
|
results[n] = sResult .. " "
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return results
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local program = previous[starting]
|
||||||
|
local resolved = shell.resolveProgram(program)
|
||||||
|
if not resolved then return end
|
||||||
|
local tCompletion = shell.getCompletionInfo()[resolved]
|
||||||
|
if not tCompletion then return end
|
||||||
|
return tCompletion.fnComplete(shell, #previous - starting + 1, text, { program, table.unpack(previous, starting + 1, #previous) })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
--[[- A helper function for building shell completion arguments.
|
--[[- A helper function for building shell completion arguments.
|
||||||
|
|
||||||
This accepts a series of single-argument completion functions, and combines
|
This accepts a series of single-argument completion functions, and combines
|
||||||
|
@ -144,6 +176,7 @@ return {
|
||||||
dir = dir,
|
dir = dir,
|
||||||
dirOrFile = dirOrFile,
|
dirOrFile = dirOrFile,
|
||||||
program = program,
|
program = program,
|
||||||
|
programWithArgs = programWithArgs,
|
||||||
|
|
||||||
-- Re-export various other functions
|
-- Re-export various other functions
|
||||||
help = wrap(help.completeTopic), --- Wraps @{help.completeTopic} as a @{build} compatible function.
|
help = wrap(help.completeTopic), --- Wraps @{help.completeTopic} as a @{build} compatible function.
|
||||||
|
|
|
@ -81,9 +81,17 @@ shell.setCompletionFunction("rom/programs/monitor.lua", completion.build(
|
||||||
if previous[2] == "scale" then
|
if previous[2] == "scale" then
|
||||||
return completion.peripheral(shell, text, previous, true)
|
return completion.peripheral(shell, text, previous, true)
|
||||||
else
|
else
|
||||||
return completion.program(shell, text, previous)
|
return completion.programWithArgs(shell, text, previous, 3)
|
||||||
end
|
end
|
||||||
|
end,
|
||||||
|
{
|
||||||
|
function(shell, text, previous)
|
||||||
|
if previous[2] ~= "scale" then
|
||||||
|
return completion.programWithArgs(shell, text, previous, 3)
|
||||||
end
|
end
|
||||||
|
end,
|
||||||
|
many = true,
|
||||||
|
}
|
||||||
))
|
))
|
||||||
|
|
||||||
shell.setCompletionFunction("rom/programs/move.lua", completion.build(
|
shell.setCompletionFunction("rom/programs/move.lua", completion.build(
|
||||||
|
@ -98,11 +106,11 @@ shell.setCompletionFunction("rom/programs/rename.lua", completion.build(
|
||||||
{ completion.dirOrFile, true },
|
{ completion.dirOrFile, true },
|
||||||
completion.dirOrFile
|
completion.dirOrFile
|
||||||
))
|
))
|
||||||
shell.setCompletionFunction("rom/programs/shell.lua", completion.build(completion.program))
|
shell.setCompletionFunction("rom/programs/shell.lua", completion.build({ completion.programWithArgs, 2, many = true }))
|
||||||
shell.setCompletionFunction("rom/programs/type.lua", completion.build(completion.dirOrFile))
|
shell.setCompletionFunction("rom/programs/type.lua", completion.build(completion.dirOrFile))
|
||||||
shell.setCompletionFunction("rom/programs/set.lua", completion.build({ completion.setting, true }))
|
shell.setCompletionFunction("rom/programs/set.lua", completion.build({ completion.setting, true }))
|
||||||
shell.setCompletionFunction("rom/programs/advanced/bg.lua", completion.build(completion.program))
|
shell.setCompletionFunction("rom/programs/advanced/bg.lua", completion.build({ completion.programWithArgs, 2, many = true }))
|
||||||
shell.setCompletionFunction("rom/programs/advanced/fg.lua", completion.build(completion.program))
|
shell.setCompletionFunction("rom/programs/advanced/fg.lua", completion.build({ completion.programWithArgs, 2, many = true }))
|
||||||
shell.setCompletionFunction("rom/programs/fun/dj.lua", completion.build(
|
shell.setCompletionFunction("rom/programs/fun/dj.lua", completion.build(
|
||||||
{ completion.choice, { "play", "play ", "stop " } },
|
{ completion.choice, { "play", "play ", "stop " } },
|
||||||
completion.peripheral
|
completion.peripheral
|
||||||
|
|
|
@ -17,6 +17,30 @@ describe("cc.shell.completion", function()
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
describe("program", function()
|
||||||
|
it("completes programs", function()
|
||||||
|
expect(c.program(shell, "rom/")):same {
|
||||||
|
"apis/", "autorun/", "help/", "modules/", "motd.txt", "programs/", "startup.lua",
|
||||||
|
}
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
describe("programWithArgs", function()
|
||||||
|
it("completes program name", function()
|
||||||
|
shell.setCompletionFunction("rom/motd.txt", function() end)
|
||||||
|
expect(c.programWithArgs(shell, "rom/", { "rom/programs/shell.lua" }, 2)):same {
|
||||||
|
"apis/", "autorun/", "help/", "modules/", "motd.txt ", "programs/", "startup.lua",
|
||||||
|
}
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("completes program arguments", function()
|
||||||
|
expect(c.programWithArgs(shell, "", { "rom/programs/shell.lua", "pastebin" }, 2)):same {
|
||||||
|
"put ", "get ", "run ",
|
||||||
|
}
|
||||||
|
end)
|
||||||
|
|
||||||
|
end)
|
||||||
|
|
||||||
describe("build", function()
|
describe("build", function()
|
||||||
it("completes multiple arguments", function()
|
it("completes multiple arguments", function()
|
||||||
local spec = c.build(
|
local spec = c.build(
|
||||||
|
|
Loading…
Reference in New Issue