vis-tables - Vis plugin for writing tables
ssh://anon@thyssentishman.com/vis-tables
Log | Files | Refs | Feed | Contribute | README | LICENSE

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')