From afe858ff2d42b0046958f08d591fea51d9c47031 Mon Sep 17 00:00:00 2001 From: payonel Date: Mon, 3 Sep 2018 16:00:54 -0700 Subject: [PATCH] tab complete aliases and improve io.dup efficiency --- .../loot/openos/lib/core/full_sh.lua | 21 +++++++++---------- .../opencomputers/loot/openos/lib/io.lua | 20 +++++++++--------- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_sh.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_sh.lua index 9f4de610b..4d9baa99d 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_sh.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_sh.lua @@ -187,22 +187,21 @@ function sh.internal.glob(eword) end function sh.getMatchingPrograms(baseName) + if not baseName or baseName == "" then return {} end local result = {} local result_keys = {} -- cache for fast value lookup - -- TODO only matching files with .lua extension for now, might want to - -- extend this to other extensions at some point? env var? file attrs? - if not baseName or #baseName == 0 then - baseName = "^(.*)%.lua$" - else - baseName = "^(" .. text.escapeMagic(baseName) .. ".*)%.lua$" + local function check(key) + if key:find(baseName, 1, true) == 1 and not result_keys[key] then + table.insert(result, key) + result_keys[key] = true + end + end + for alias in shell.aliases() do + check(alias) end for basePath in string.gmatch(os.getenv("PATH"), "[^:]+") do for file in fs.list(shell.resolve(basePath)) do - local match = file:match(baseName) - if match and not result_keys[match] then - table.insert(result, match) - result_keys[match] = true - end + check(file:gsub("%.lua$", "")) end end return result diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/io.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/io.lua index 251616c21..5f3b59956 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/io.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/io.lua @@ -108,17 +108,17 @@ function io.write(...) return io.output():write(...) end +local dup_mt = {__index = function(dfd, key) + if key == "close" or dfd._closed then dfd._closed = true return end + local fd_value = dfd.fd[key] + if type(fd_value) ~= "function" then return fd_value end + return function(_, ...) + return fd_value(dfd.fd, ...) + end +end} + function io.dup(fd) - return setmetatable({ - close = function(self) self._closed = true end, - }, {__index = function(_, key) - local fd_value = fd[key] - if type(fd_value) ~= "function" then return fd_value end - return function(self, ...) - if self._closed then return nil, "closed stream" end - return fd_value(fd, ...) - end - end}) + return setmetatable({fd=fd,_closed=false}, dup_mt) end -------------------------------------------------------------------------------