2014-11-03 20:27:18 +01:00
|
|
|
ui.tabs = false
|
|
|
|
ui.set_theme(not CURSES and 'dark' or 'custom_term')
|
2014-11-04 15:40:25 +01:00
|
|
|
|
|
|
|
args.register('-vm', '--view-mode', 0, function()
|
|
|
|
-- Make all opened buffers read-only.
|
|
|
|
events.connect(events.FILE_OPENED, function()
|
|
|
|
buffer.read_only = true
|
|
|
|
end)
|
|
|
|
-- Hide the menubar.
|
|
|
|
ui.menubar = {}
|
|
|
|
end, 'View-only mode')
|
|
|
|
|
|
|
|
keys.ch = buffer.char_left
|
|
|
|
keys.cj = buffer.line_up
|
|
|
|
keys.ck = buffer.line_down
|
|
|
|
keys.cl = buffer.char_right
|
|
|
|
|
|
|
|
-- TODO: Test when file gets more than 10000 lines while editing.
|
|
|
|
events.connect(events.FILE_OPENED, function()
|
|
|
|
local buffer = buffer
|
|
|
|
local c = _SCINTILLA.constants
|
|
|
|
local width = #(buffer.line_count..'')
|
|
|
|
if width > 4 then
|
|
|
|
buffer.margin_width_n[0] = 4 + width * buffer:text_width(c.STYLE_LINENUMBER, '9')
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
|
|
|
function browse_url ()
|
|
|
|
local url
|
|
|
|
local web = os.getenv ('BROWSER') or 'xdg-open'
|
|
|
|
local sel = buffer:get_sel_text()
|
|
|
|
if #sel == 0 then
|
|
|
|
url = buffer.filename
|
|
|
|
else
|
|
|
|
url = sel
|
|
|
|
end
|
|
|
|
if url then
|
|
|
|
local cmd = string.format(OSX and 'open "file://%s"' or web .. ' "%s" &', url)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
keys.cy = browse_url
|
|
|
|
|
|
|
|
-- Sandboxed environment for scritps.
|
|
|
|
-- See http://lua-users.org/wiki/SandBoxes
|
|
|
|
local function make_sandbox (extra)
|
|
|
|
local sandbox = {
|
|
|
|
assert = assert,
|
|
|
|
ipairs = ipairs,
|
|
|
|
error = error,
|
|
|
|
next = next,
|
|
|
|
pairs = pairs,
|
|
|
|
pcall = pcall,
|
|
|
|
select = select,
|
|
|
|
tonumber = tonumber,
|
|
|
|
tostring = tostring,
|
|
|
|
type = type,
|
|
|
|
unpack = unpack,
|
|
|
|
_VERSION = _VERSION,
|
|
|
|
xpcall = xpcall,
|
|
|
|
string = {
|
|
|
|
byte = string.byte,
|
|
|
|
char = string.char,
|
|
|
|
find = string.find,
|
|
|
|
format = string.format,
|
|
|
|
gmatch = string.gmatch,
|
|
|
|
gsub = string.gsub,
|
|
|
|
len = string.len,
|
|
|
|
lower = string.lower,
|
|
|
|
match = string.match,
|
|
|
|
rep = string.rep,
|
|
|
|
reverse = string.reverse,
|
|
|
|
sub = string.sub,
|
|
|
|
upper = string.upper,
|
|
|
|
},
|
|
|
|
table = {
|
|
|
|
concat = table.concat,
|
|
|
|
insert = table.insert,
|
|
|
|
maxn = table.maxn,
|
|
|
|
remove = table.remove,
|
|
|
|
sort = table.sort,
|
|
|
|
},
|
|
|
|
math = {
|
|
|
|
abs = math.abs,
|
|
|
|
acos = math.acos,
|
|
|
|
asin = math.asin,
|
|
|
|
atan = math.atan,
|
|
|
|
atan2 = math.atan2,
|
|
|
|
ceil = math.ceil,
|
|
|
|
cos = math.cos,
|
|
|
|
cosh = math.cosh,
|
|
|
|
deg = math.deg,
|
|
|
|
exp = math.exp,
|
|
|
|
floor = math.floor,
|
|
|
|
fmod = math.fmod,
|
|
|
|
frexp = math.frexp,
|
|
|
|
huge = math.huge,
|
|
|
|
ldexp = math.ldexp,
|
|
|
|
log = math.log,
|
|
|
|
log10 = math.log10,
|
|
|
|
max = math.max,
|
|
|
|
min = math.min,
|
|
|
|
modf = math.modf,
|
|
|
|
pi = math.pi,
|
|
|
|
pow = math.pow,
|
|
|
|
rad = math.rad,
|
|
|
|
random = math.random,
|
|
|
|
sin = math.sin,
|
|
|
|
sinh = math.sinh,
|
|
|
|
sqrt = math.sqrt,
|
|
|
|
tan = math.tan,
|
|
|
|
tanh = math.tanh
|
|
|
|
},
|
|
|
|
os = {
|
|
|
|
clock = os.clock,
|
|
|
|
difftime = os.difftime,
|
|
|
|
time = os.time,
|
|
|
|
tmpname = os.tmpname
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if extra then
|
|
|
|
for k, v in pairs (extra) do
|
|
|
|
sandbox[k] = v
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return sandbox
|
|
|
|
end
|
|
|
|
|
|
|
|
run = function () return false, 'Sandboxed call disabled.' end
|
|
|
|
if _VERSION == 'Lua 5.1' then
|
|
|
|
-- Run code under environment [Lua 5.1]
|
|
|
|
run = function (untrusted_code)
|
|
|
|
local env = make_sandbox ()
|
|
|
|
if not untrusted_code then return nil, 'No code provided' end
|
|
|
|
if untrusted_code:byte (1) == 27 then return nil, 'Binary bytecode prohibited' end
|
|
|
|
local untrusted_function, message = loadstring (untrusted_code)
|
|
|
|
if not untrusted_function then return nil, message end
|
|
|
|
setfenv (untrusted_function, env)
|
|
|
|
return pcall (untrusted_function)
|
|
|
|
end
|
|
|
|
elseif _VERSION == 'Lua 5.2' then
|
|
|
|
-- Run code under environment [Lua 5.2]
|
|
|
|
run = function (untrusted_code, env)
|
|
|
|
local env = make_sandbox ()
|
|
|
|
local untrusted_function, message = load (untrusted_code, nil, 't', env)
|
|
|
|
if not untrusted_function then return nil, message end
|
|
|
|
return pcall (untrusted_function)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- TODO: This function runs the code in selection in a sandbox, which may be
|
|
|
|
-- quite limitating. The evaluated code must be a function (i.e. it must return
|
|
|
|
-- a value).
|
|
|
|
function eval ()
|
|
|
|
local sel = buffer:get_sel_text()
|
|
|
|
if #sel ~= 0 then
|
|
|
|
local result = {run (sel)}
|
|
|
|
if result[1] then
|
|
|
|
if result[2] then
|
|
|
|
buffer:replace_sel(result[2])
|
|
|
|
for i = 3, #result do
|
|
|
|
if result[i] then
|
|
|
|
buffer:insert(-1, result[i])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
ui.print (result[2])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
require('textredux').hijack()
|