require("vis") par_prg = "par" function print(...) _print_ = _print_ or io.open("/tmp/visprint", "w") _print_:write(..., "\n") end --- Dump value of a variable in a formatted string -- --- @param o table Dumpable object --- @param tbs string|nil Tabulation string, ' ' by default --- @param tb number|nil Initial tabulation level, 0 by default --- @return string local function dump(o, tbs, tb) tb = tb or 0 tbs = tbs or " " if type(o) == "table" then local s = "{" if (next(o)) then s = s .. "\n" else return s .. "}" end tb = tb + 1 for k, v in pairs(o) do if type(k) ~= "number" then k = '"' .. k .. '"' end s = s .. tbs:rep(tb) .. "[" .. k .. "] = " .. dump(v, tbs, tb) s = s .. ",\n" end tb = tb - 1 return s .. tbs:rep(tb) .. "}" else return tostring(o) end end -- fp = io.popen("foo >/tmp/unique", "w") -- fp:write(anything) -- fp:close() -- fp = io.open("/tmp/unique") -- x = read("*a") -- fp:close() local supress_stdout = " >/dev/null" local supress_stderr = " 2>/dev/null" local supress_output = supress_stdout .. supress_stderr -- Return nil or a string of misspelled word in a specific file range or text -- by calling the spellchecker's list command. -- If given a range we will use vis:pipe to get our typos from the spellchecker. -- If a string was passed we call the spellchecker ourself and redirect its stdout -- to a temporary file. See http://lua-users.org/lists/lua-l/2007-10/msg00189.html. -- The returned string consists of each misspell followed by a newline. local function run_par(cmd, params, inp) local out print("cmd = " .. cmd .. ", params = " .. params .. ", inp = " .. inp .. ", (" .. type(inp) .. ")") if type(inp) == "string" then -- local full_cmd = cmd .. " " .. params .. " > " .. tmp_name -- print("full_cmd = " .. full_cmd) -- local tmp_name = os.tmpname() -- local proc = assert(io.popen(full_cmd, "w")) -- print("proc = " .. type(proc)) -- proc:write(inp) -- -- this error detection may need lua5.2 -- proc:flush() -- local exit_code = proc:close() -- -- local tmp_file = assert(io.open(tmp_name, "r")) -- out = tmp_file:read("*a") -- tmp_file:close() -- print("out = " .. out) -- -- os.remove(tmp_name) out = vis:pipe(vis.win.file, inp, cmd .. params) if exit_code then print(tostring(exit_code)) print("calling " .. full_cmd .. " failed (" .. out .. ")") return nil end else local range = inp local ret, so, _ = vis:pipe(vis.win.file, range, cmd) if ret ~= 0 then print("calling " .. cmd .. " failed (" .. ret .. ")") return nil end out = so end return out end function lines(str) local t = {} local function helper(line) table.insert(t, line) return "" end helper((str:gsub("(.-)\r?\n", helper))) return t end getmetatable(_VERSION).__index.lines = lines function hanging_symbol(line, nspc) -- itemized list if line:find("^[-+*] ", nspc) then return nspc + 1 -- one for space end local beg, fin = line:find("^%d+%. ", nspc) if beg then return fin + 1 end return nspc -- no hanging idennt end vis:operator_new( "gq", function(file, range, pos) local out = "" local segment = {} local p_arg = 0 local range_lines = file:content(range):lines() local ex_args = "ET4w65" for _, line in ipairs(range_lines) do local beg, beg_spc_len = line:find("^%s*") assert(beg == 1, "There is no way this would not be 1.") local non_spc_idx = line:len() >= beg_spc_len + 1 and beg_spc_len + 1 or 0 print("non_spc_idx = " .. non_spc_idx) if non_spc_idx ~= 0 then -- FIXME This is wrong, no two cycles if p_arg == 0 then p_arg = "p" .. hanging_symbol(line, non_spc_idx) end print("segment = " .. dump(segment) .. ", p_arg = " .. p_arg) table.insert(segment, line) else -- this is an empty line, so do whole circus FIXME if next(segment) then local new_text = run_par(par_prg, ex_args .. p_arg, table.concat(segment, "\n")) segment = {} p_arg = 0 out = out .. new_text .. "\n\n" end end end if out:len() == 0 then print("Cannot process paragraph.") else file:delete(range) file:insert(range.start, out) end return range.start -- new cursor location end, "Formating operator, filter range through formatting filter" ) vis:option_register( "autoformat", "bool", function(value, toogle) if not vis.win then return false end vis.win.autoformat = toogle and not vis.win.autoformat or value print("Option autoformat = " .. tostring(vis.win.autoformat)) return true end, "Automatically format current paragraph." )