mirror of
				https://github.com/LDDestroier/CC/
				synced 2025-10-31 15:32:59 +00:00 
			
		
		
		
	Added multi-clipboard, line # argument
Take that, EveryOS *twiddles mustache*
This commit is contained in:
		
							
								
								
									
										390
									
								
								eldit.lua
									
									
									
									
									
								
							
							
						
						
									
										390
									
								
								eldit.lua
									
									
									
									
									
								
							| @@ -3,24 +3,74 @@ | |||||||
| -- wget https://raw.githubusercontent.com/LDDestroier/CC/master/eldit.lua | -- wget https://raw.githubusercontent.com/LDDestroier/CC/master/eldit.lua | ||||||
|  |  | ||||||
| local scr_x, scr_y = term.getSize() | local scr_x, scr_y = term.getSize() | ||||||
| local tArg = {...} |  | ||||||
|  | local argData = { | ||||||
|  | 	["-l"] = "number" | ||||||
|  | } | ||||||
|  |  | ||||||
| local eldit = {} | local eldit = {} | ||||||
| eldit.filename = tArg[1] | eldit.buffer = {{}}			-- stores all text, organized like eldit.buffer[yPos][xPos] | ||||||
| eldit.buffer = {{}} | eldit.clipboards = {}		-- all clipboard entries | ||||||
| eldit.scrollX = 0 | eldit.selectedClipboard = 1	-- which clipboard to use | ||||||
| eldit.scrollY = 0 | eldit.scrollX = 0			-- horizontal scroll | ||||||
| eldit.cursors = { | eldit.scrollY = 0			-- vertical scroll | ||||||
| 	{x = 1, y = 1, lastX = 1} |  | ||||||
| } |  | ||||||
| eldit.selections = {} | eldit.selections = {} | ||||||
| eldit.size = { | eldit.size = { | ||||||
| 	x = 1, | 	x = 1,			-- top left corner X | ||||||
| 	y = 1, | 	y = 1,			-- top left corner Y | ||||||
| 	width = scr_x, | 	width = scr_x,	-- horizontal size | ||||||
| 	height = scr_y | 	height = scr_y	-- vertical size | ||||||
| } | } | ||||||
|  |  | ||||||
|  | -- I'm never using regular argument parsing again, this function rules | ||||||
|  | local interpretArgs = function(tInput, tArgs) | ||||||
|  | 	local output = {} | ||||||
|  | 	local errors = {} | ||||||
|  | 	local usedEntries = {} | ||||||
|  | 	for aName, aType in pairs(tArgs) do | ||||||
|  | 		output[aName] = false | ||||||
|  | 		for i = 1, #tInput do | ||||||
|  | 			if not usedEntries[i] then | ||||||
|  | 				if tInput[i] == aName and not output[aName] then | ||||||
|  | 					if aType then | ||||||
|  | 						usedEntries[i] = true | ||||||
|  | 						if type(tInput[i+1]) == aType or type(tonumber(tInput[i+1])) == aType then | ||||||
|  | 							usedEntries[i+1] = true | ||||||
|  | 							if aType == "number" then | ||||||
|  | 								output[aName] = tonumber(tInput[i+1]) | ||||||
|  | 							else | ||||||
|  | 								output[aName] = tInput[i+1] | ||||||
|  | 							end | ||||||
|  | 						else | ||||||
|  | 							output[aName] = nil | ||||||
|  | 							errors[1] = errors[1] and (errors[1] + 1) or 1 | ||||||
|  | 							errors[aName] = "expected " .. aType .. ", got " .. type(tInput[i+1]) | ||||||
|  | 						end | ||||||
|  | 					else | ||||||
|  | 						usedEntries[i] = true | ||||||
|  | 						output[aName] = true | ||||||
|  | 					end | ||||||
|  | 				end | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | 	for i = 1, #tInput do | ||||||
|  | 		if not usedEntries[i] then | ||||||
|  | 			output[#output+1] = tInput[i] | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  | 	return output, errors | ||||||
|  | end | ||||||
|  |  | ||||||
|  | local argList = interpretArgs({...}, argData) | ||||||
|  |  | ||||||
|  | eldit.filename = argList[1] | ||||||
|  | eldit.cursors = {{ | ||||||
|  | 	x = 1, | ||||||
|  | 	y = math.max(1, argList["-l"] or 1), | ||||||
|  | 	lastX = 1 | ||||||
|  | }} | ||||||
|  |  | ||||||
| local eClearLine = function(y) | local eClearLine = function(y) | ||||||
| 	local cx, cy = term.getCursorPos() | 	local cx, cy = term.getCursorPos() | ||||||
| 	term.setCursorPos(eldit.size.x, y or cy) | 	term.setCursorPos(eldit.size.x, y or cy) | ||||||
| @@ -86,15 +136,16 @@ local writeFile = function(path, contents) | |||||||
| 	end | 	end | ||||||
| end | end | ||||||
|  |  | ||||||
| prompt = function(prebuffer) | prompt = function(prebuffer, precy, _eldit) | ||||||
| 	local keysDown = {} | 	local keysDown = {}					-- list of all keys being pressed | ||||||
| 	local miceDown = {} | 	local miceDown = {}					-- list of all mouse buttons being pressed | ||||||
|  | 	eldit = _eldit or eldit				-- you can replace the "eldit" table if you want I guess | ||||||
| 	local defaultBarLife = 10			-- default amount of time bar msg will stay onscreen | 	local defaultBarLife = 10			-- default amount of time bar msg will stay onscreen | ||||||
| 	local barmsg = "Started Eldit."		-- message displayed on bottom screen | 	local barmsg = "Started Eldit."		-- message displayed on bottom screen | ||||||
| 	local barlife = defaultBarLife | 	local barlife = defaultBarLife | ||||||
| 	local lastMouse = {}				-- last place you clicked onscreen | 	local lastMouse = {}				-- last place you clicked onscreen | ||||||
| 	local isSelecting = false			-- whether or not you are selecting text | 	local isSelecting = false			-- whether or not you are selecting text | ||||||
| 	if type(prebuffer) == "string" then | 	if type(prebuffer) == "string" then	-- enter a "prebuffer" (string or table) to set the contents | ||||||
| 		for i = 1, #prebuffer do | 		for i = 1, #prebuffer do | ||||||
| 			if prebuffer:sub(i,i) == "\n" then | 			if prebuffer:sub(i,i) == "\n" then | ||||||
| 				eldit.buffer[#eldit.buffer + 1] = {} | 				eldit.buffer[#eldit.buffer + 1] = {} | ||||||
| @@ -105,9 +156,10 @@ prompt = function(prebuffer) | |||||||
| 	elseif type(prebuffer) == "table" then | 	elseif type(prebuffer) == "table" then | ||||||
| 		eldit.buffer = prebuffer | 		eldit.buffer = prebuffer | ||||||
| 	end | 	end | ||||||
| 	local isCursorBlink = false | 	local isCursorBlink = false			-- blinks the background color on each cursor | ||||||
| 	local isInsert = false | 	local isInsert = false				-- will overwrite characters instead of appending them | ||||||
|  |  | ||||||
|  | 	-- list of all characters that will stop a CTRL+Backspace or CTRL+Delete or CTRL+Left/Right | ||||||
| 	local interruptable = { | 	local interruptable = { | ||||||
| 		[" "] = true, | 		[" "] = true, | ||||||
| 		["["] = true, ["]"] = true, | 		["["] = true, ["]"] = true, | ||||||
| @@ -124,6 +176,8 @@ prompt = function(prebuffer) | |||||||
| 		[","] = true | 		[","] = true | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	-- goes over every selection and checks if it is selected | ||||||
|  | 	-- (x, y) = position on buffer | ||||||
| 	local checkIfSelected = function(x, y) | 	local checkIfSelected = function(x, y) | ||||||
| 		sortSelections() | 		sortSelections() | ||||||
| 		local fin | 		local fin | ||||||
| @@ -157,6 +211,8 @@ prompt = function(prebuffer) | |||||||
| 		return false | 		return false | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	-- goes over every cursor and checks if they are at (x, y) | ||||||
|  | 	-- (x,y) = position on buffer | ||||||
| 	local checkIfCursor = function(x, y) | 	local checkIfCursor = function(x, y) | ||||||
| 		for id, cur in pairs(eldit.cursors) do | 		for id, cur in pairs(eldit.cursors) do | ||||||
| 			if x == cur.x and y == cur.y then | 			if x == cur.x and y == cur.y then | ||||||
| @@ -166,6 +222,7 @@ prompt = function(prebuffer) | |||||||
| 		return false | 		return false | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	-- returns character at (x, y) on the buffer | ||||||
| 	local getChar = function(x, y) | 	local getChar = function(x, y) | ||||||
| 		if eldit.buffer[y] then | 		if eldit.buffer[y] then | ||||||
| 			return eldit.buffer[y][x] | 			return eldit.buffer[y][x] | ||||||
| @@ -174,6 +231,7 @@ prompt = function(prebuffer) | |||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	-- the big boi function, draws **EVERYTHING** | ||||||
| 	local render = function() | 	local render = function() | ||||||
| 		local cx, cy | 		local cx, cy | ||||||
| 		local tab = { | 		local tab = { | ||||||
| @@ -227,6 +285,7 @@ prompt = function(prebuffer) | |||||||
| 			else | 			else | ||||||
| 				term.write(" ") | 				term.write(" ") | ||||||
| 			end | 			end | ||||||
|  | 			-- actually draw text | ||||||
| 			for x = lineNoLen + 1, eldit.size.width do | 			for x = lineNoLen + 1, eldit.size.width do | ||||||
| 				term.setCursorPos(eldit.size.x + x - 1, eldit.size.y + y - 1) | 				term.setCursorPos(eldit.size.x + x - 1, eldit.size.y + y - 1) | ||||||
| 				cx = x + eldit.scrollX - lineNoLen | 				cx = x + eldit.scrollX - lineNoLen | ||||||
| @@ -270,11 +329,13 @@ prompt = function(prebuffer) | |||||||
| 			term.write(barmsg) | 			term.write(barmsg) | ||||||
| 		else | 		else | ||||||
| 			for id,cur in pairs(eldit.cursors) do | 			for id,cur in pairs(eldit.cursors) do | ||||||
| 				term.write("(" .. cur.x .. "," .. cur.y .. ") ") | 				--term.write("(" .. cur.x .. "," .. cur.y .. ") ") | ||||||
|  | 				term.write(#eldit.selections) | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	-- if all cursors are offscreen, will scroll so that at least one of them is onscreen | ||||||
| 	local scrollToCursor = function() | 	local scrollToCursor = function() | ||||||
| 		lineNoLen = #tostring(#eldit.buffer) | 		lineNoLen = #tostring(#eldit.buffer) | ||||||
| 		local lowCur, highCur = eldit.cursors[1], eldit.cursors[1] | 		local lowCur, highCur = eldit.cursors[1], eldit.cursors[1] | ||||||
| @@ -303,6 +364,7 @@ prompt = function(prebuffer) | |||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	-- gets the widest line length in all the buffer | ||||||
| 	local getMaximumWidth = function() | 	local getMaximumWidth = function() | ||||||
| 		local maxX = 0 | 		local maxX = 0 | ||||||
| 		for y = 1, #eldit.buffer do | 		for y = 1, #eldit.buffer do | ||||||
| @@ -311,7 +373,10 @@ prompt = function(prebuffer) | |||||||
| 		return maxX | 		return maxX | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	-- scrolls the screen, and fixes it if it's set to some weird value | ||||||
| 	local adjustScroll = function(modx, mody) | 	local adjustScroll = function(modx, mody) | ||||||
|  | 		modx, mody = modx or 0, mody or 0 | ||||||
|  | 		local lineNoLen = #tostring(#eldit.buffer) | ||||||
| 		if mody then | 		if mody then | ||||||
| 			eldit.scrollY = math.min( | 			eldit.scrollY = math.min( | ||||||
| 				math.max( | 				math.max( | ||||||
| @@ -338,6 +403,7 @@ prompt = function(prebuffer) | |||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	-- removes any cursors that share positions | ||||||
| 	local removeRedundantCursors = function() | 	local removeRedundantCursors = function() | ||||||
| 		local xes = {} | 		local xes = {} | ||||||
| 		for i = #eldit.cursors, 1, -1 do | 		for i = #eldit.cursors, 1, -1 do | ||||||
| @@ -349,6 +415,7 @@ prompt = function(prebuffer) | |||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
|  | 	-- deletes text at every cursor position, either forward or backward or neutral | ||||||
| 	local deleteText = function(mode, direction, _cx, _cy) | 	local deleteText = function(mode, direction, _cx, _cy) | ||||||
| 		local xAdjList = {} | 		local xAdjList = {} | ||||||
| 		local yAdj = 0 | 		local yAdj = 0 | ||||||
| @@ -442,81 +509,7 @@ prompt = function(prebuffer) | |||||||
| 		return yAdj | 		return yAdj | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	local deleteSelections = function() | 	-- moves the cursor by (xmod, ymod), and fixes its position if it's set to an invalid one | ||||||
| 		sortSelections() |  | ||||||
| 		if #eldit.selections == 0 then |  | ||||||
| 			return {}, {} |  | ||||||
| 		end |  | ||||||
| 		local xAdjusts = {} |  | ||||||
| 		local yAdjusts = {} |  | ||||||
| 		local xAdj = 0 |  | ||||||
| 		local yAdj = 0 |  | ||||||
| 		for y = 1, #eldit.buffer do |  | ||||||
| 			xAdjusts[y] = {} |  | ||||||
| 			if checkIfSelected(#eldit.buffer[y] + 1, y) then |  | ||||||
| 				yAdj = yAdj + 1 |  | ||||||
| 			end |  | ||||||
| 			yAdjusts[y + 1] = yAdj |  | ||||||
| 			xAdj = 0 |  | ||||||
| 			for x = 2, #eldit.buffer[y] do |  | ||||||
| 				xAdjusts[y][x] = xAdj |  | ||||||
| 				if checkIfSelected(x, y) then |  | ||||||
| 					xAdj = xAdj + 1 |  | ||||||
| 				end |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 		for y = #eldit.buffer, 1, -1 do |  | ||||||
| 			for x = #eldit.buffer[y] + 1, 1, -1 do |  | ||||||
|  |  | ||||||
| 				if checkIfSelected(x, y) then |  | ||||||
| 					if x == #eldit.buffer[y] + 1 then |  | ||||||
| 						for i = 1, #eldit.buffer[y + 1] do |  | ||||||
| 							table.insert(eldit.buffer[y], eldit.buffer[y + 1][i]) |  | ||||||
| 						end |  | ||||||
| 						table.remove(eldit.buffer, y + 1) |  | ||||||
| 					else |  | ||||||
| 						deleteText("single", nil, x, y) |  | ||||||
| 					end |  | ||||||
| 				end |  | ||||||
|  |  | ||||||
| 			end |  | ||||||
| 		end |  | ||||||
| 		eldit.selections = {} |  | ||||||
| 		return xAdjusts, yAdjusts |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	local placeText = function(text) |  | ||||||
| 		local xAdjusts, yAdjusts = deleteSelections() |  | ||||||
| 		removeRedundantCursors() |  | ||||||
| 		sortCursors() |  | ||||||
| 		local xAdjList = {} |  | ||||||
| 		for id,cur in pairs(eldit.cursors) do |  | ||||||
| 			cur.y = cur.y - (yAdjusts[cur.y] or 0) |  | ||||||
| 			cur.x = cur.x - ((xAdjusts[cur.y] or {})[cur.x] or 0) + (xAdjList[cur.y] or 0) |  | ||||||
| 			for i = 1, #text do |  | ||||||
| 				if isInsert then |  | ||||||
| 					if cur.x == #eldit.buffer[cur.y] + 1 then |  | ||||||
| 						for i = 1, #eldit.buffer[cur.y + 1] do |  | ||||||
| 							table.insert(eldit.buffer[cur.y], eldit.buffer[cur.y + 1][i]) |  | ||||||
| 						end |  | ||||||
| 						table.remove(eldit.buffer, cur.y + 1) |  | ||||||
| 					end |  | ||||||
| 					eldit.buffer[cur.y][cur.x + i - 1] = text:sub(i,i) |  | ||||||
| 				else |  | ||||||
| 					table.insert(eldit.buffer[cur.y], cur.x, text:sub(i,i)) |  | ||||||
| 					if #xAdjusts + #yAdjusts == 0 then |  | ||||||
| 						xAdjList[cur.y] = (xAdjList[cur.y] or 0) + 1 |  | ||||||
| 					end |  | ||||||
| 				end |  | ||||||
| 				cur.x = cur.x + 1 |  | ||||||
| 			end |  | ||||||
| 			cur.lastX = cur.x |  | ||||||
| 		end |  | ||||||
| 		if not isSelecting then |  | ||||||
| 			scrollToCursor() |  | ||||||
| 		end |  | ||||||
| 	end |  | ||||||
|  |  | ||||||
| 	local adjustCursor = function(_xmod, _ymod, setLastX, mode) | 	local adjustCursor = function(_xmod, _ymod, setLastX, mode) | ||||||
| 		for id,cur in pairs(eldit.cursors) do | 		for id,cur in pairs(eldit.cursors) do | ||||||
| 			if mode == "word" then | 			if mode == "word" then | ||||||
| @@ -575,8 +568,89 @@ prompt = function(prebuffer) | |||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	local makeNewLine = function() | 	-- deletes the parts of the buffer that are selected, then clears the selection list | ||||||
| 		for id,cur in pairs(eldit.cursors) do | 	local deleteSelections = function() | ||||||
|  | 		sortSelections() | ||||||
|  | 		if #eldit.selections == 0 then | ||||||
|  | 			return {}, {} | ||||||
|  | 		end | ||||||
|  | 		local xAdjusts = {} | ||||||
|  | 		local yAdjusts = {} | ||||||
|  | 		local xAdj = 0 | ||||||
|  | 		local yAdj = 0 | ||||||
|  | 		for y = 1, #eldit.buffer do | ||||||
|  | 			xAdjusts[y] = {} | ||||||
|  | 			if checkIfSelected(#eldit.buffer[y] + 1, y) then | ||||||
|  | 				yAdj = yAdj + 1 | ||||||
|  | 			end | ||||||
|  | 			yAdjusts[y + 1] = yAdj | ||||||
|  | 			xAdj = 0 | ||||||
|  | 			for x = 2, #eldit.buffer[y] do | ||||||
|  | 				xAdjusts[y][x] = xAdj | ||||||
|  | 				if checkIfSelected(x, y) then | ||||||
|  | 					xAdj = xAdj + 1 | ||||||
|  | 				end | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  | 		for y = #eldit.buffer, 1, -1 do | ||||||
|  | 			for x = #eldit.buffer[y] + 1, 1, -1 do | ||||||
|  |  | ||||||
|  | 				if checkIfSelected(x, y) then | ||||||
|  | 					if x == #eldit.buffer[y] + 1 then | ||||||
|  | 						if eldit.buffer[y + 1] then | ||||||
|  | 							for i = 1, #eldit.buffer[y + 1] do | ||||||
|  | 								table.insert(eldit.buffer[y], eldit.buffer[y + 1][i]) | ||||||
|  | 							end | ||||||
|  | 							table.remove(eldit.buffer, y + 1) | ||||||
|  | 						end | ||||||
|  | 					else | ||||||
|  | 						deleteText("single", nil, x, y) | ||||||
|  | 					end | ||||||
|  | 				end | ||||||
|  |  | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  | 		eldit.selections = {} | ||||||
|  | 		adjustCursor(0, 0, true) | ||||||
|  | 		return xAdjusts, yAdjusts | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	-- puts text at every cursor position | ||||||
|  | 	local placeText = function(text, cursorList) | ||||||
|  | 		local xAdjusts, yAdjusts = deleteSelections() | ||||||
|  | 		removeRedundantCursors() | ||||||
|  | 		sortCursors() | ||||||
|  | 		local xAdjList = {} | ||||||
|  | 		for id,cur in pairs(cursorList or eldit.cursors) do | ||||||
|  | 			cur.y = cur.y - (yAdjusts[cur.y] or 0) | ||||||
|  | 			cur.x = cur.x - ((xAdjusts[cur.y] or {})[cur.x] or 0) + (xAdjList[cur.y] or 0) | ||||||
|  | 			for i = 1, #text do | ||||||
|  | 				if isInsert then | ||||||
|  | 					if cur.x == #eldit.buffer[cur.y] + 1 then | ||||||
|  | 						for i = 1, #eldit.buffer[cur.y + 1] do | ||||||
|  | 							table.insert(eldit.buffer[cur.y], eldit.buffer[cur.y + 1][i]) | ||||||
|  | 						end | ||||||
|  | 						table.remove(eldit.buffer, cur.y + 1) | ||||||
|  | 					end | ||||||
|  | 					eldit.buffer[cur.y][cur.x + i - 1] = text:sub(i,i) | ||||||
|  | 				else | ||||||
|  | 					table.insert(eldit.buffer[cur.y], cur.x, text:sub(i,i)) | ||||||
|  | 					if #xAdjusts + #yAdjusts == 0 then | ||||||
|  | 						xAdjList[cur.y] = (xAdjList[cur.y] or 0) + 1 | ||||||
|  | 					end | ||||||
|  | 				end | ||||||
|  | 				cur.x = cur.x + 1 | ||||||
|  | 			end | ||||||
|  | 			cur.lastX = cur.x | ||||||
|  | 		end | ||||||
|  | 		if not isSelecting then | ||||||
|  | 			scrollToCursor() | ||||||
|  | 		end | ||||||
|  | 	end | ||||||
|  |  | ||||||
|  | 	-- adds a new line to the buffer at every cursor position | ||||||
|  | 	local makeNewLine = function(cursorList) | ||||||
|  | 		for id,cur in pairs(cursorList or eldit.cursors) do | ||||||
| 			table.insert(eldit.buffer, cur.y + 1, {}) | 			table.insert(eldit.buffer, cur.y + 1, {}) | ||||||
| 			for i = cur.x, #eldit.buffer[cur.y] do | 			for i = cur.x, #eldit.buffer[cur.y] do | ||||||
| 				if i > cur.x or not isInsert then | 				if i > cur.x or not isInsert then | ||||||
| @@ -592,7 +666,8 @@ prompt = function(prebuffer) | |||||||
| 		end | 		end | ||||||
| 	end | 	end | ||||||
|  |  | ||||||
| 	saveFile = function() | 	-- saves to file, duhh | ||||||
|  | 	local saveFile = function() | ||||||
| 		local compiled = "" | 		local compiled = "" | ||||||
| 		for y = 1, #eldit.buffer do | 		for y = 1, #eldit.buffer do | ||||||
| 			compiled = compiled .. table.concat(eldit.buffer[y]) | 			compiled = compiled .. table.concat(eldit.buffer[y]) | ||||||
| @@ -610,6 +685,34 @@ prompt = function(prebuffer) | |||||||
| 	local bartID = os.startTimer(0.1)	-- timer for bar message to go away | 	local bartID = os.startTimer(0.1)	-- timer for bar message to go away | ||||||
| 	local doRender = true				-- if true, renders | 	local doRender = true				-- if true, renders | ||||||
|  |  | ||||||
|  | 	-- converts numerical key events to usable numbers | ||||||
|  | 	local numToKey = { | ||||||
|  | 		-- number bar | ||||||
|  | 		[2] = 1, | ||||||
|  | 		[3] = 2, | ||||||
|  | 		[4] = 3, | ||||||
|  | 		[5] = 4, | ||||||
|  | 		[6] = 5, | ||||||
|  | 		[7] = 6, | ||||||
|  | 		[8] = 7, | ||||||
|  | 		[9] = 8, | ||||||
|  | 		[10] = 9, | ||||||
|  | 		[11] = 0, | ||||||
|  | 		-- number pad | ||||||
|  | 		[79] = 1, | ||||||
|  | 		[80] = 2, | ||||||
|  | 		[81] = 3, | ||||||
|  | 		[75] = 4, | ||||||
|  | 		[76] = 5, | ||||||
|  | 		[77] = 6, | ||||||
|  | 		[71] = 7, | ||||||
|  | 		[72] = 8, | ||||||
|  | 		[73] = 9, | ||||||
|  | 		[82] = 0, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	-- here we go my man | ||||||
|  | 	scrollToCursor() | ||||||
| 	while true do | 	while true do | ||||||
| 		evt = {os.pullEvent()} | 		evt = {os.pullEvent()} | ||||||
| 		if evt[1] == "timer" then | 		if evt[1] == "timer" then | ||||||
| @@ -625,15 +728,74 @@ prompt = function(prebuffer) | |||||||
| 				bartID = os.startTimer(0.1) | 				bartID = os.startTimer(0.1) | ||||||
| 				barlife = math.max(0, barlife - 1) | 				barlife = math.max(0, barlife - 1) | ||||||
| 			end | 			end | ||||||
| 		elseif evt[1] == "char" or evt[1] == "paste" then | 		elseif (evt[1] == "char" and not keysDown[keys.leftCtrl]) then | ||||||
| 			placeText(evt[2]) | 			placeText(evt[2]) | ||||||
| 			doRender = true | 			doRender = true | ||||||
|  | 		elseif evt[1] == "paste" then | ||||||
|  | 			if keysDown[keys.leftShift] then | ||||||
|  | 				local cb = eldit.clipboards[eldit.selectedClipboard] | ||||||
|  | 				if cb then | ||||||
|  | 					deleteSelections() | ||||||
|  | 					sortCursors() | ||||||
|  | 					for i = 1, #cb do | ||||||
|  | 						if eldit.cursors[i] then | ||||||
|  | 							for y = 1, #cb[i] do | ||||||
|  | 								placeText(table.concat(cb[i][y]), {eldit.cursors[i]}) | ||||||
|  | 								if y < #cb[i] then | ||||||
|  | 									makeNewLine({eldit.cursors[i]}) | ||||||
|  | 								end | ||||||
|  | 							end | ||||||
|  | 						else | ||||||
|  | 							makeNewLine({eldit.cursors[#eldit.cursors]}) | ||||||
|  | 							for y = 1, #cb[i] do | ||||||
|  | 								placeText(table.concat(cb[i][y]), {eldit.cursors[#eldit.cursors]}) | ||||||
|  | 								if y < #cb[i] then | ||||||
|  | 									makeNewLine({eldit.cursors[#eldit.cursors]}) | ||||||
|  | 								end | ||||||
|  | 							end | ||||||
|  | 						end | ||||||
|  | 					end | ||||||
|  | 					barmsg = "Pasted from clipboard " .. eldit.selectedClipboard .. "." | ||||||
|  | 				else | ||||||
|  | 					barmsg = "Clipboard is empty." | ||||||
|  | 				end | ||||||
|  | 				barlife = defaultBarLife | ||||||
|  | 			else | ||||||
|  | 				placeText(evt[2]) | ||||||
|  | 			end | ||||||
|  | 			doRender = true | ||||||
| 		elseif evt[1] == "key" then | 		elseif evt[1] == "key" then | ||||||
| 			keysDown[evt[2]] = true | 			keysDown[evt[2]] = true | ||||||
| 			-- KEYBOARD SHORTCUTS | 			-- KEYBOARD SHORTCUTS | ||||||
| 			if keysDown[keys.leftCtrl] or keysDown[keys.leftCtrl] then | 			if keysDown[keys.leftCtrl] or keysDown[keys.rightCtrl] then | ||||||
|  |  | ||||||
| 				if evt[2] == keys.backspace then | 				if keysDown[keys.leftShift] or keysDown[keys.rightShift] then | ||||||
|  | 					if evt[2] == keys.c then | ||||||
|  | 						eldit.clipboards[eldit.selectedClipboard] = {} | ||||||
|  | 						local cb = eldit.clipboards[eldit.selectedClipboard] | ||||||
|  | 						sortSelections() | ||||||
|  | 						local id, selY | ||||||
|  | 						for y = 1, #eldit.buffer do | ||||||
|  | 							for x = 1, #eldit.buffer[y] do | ||||||
|  | 								id = checkIfSelected(x, y) | ||||||
|  | 								if id then | ||||||
|  | 									selY = y - eldit.selections[id][1].y + 1 | ||||||
|  | 									cb[id] = cb[id] or {} | ||||||
|  | 									cb[id][selY] = cb[id][selY] or {} | ||||||
|  | 									table.insert(cb[id][selY], eldit.buffer[y][x]) | ||||||
|  | 								end | ||||||
|  | 							end | ||||||
|  | 						end | ||||||
|  | 						barmsg = "Copied to clipboard " .. eldit.selectedClipboard .. "." | ||||||
|  | 						barlife = defaultBarLife | ||||||
|  | 					end | ||||||
|  | 					-- In-editor pasting is done with the "paste" event! | ||||||
|  | 				else | ||||||
|  | 					if numToKey[evt[2]] then -- if that's a number then | ||||||
|  | 						eldit.selectedClipboard = numToKey[evt[2]] | ||||||
|  | 						barmsg = "Selected clipboard " .. eldit.selectedClipboard .. "." | ||||||
|  | 						barlife = defaultBarLife | ||||||
|  | 					elseif evt[2] == keys.backspace then | ||||||
| 						if #eldit.selections > 0 then | 						if #eldit.selections > 0 then | ||||||
| 							deleteSelections() | 							deleteSelections() | ||||||
| 						else | 						else | ||||||
| @@ -684,6 +846,7 @@ prompt = function(prebuffer) | |||||||
| 						doRender, isCursorBlink = true, true | 						doRender, isCursorBlink = true, true | ||||||
|  |  | ||||||
| 					end | 					end | ||||||
|  | 				end | ||||||
|  |  | ||||||
| 			else | 			else | ||||||
|  |  | ||||||
| @@ -705,7 +868,7 @@ prompt = function(prebuffer) | |||||||
| 						lastX = 1 | 						lastX = 1 | ||||||
| 					}} | 					}} | ||||||
| 					scrollToCursor() | 					scrollToCursor() | ||||||
| 					doRender = true | 					doRender, isCursorBlink = true, true | ||||||
|  |  | ||||||
| 				elseif evt[2] == keys["end"] then | 				elseif evt[2] == keys["end"] then | ||||||
| 					eldit.cursors = {{ | 					eldit.cursors = {{ | ||||||
| @@ -714,7 +877,7 @@ prompt = function(prebuffer) | |||||||
| 						lastX = #eldit.buffer[eldit.cursors[1].y] + 1 | 						lastX = #eldit.buffer[eldit.cursors[1].y] + 1 | ||||||
| 					}} | 					}} | ||||||
| 					scrollToCursor() | 					scrollToCursor() | ||||||
| 					doRender = true | 					doRender, isCursorBlink = true, true | ||||||
|  |  | ||||||
| 				elseif evt[2] == keys.pageUp then | 				elseif evt[2] == keys.pageUp then | ||||||
| 					adjustScroll(0, -eldit.size.height) | 					adjustScroll(0, -eldit.size.height) | ||||||
| @@ -796,21 +959,32 @@ prompt = function(prebuffer) | |||||||
| 			if lastMouse.x and lastMouse.y and lastMouse.curID then | 			if lastMouse.x and lastMouse.y and lastMouse.curID then | ||||||
| 				local adjMX, adjMY = lastMouse.x + lastMouse.scrollX, lastMouse.y + lastMouse.scrollY | 				local adjMX, adjMY = lastMouse.x + lastMouse.scrollX, lastMouse.y + lastMouse.scrollY | ||||||
| 				local adjEX, adjEY = evt[3] + eldit.scrollX, evt[4] + eldit.scrollY | 				local adjEX, adjEY = evt[3] + eldit.scrollX, evt[4] + eldit.scrollY | ||||||
| 				eldit.selections[#eldit.selections + ((lastMouse.ctrl or not isSelecting) and 1 or 0)] = { | 				local selID | ||||||
|  | 				if (lastMouse.ctrl and not isSelecting) or #eldit.selections == 0 then | ||||||
|  | 					selID = #eldit.selections + 1 | ||||||
|  | 				else | ||||||
|  | 					selID = #eldit.selections + 0 | ||||||
|  | 				end | ||||||
|  | 				eldit.selections[selID] = { | ||||||
| 					{ | 					{ | ||||||
| 						x = math.min(adjMX, #eldit.buffer[adjMY] + lineNoLen) - lineNoLen, | 						x = math.min(adjMX, #(eldit.buffer[adjMY] or "") + lineNoLen) - lineNoLen, | ||||||
| 						y = adjMY | 						y = adjMY | ||||||
| 					}, | 					}, | ||||||
| 					{ | 					{ | ||||||
| 						x = math.min(adjEX, #eldit.buffer[adjEY] + lineNoLen) - lineNoLen, | 						x = math.min(adjEX, #(eldit.buffer[adjEY] or "") + lineNoLen) - lineNoLen, | ||||||
| 						y = adjEY | 						y = adjEY | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
|  | 				if isSelecting then | ||||||
|  | 					--lastMouse.ctrl = false | ||||||
|  | 				end | ||||||
|  | 				sortSelections() | ||||||
| 				eldit.cursors[lastMouse.curID] = { | 				eldit.cursors[lastMouse.curID] = { | ||||||
| 					x = eldit.selections[#eldit.selections][1].x, | 					x = eldit.selections[selID][1].x, | ||||||
| 					y = eldit.selections[#eldit.selections][1].y, | 					y = eldit.selections[selID][1].y, | ||||||
| 					lastX = eldit.selections[#eldit.selections][1].x | 					lastX = eldit.selections[selID][1].x | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				isSelecting = true | 				isSelecting = true | ||||||
| 				adjustCursor(0, 0) | 				adjustCursor(0, 0) | ||||||
| 				doRender = true | 				doRender = true | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 LDDestroier
					LDDestroier