diff options
Diffstat (limited to 'lua/vis-std.lua')
| -rw-r--r-- | lua/vis-std.lua | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/lua/vis-std.lua b/lua/vis-std.lua new file mode 100644 index 0000000..1fe93a9 --- /dev/null +++ b/lua/vis-std.lua @@ -0,0 +1,143 @@ +-- standard vis event handlers + +vis.events.subscribe(vis.events.INIT, function() + if os.getenv("TERM_PROGRAM") == "Apple_Terminal" then + vis:command("set change256colors false") + end + vis:command("set theme default") +end) + +vis:option_register("theme", "string", function(name) + if name ~= nil then + local theme = 'themes/'..name + package.loaded[theme] = nil + require(theme) + end + + local lexers = vis.lexers + lexers.lexers = {} + + if not lexers.load then return false end + if not lexers.property then lexers.load("text") end + local colors = lexers.colors + local default_colors = { "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white" } + for _, c in ipairs(default_colors) do + if not colors[c] or colors[c] == '' then + colors[c] = c + end + end + + for win in vis:windows() do + win:set_syntax(win.syntax) + end + return true +end, "Color theme to use, filename without extension") + +vis:option_register("syntax", "string", function(name) + if not vis.win then return false end + if not vis.win:set_syntax(name) then + vis:info(string.format("Unknown syntax definition: `%s'", name)) + return false + end + return true +end, "Syntax highlighting lexer to use") + +vis:option_register("horizon", "number", function(horizon) + if not vis.win then return false end + vis.win.horizon = horizon + return true +end, "Number of bytes to consider for syntax highlighting") + +vis.events.subscribe(vis.events.WIN_HIGHLIGHT, function(win) + if not win.syntax or not vis.lexers.load then return end + local lexer = vis.lexers.load(win.syntax, nil, true) + if not lexer then return end + + -- TODO: improve heuristic for initial style + local viewport = win.viewport.bytes + if not viewport then return end + local horizon_max = win.horizon or 32768 + local horizon = viewport.start < horizon_max and viewport.start or horizon_max + local view_start = viewport.start + local lex_start = viewport.start - horizon + viewport.start = lex_start + local data = win.file:content(viewport) + local token_styles = lexer._TAGS + local tokens = lexer:lex(data, 1) + local token_end = lex_start + (tokens[#tokens] or 1) - 1 + + for i = #tokens - 1, 1, -2 do + local token_start = lex_start + (tokens[i-1] or 1) - 1 + if token_end < view_start then + break + end + local name = tokens[i] + local style = token_styles[name] + if style ~= nil then + win:style(style, token_start, token_end) + end + token_end = token_start - 1 + end +end) + +local modes = { + [vis.modes.NORMAL] = '', + [vis.modes.OPERATOR_PENDING] = '', + [vis.modes.VISUAL] = 'VISUAL', + [vis.modes.VISUAL_LINE] = 'VISUAL-LINE', + [vis.modes.INSERT] = 'INSERT', + [vis.modes.REPLACE] = 'REPLACE', +} + +vis.events.subscribe(vis.events.WIN_STATUS, function(win) + local left_parts = {} + local right_parts = {} + local file = win.file + local selection = win.selection + + local mode = modes[vis.mode] + if mode ~= '' and vis.win == win then + table.insert(left_parts, mode) + end + + table.insert(left_parts, (file.name or '[No Name]') .. + (file.modified and ' [+]' or '') .. (vis.recording and ' @' or '')) + + local count = vis.count + local keys = vis.input_queue + if keys ~= '' then + table.insert(right_parts, keys) + elseif count then + table.insert(right_parts, count) + end + + if #win.selections > 1 then + table.insert(right_parts, selection.number..'/'..#win.selections) + end + + local size = file.size + local pos = selection.pos + if not pos then pos = 0 end + table.insert(right_parts, (size == 0 and "0" or math.ceil(pos/size*100)).."%") + + if not win.large then + local col = selection.col + table.insert(right_parts, selection.line..', '..col) + if size > 33554432 or col > 65536 then + win.large = true + end + end + + local left = ' ' .. table.concat(left_parts, " » ") .. ' ' + local right = ' ' .. table.concat(right_parts, " « ") .. ' ' + win:status(left, right); +end) + +-- default plugins + +require('plugins/filetype') +require('plugins/textobject-lexer') +require('plugins/digraph') +require('plugins/number-inc-dec') +require('plugins/complete-word') +require('plugins/complete-filename') |
