-- TIME_STAMP 2011-11-29 10:02:12 v 0.4 -- by BugFix EvtOnChar = EventClass:new(Common) -------------------------------------------------------------------------------- -- OnChar(charAdded) -- -- Generell: Kennzeichnung Operationen nach links(vorher): Kleinbuchstaben, nach rechts(hinterher): Großbuchstaben -- Trigger operations by: "!seq" -- -- repeat n-times...............seq: "!COUNTrCHAR".."!5r*"....= "*****" -- go n-words left..............seq: "!Countg"......"!5g".....= 5 words to left -- go n-words right.............seq: "!CountG"......"!5G".....= 5 words to right -- delete one word left.........seq: "!w"..........."!w"......= one word left delete -- delete n-words left..........seq: "!COUNTw"......"!5w".....= 5 words left delete -- delete one word right........seq: "!W"..........."!W"......= one word right delete -- delete n-words right.........seq: "!CountW"......"!5W".....= 5 words right delete -- delete line to start.........seq: "!l" -- delete line to end...........seq: "!L" -- swap line with line before...seq: "!s" -- swap line with line after....seq: "!S" -- -- Parameters: -- charAdded - The character typed. -------------------------------------------------------------------------------- ------------------- Deklarationen --------------------------------------- -- Ausrufezeichen (exclamation mark) als Trigger für Operationen local fTrigger = false -- Warten auf Zahleneingabe nach Trigger local fGo = false -- Warten auf Repeat-Char local fRepeat = false -- Sammelstring Zahleneingabe local sNr = '' -- table sequences local tSeq = { ['w']='w',['W']='W',['l']='l',['L']='L',['g']='g',['G']='G',['s']='s',['S']='S',['r']='r' } -- table der Zahlen local tNum = { ['0']='0',['1']='1',['2']='2',['3']='3',['4']='4',['5']='5',['6']='6',['7']='7',['8']='8',['9']='9' } -- Zeichen, die (wenn Skript dafür aktiviert) paarig ausgegeben werden tPairs = { ['(']='(',['{']='{',['[']='[',['"']='"',["'"]="'" } ------------------------------------------------------------------------ ------------------------------------------------------------------------ function SetVarsBack() fTrigger = false fGo = false fRepeat = false sNr = '' end ------------------------------------------------------------------------ ------------------------------------------------------------------------ function SwapLine(_line, _direction) editor:BeginUndoAction() local caret = editor.CurrentPos local diff, pos, textSwap, lenSwap local textBase, lenBase = editor:GetLine(_line) if lenBase == nil then lenBase = 0 end if _direction == nil then _direction = 1 end textSwap, lenSwap = editor:GetLine(_line +(_direction)) if lenSwap == nil then lenSwap = 0 end editor:GotoLine(_line) pos = editor.CurrentPos diff = caret - pos editor:SetSel(pos, pos +lenBase) editor:ReplaceSel(textSwap) editor:GotoLine(_line +(_direction)) pos = editor.CurrentPos editor:SetSel(pos, pos +lenSwap) editor:ReplaceSel(textBase) editor:GotoLine(_line) editor:GotoPos(editor.CurrentPos + diff) editor:EndUndoAction() end ------------------------------------------------------------------------ ------------------------------------------------------------------------ function RepeatChar(_pos, _charAdded) editor:BeginUndoAction() editor:SetSel(_pos -(string.len(sNr) +3) , _pos) editor:ReplaceSel(string.rep(_charAdded, tonumber(sNr))) if tPairs[_charAdded] ~= nil then _pos = editor.CurrentPos editor:SetSel(_pos, _pos+1) editor:ReplaceSel('') end editor:EndUndoAction() SetVarsBack() end ------------------------------------------------------------------------ ------------------------------------------------------------------------ function DeleteSeq(_pos, _addLen) if _addLen == nil then _addLen = 0 end editor:SetSel(_pos -(2 +_addLen), _pos) editor:ReplaceSel('') end ------------------------------------------------------------------------ ------------------------------------------------------------------------ function EvtOnChar:OnChar(_charAdded) local pos = editor.CurrentPos if fRepeat == true then RepeatChar(pos, _charAdded) SetVarsBack() -- Zeichen sNr -mal wiederholen elseif fTrigger == true then -- Ausrufezeichen wurde vorher gesetzt, Trigger ist aktiv if tNum[_charAdded] ~= nil then -- Ziffer eingegeben if fRepeat == false and fGo == false then -- kein Repeat oder Go aktiv sNr = sNr..tNum[_charAdded] -- Ziffer zum Zahlenstring hinzufügen elseif fRepeat == true then -- diese Ziffer ist das zu wiederholende Zeichen RepeatChar(pos, _charAdded) SetVarsBack() -- Ziffer sNr -mal wiederholen end elseif tSeq[_charAdded] ~= nil then -- Zeichen einer Sequenz eingegeben, Aktion ausführen if _charAdded == 'w' then if sNr ~= '' then -- sNr -Worte links löschen DeleteSeq(pos, string.len(sNr)) for i = 1, tonumber(sNr) do editor:DelWordLeft() end else DeleteSeq(pos) editor:DelWordLeft() -- ein Wort links löschen end elseif _charAdded == 'W' then if sNr ~= '' then -- sNr -Worte rechts löschen DeleteSeq(pos, string.len(sNr)) for i = 1, tonumber(sNr) do editor:DelWordRight() end else DeleteSeq(pos) editor:DelWordRight() -- ein Wort rechts löschen end elseif _charAdded == 'l' then -- Zeile bis zum Anfang löschen editor:DelLineLeft() elseif _charAdded == 'L' then -- Zeile bis zum Ende löschen DeleteSeq(pos) editor:DelLineRight() elseif _charAdded == 's' then -- Zeile mit voriger tauschen DeleteSeq(pos) SwapLine(editor:LineFromPosition(pos), -1) elseif _charAdded == 'S' then -- Zeile mit nächster tauschen DeleteSeq(pos) SwapLine(editor:LineFromPosition(pos)) elseif _charAdded == 'g' or _charAdded == 'G' then -- gehe sNr -Worte nach links/rechts if sNr == '' then SetVarsBack() return end DeleteSeq(pos, string.len(sNr)) if _charAdded == 'g' then for i = 1, tonumber(sNr) do editor:WordLeft() end end if _charAdded == 'G' then for i = 1, tonumber(sNr) do editor:WordRight() end end elseif _charAdded == 'r' then -- Repeat aktivieren, nächstes Zeichen wird sNr -mal wiederholt fRepeat = true return false end SetVarsBack() else SetVarsBack() end end if _charAdded == '!' then fTrigger = true end -- Trigger wird aktiviert return false end --> EvtOnChar ------------------------------------------------------------------------