1
0
Fork 0
dot/.config/vis/visrc.lua

172 lines
4.4 KiB
Lua
Raw Normal View History

2024-07-31 12:05:39 +02:00
require('vis')
2024-08-20 03:41:17 +02:00
local m = vis.modes
local mode_strings = {
2024-08-20 03:41:17 +02:00
[m.NORMAL] = 'NORMAL',
[m.OPERATOR_PENDING] = 'OPERATOR-PENDING',
[m.VISUAL] = 'VISUAL',
[m.VISUAL_LINE] = 'VISUAL-LINE',
[m.INSERT] = 'INSERT',
[m.REPLACE] = 'REPLACE',
}
2024-08-20 03:41:17 +02:00
local e = vis.events
-- editor options
2024-08-20 03:41:17 +02:00
e.subscribe(e.INIT, function()
require("themes.basic")
vis:map(m.NORMAL, 'y', '<vis-register>+<vis-operator-yank>')
vis:map(m.VISUAL, 'y', '<vis-register>+<vis-operator-yank>')
vis:map(m.NORMAL, 'y', '<vis-register>+<vis-operator-yank>')
vis:map(m.VISUAL, 'd', '<vis-register>+<vis-operator-delete>')
vis:map(m.VISUAL_LINE, 'd', '<vis-register>+<vis-operator-delete>')
vis:map(m.VISUAL_LINE, 'd', '<vis-register>+<vis-operator-delete>')
vis:map(m.NORMAL, 'p', '<vis-register>+<vis-put-after>')
vis:map(m.VISUAL, 'p', '<vis-register>+<vis-put-after>')
vis:map(m.VISUAL_LINE, 'p', '<vis-register>+<vis-put-after>')
vis:map(m.NORMAL, 'P', '<vis-register>+<vis-put-before>')
vis:map(m.VISUAL, 'P', '<vis-register>+<vis-put-before>')
vis:map(m.VISUAL_LINE, 'P', '<vis-register>+<vis-put-before>')
vis:map(m.NORMAL, '<C-w>o', function()
local unclosed
for win in vis:windows() do
if win == vis.win then goto continue end
if win:close() then goto continue end
unclosed = win
::continue::
end
if unclosed then
vis.win = unclosed
vis:info('No write since last change')
end
end)
vis:map(m.NORMAL, ' e', function()
local _, f = vis:pipe('find -type f | vis-menu -l 5 -p ":e"')
if f == nil then return end
cmd = ('e "%s"'):format(f:sub(1, -2))
vis:info(cmd)
vis:command(cmd)
end)
vis:map(m.NORMAL, ' o', function()
local _, f = vis:pipe('find -type f | vis-menu -l 5 -p ":o"')
if file == nil then return end
cmd = ('vsplit "%s"'):format(f:sub(1, -2))
vis:info(cmd)
vis:command(cmd)
end)
vis:map(m.NORMAL, ' g', function()
local _, w = vis:pipe(
vis.win.file or nil,
vis.win.viewport.bytes,
'grep -Eo "\\w\\w\\w+" | sort | uniq | vis-menu -l 5 -p "grep"')
if w == nil then return end
w = w:sub(1, -2)
local _, f = vis:pipe(('grep -n "%s" ** | tr "\\t" " " | vis-menu -l 5 -p ":o"'):format(w))
if f == nil then return end
local file, lineno, line = f:match("^(.+):(%d+):(.*)$")
if file == nil then return end -- TODO report error
cmd = ('vsplit "%s"'):format(file)
vis:info(cmd)
vis:command(cmd)
vis.win.selection:to(tonumber(lineno), line:find(w))
end)
2024-07-31 12:05:39 +02:00
vis.options.autoindent = true
end)
-- window options
2024-08-20 03:41:17 +02:00
e.subscribe(e.WIN_OPEN, function(win)
2024-07-31 12:05:39 +02:00
win.options.colorcolumn = 81
win.options.relativenumbers = true
if win.syntax == 'markdown' then
2024-08-20 03:41:17 +02:00
win.options.breakat = " ])}_"
win.options.expandtab = true
win.options.tabwidth = 2
win.options.wrapcolumn = 81
end
2024-07-31 12:05:39 +02:00
2024-08-20 03:41:17 +02:00
if win.syntax == 'css' then
win.options.expandtab = true
win.options.tabwidth = 2
end
end)
2024-08-20 03:41:17 +02:00
-- statusline
function set_statusline(win, mode_string)
2024-07-31 12:05:39 +02:00
local left_parts = {}
local right_parts = {}
local file = win.file
local selection = win.selection
local file_info = (file.name or '[No Name]')..(file.modified and '[+]' or '')
if vis.win == win then
-- mode
table.insert(left_parts, mode_string)
2024-07-31 12:05:39 +02:00
-- selection
table.insert(left_parts, selection.number..'/'..#win.selections)
-- file info
file_info =
file_info
..':'
..(vis.count or '')
..(vis.input_queue or '')
..(vis.recording and '@' or '')
-- character under cursor
table.insert(right_parts,
'<'
..(string.byte(file:content(selection.pos, 1)) or '0')
..'>')
end
table.insert(left_parts, file_info)
-- line and column count
table.insert(right_parts, #file.lines..'/'..selection.line)
table.insert(right_parts, selection.col)
2024-08-20 03:41:17 +02:00
-- fillchars
local left = table.concat(left_parts, " ")
local right = table.concat(right_parts, " ")
win:status(table.concat({ left, ('^'):rep(win.width - #left - #right - 2)}, ' '), right)
end
e.subscribe(e.WIN_STATUS, function(win)
set_statusline(win, mode_strings[vis.mode])
end)
-- title
local modified = false
local function set_title(title)
vis:command('!printf "\\e];vis: '..title..(modified and '[+]' or '')..'\\e"')
end
2024-08-20 03:41:17 +02:00
e.subscribe(e.WIN_OPEN, function(win)
set_title(win.file.name or "[No Name]")
end)
e.subscribe(e.FILE_SAVE_POST, function(file)
modified = false
set_title(file.name)
end)
e.subscribe(e.WIN_STATUS, function(win)
if not modified and win.file.modified then
modified = true
set_title(win.file.name)
end
end)