Commit: e63cd8c47349b7e621bca8512b68a56394118fc2 Parent: 0057f7838733e50d3a3e369688b252869bb57a7b Author: Johannes Thyssen Tishman Date: Mon, 28 Aug 2023 11:13:10 +0000 Add functions for cell/column manipulation Diffstat: M init.lua | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 9 deletions(-)
diff --git a/init.lua b/init.lua @@ -13,6 +13,13 @@ local function smatch(row, str) if match then return match else return end end +local function switch(tbl, row1, col1, row2, col2) + local tmp = tbl[row1][col1] + tbl[row1][col1] = tbl[row2][col2] + tbl[row2][col2] = tmp + return tbl +end + local function gettable(ln, lc, lines) local tbl = {} @@ -29,9 +36,6 @@ local function gettable(ln, lc, lines) tbl.finish = tbl.finish + 1 end - -- Table indent -- - tbl.indent = smatch(lines[tbl.start], '') - -- Table content -- for i = tbl.start, tbl.finish do local fields = {} @@ -67,8 +71,13 @@ local function gettable(ln, lc, lines) -- Current table row -- tbl.irow = ln - tbl.start + 1 - -- Minimum column width of each column -- + return tbl +end + +local function printtable(tbl, lines) + tbl.indent = smatch(lines[tbl.start], '') tbl.colw = {} + for c = 1, tbl.ncols do local max = 0 for r = 1, tbl.nrows do @@ -83,15 +92,11 @@ local function gettable(ln, lc, lines) end tbl.colw[c] = (max == 0 and 1 or max) end - if tbl.ncols == 0 then tbl.colw[1] = 1 end - return tbl -end - -local function printtable(tbl, lines) for i = tbl.start, tbl.finish do local rowfmt = M.csep if tbl.ncols == 0 then + tbl.colw[1] = 1 rowfmt = ('%s%s %s%s'):format(rowfmt, (' '):rep(M.npad), (' '):rep(M.npad), M.csep) @@ -204,6 +209,56 @@ local function prevcell(tbl, ln, lines) end end +local function movecell(ir, ic) + local ln = vis.win.selection.line + local lc = vis.win.selection.col + local lines = vis.win.file.lines + + if not smatch(lines[ln], M.csep) then return end + local tbl = gettable(ln, lc, lines) + + local nr = tbl.irow + ir + local nc = tbl.icol + ic + + if tbl.icol == 0 or tbl.icol > tbl.ncols then + vis:info('Not a table cell') + return + elseif not tbl[nr] or not tbl[nr][nc] then + vis:info('Table limit reached') + return + end + + switch(tbl, tbl.irow, tbl.icol, nr, nc) + printtable(tbl, lines) + gotocell(tbl, lines, nr, nc) +end + +local function movecolumn(ic) + local ln = vis.win.selection.line + local lc = vis.win.selection.col + local lines = vis.win.file.lines + + if not smatch(lines[ln], M.csep) then return end + local tbl = gettable(ln, lc, lines) + + local nc = tbl.icol + ic + + if tbl.icol == 0 or tbl.icol > tbl.ncols then + vis:info('Not a table column') + return + elseif nc == 0 or nc > tbl.ncols then + vis:info('Table limit reached') + return + end + + for i = 1, tbl.nrows do + switch(tbl, i, tbl.icol, i, nc) + end + + printtable(tbl, lines) + gotocell(tbl, lines, tbl.irow, nc) +end + local function tablemode(n) local ln = vis.win.selection.line local lc = vis.win.selection.col @@ -237,11 +292,23 @@ vis:option_register("tablemode", "bool", function(value, toggle) vis.win:map(vis.modes.INSERT, '<Tab>', function() tablemode(1) end) vis.win:map(vis.modes.NORMAL, '<S-Tab>', function() tablemode(-1) end) vis.win:map(vis.modes.INSERT, '<S-Tab>', function() tablemode(-1) end) + vis.win:map(vis.modes.NORMAL, '<C-h>', function() movecolumn(-1) end) + vis.win:map(vis.modes.NORMAL, '<C-l>', function() movecolumn(1) end) + vis.win:map(vis.modes.NORMAL, 'gh', function() movecell(0, -1) end) + vis.win:map(vis.modes.NORMAL, 'gj', function() movecell(1, 0) end) + vis.win:map(vis.modes.NORMAL, 'gk', function() movecell(-1, 0) end) + vis.win:map(vis.modes.NORMAL, 'gl', function() movecell(0, 1) end) else vis.win:unmap(vis.modes.NORMAL, '<Tab>') vis.win:unmap(vis.modes.INSERT, '<Tab>') vis.win:unmap(vis.modes.NORMAL, '<S-Tab>') vis.win:unmap(vis.modes.INSERT, '<S-Tab>') + vis.win:unmap(vis.modes.NORMAL, '<C-h>') + vis.win:unmap(vis.modes.NORMAL, '<C-l>') + vis.win:unmap(vis.modes.NORMAL, 'gh') + vis.win:unmap(vis.modes.NORMAL, 'gj') + vis.win:unmap(vis.modes.NORMAL, 'gk') + vis.win:unmap(vis.modes.NORMAL, 'gl') end return true end, 'vis table mode')