Terminal emulator: full rewrite, real vt52 emulator (#8636)
New real terminal emulator, replacing the old plugin.
The emulator is basically a vt52 terminal (enriched with
some ANSI-sequences, as ash, vi and mksh don't behave well
on a vt52 term).
So far working: ash, mksh, bash, nano, vi, busybox, watch...
The input supports: tab-completion; cursor movement;
backspace; start of line, end of line (long press);
page up, page down (long press).
User scripts may be placed in the koterm.koplugin/scripts/
folder, aliases can be put in the file aliases and startup
command in the file profile.user in that folder.
2022-01-28 19:33:09 +00:00
|
|
|
local KeyValuePage = require("ui/widget/keyvaluepage")
|
|
|
|
local InfoMessage = require("ui/widget/infomessage")
|
|
|
|
local MultiInputDialog = require("ui/widget/multiinputdialog")
|
|
|
|
local UIManager = require("ui/uimanager")
|
|
|
|
local _ = require("gettext")
|
|
|
|
local util = require("util")
|
|
|
|
local T = require("ffi/util").template
|
|
|
|
|
|
|
|
local Aliases = {
|
|
|
|
filename = "",
|
|
|
|
close_callback = nil,
|
|
|
|
parent = nil,
|
|
|
|
|
|
|
|
alias_kv = nil,
|
|
|
|
kv_pairs = {},
|
|
|
|
}
|
|
|
|
|
|
|
|
function Aliases:show(filename, close_callback, parent)
|
|
|
|
self.filename = filename
|
|
|
|
self.close_callback = close_callback
|
|
|
|
self.parent = parent
|
|
|
|
self:load()
|
|
|
|
|
|
|
|
self.alias_kv = KeyValuePage:new{
|
|
|
|
title = "Aliases (Shortcuts)",
|
|
|
|
kv_pairs = self.kv_pairs,
|
|
|
|
close_callback = self.close_callback,
|
|
|
|
}
|
|
|
|
UIManager:show(self.alias_kv)
|
|
|
|
end
|
|
|
|
|
|
|
|
function Aliases:updateKeyValues()
|
|
|
|
self.alias_kv.kv_pairs = self.kv_pairs
|
|
|
|
UIManager:close(self.alias_kv)
|
|
|
|
self.alias_kv = KeyValuePage:new{
|
|
|
|
title = "Aliases (Shortcuts)",
|
|
|
|
kv_pairs = self.kv_pairs,
|
|
|
|
close_callback = self.close_callback,
|
|
|
|
}
|
|
|
|
UIManager:show(self.alias_kv)
|
|
|
|
end
|
|
|
|
|
|
|
|
function Aliases:load()
|
|
|
|
local file = io.open(self.filename, "r")
|
|
|
|
self.kv_pairs = {}
|
|
|
|
if file then
|
|
|
|
for line in file:lines() do
|
|
|
|
line = line:gsub("^ *alias *", "") -- drop alias
|
|
|
|
local dummy, separator = line:find("^[%a%d][%a%d-_]*%=") -- find separator
|
|
|
|
if line ~= "" and line:sub(1, 1) ~= "#" and separator then
|
|
|
|
local alias_name = line:sub(1, separator - 1)
|
|
|
|
local alias_command = line:sub(separator + 1):gsub("\"", "")
|
|
|
|
table.insert(self.kv_pairs, {alias_name, alias_command,
|
|
|
|
callback = function() self.editAlias(self, alias_name, alias_command) end
|
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
file:close()
|
|
|
|
table.sort(self.kv_pairs, function(a, b) return a[1] < b[1] end)
|
|
|
|
end
|
|
|
|
|
|
|
|
table.insert(self.kv_pairs, 1,
|
|
|
|
{ _("Create a new alias"), "", callback = function() self.editAlias(self, "", "") end})
|
|
|
|
table.insert(self.kv_pairs, 2, "---")
|
|
|
|
end
|
|
|
|
|
|
|
|
function Aliases:save()
|
|
|
|
local file = io.open(self.filename .. ".new", "w")
|
|
|
|
if not file then
|
|
|
|
UIManager:show(InfoMessage:new{
|
|
|
|
text = T(_("Terminal emulator: error saving: %1"), self.filename)
|
|
|
|
})
|
|
|
|
end
|
|
|
|
file:write("# Aliases generated by terminal emulator\n\n")
|
|
|
|
for i = 3, #self.kv_pairs do
|
|
|
|
file:write("alias " .. self.kv_pairs[i][1] .. "=\"" .. self.kv_pairs[i][2] .. "\"\n")
|
|
|
|
end
|
|
|
|
file:close()
|
|
|
|
os.remove(self.filename)
|
|
|
|
os.rename(self.filename .. ".new", self.filename)
|
|
|
|
end
|
|
|
|
|
|
|
|
function Aliases:editAlias(alias_name, alias_command)
|
|
|
|
local alias_input
|
|
|
|
alias_input = MultiInputDialog:new{
|
|
|
|
title = _("Edit alias"),
|
|
|
|
fields = {
|
|
|
|
{
|
|
|
|
description = _("Alias name:"),
|
|
|
|
text = alias_name,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
description = _("Alias command:"),
|
|
|
|
text = alias_command,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
buttons = {
|
|
|
|
{
|
|
|
|
{
|
|
|
|
text = _("Cancel"),
|
|
|
|
callback = function()
|
|
|
|
UIManager:close(alias_input)
|
|
|
|
end
|
|
|
|
},
|
|
|
|
{
|
|
|
|
text = _("Delete"),
|
|
|
|
callback = function()
|
|
|
|
UIManager:close(alias_input)
|
|
|
|
for i, v in pairs(self.kv_pairs) do
|
|
|
|
if v[1] == alias_name then
|
|
|
|
table.remove(self.kv_pairs, i)
|
|
|
|
self.parent:transmit("unalias " .. alias_name .."\n")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
self:save()
|
|
|
|
self:updateKeyValues()
|
|
|
|
end
|
|
|
|
},
|
|
|
|
{
|
|
|
|
text = _("Save"),
|
|
|
|
callback = function()
|
2022-10-06 15:11:47 +00:00
|
|
|
local fields = alias_input:getFields()
|
Terminal emulator: full rewrite, real vt52 emulator (#8636)
New real terminal emulator, replacing the old plugin.
The emulator is basically a vt52 terminal (enriched with
some ANSI-sequences, as ash, vi and mksh don't behave well
on a vt52 term).
So far working: ash, mksh, bash, nano, vi, busybox, watch...
The input supports: tab-completion; cursor movement;
backspace; start of line, end of line (long press);
page up, page down (long press).
User scripts may be placed in the koterm.koplugin/scripts/
folder, aliases can be put in the file aliases and startup
command in the file profile.user in that folder.
2022-01-28 19:33:09 +00:00
|
|
|
local name = fields[1] and util.trim(fields[1])
|
|
|
|
local value = fields[2] and util.trim(fields[2])
|
|
|
|
if name ~= "" and value ~= "" then
|
|
|
|
UIManager:close(alias_input)
|
|
|
|
for i, v in pairs(self.kv_pairs) do
|
|
|
|
if v[1] == alias_name then
|
|
|
|
table.remove(self.kv_pairs, i)
|
|
|
|
self.parent:transmit("unalias " .. alias_name .."\n")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
self.parent:transmit("alias " .. name .. "='" .. value .. "'\n")
|
|
|
|
table.insert(self.kv_pairs, {name, value,
|
|
|
|
callback = function()
|
|
|
|
self.editAlias(self, name, value)
|
|
|
|
end
|
|
|
|
})
|
|
|
|
table.remove(self.kv_pairs, 2)
|
|
|
|
table.remove(self.kv_pairs, 1)
|
|
|
|
table.sort(self.kv_pairs, function(a, b) return a[1] < b[1] end)
|
|
|
|
table.insert(self.kv_pairs, 1, { _("Create a new alias"), "",
|
|
|
|
callback = function() self:editAlias(self, "", "") end })
|
|
|
|
table.insert(self.kv_pairs, 2, "---")
|
|
|
|
self:save()
|
|
|
|
self:updateKeyValues()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
},
|
|
|
|
{
|
|
|
|
text = _("Execute"),
|
|
|
|
callback = function()
|
2022-10-06 15:11:47 +00:00
|
|
|
local fields = alias_input:getFields()
|
Terminal emulator: full rewrite, real vt52 emulator (#8636)
New real terminal emulator, replacing the old plugin.
The emulator is basically a vt52 terminal (enriched with
some ANSI-sequences, as ash, vi and mksh don't behave well
on a vt52 term).
So far working: ash, mksh, bash, nano, vi, busybox, watch...
The input supports: tab-completion; cursor movement;
backspace; start of line, end of line (long press);
page up, page down (long press).
User scripts may be placed in the koterm.koplugin/scripts/
folder, aliases can be put in the file aliases and startup
command in the file profile.user in that folder.
2022-01-28 19:33:09 +00:00
|
|
|
local value = fields[2] and util.trim(fields[2])
|
|
|
|
if value ~= "" then
|
|
|
|
UIManager:close(alias_input)
|
|
|
|
self.alias_kv:onClose()
|
|
|
|
self.parent:transmit(value .. "\n")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
UIManager:show(alias_input)
|
|
|
|
alias_input:onShowKeyboard()
|
|
|
|
end
|
|
|
|
|
|
|
|
return Aliases
|