- Offizieller Beitrag
Hi,
Edit 28.11.2011
aus der einen Funktion RepeatChar habe ich nun eine kleine Sammlung gemacht. Die Syntax habe ich auch etwas verändert.
Ich wollte mich erst an vi orientieren, habe nun aber eine eigene Syntax erstellt, die meines Erachtens nachvollziehbar ist.
Edit 29.11.2011
Sry, war ein kleiner Bug drin - mit "!" wurde Sequenz aktiviert und nicht abgebrochen, wenn kein Zeichen einer Sequenz folgte - gefixt.
Neu: n-Worte links/rechts Löschen
-- Generell: Kennzeichnung Operationen nach links(vorher): Kleinbuchstaben, nach rechts(hinterher): Großbuchstaben
-- Trigger für alle Operationen: "!seq"
--
-- Wiederholen n-mal...........seq: "!COUNTrCHAR"...."!5r*" = "*****"
-- Gehe n-Worte nach links.....seq: "!COUNTg"........"!5g" = 5 Worte nach links
-- Gehe n-Worte nach rechts....seq: "!COUNTG"........"!5G" = 5 Worte nach rechts
-- Lösche ein Wort links.......seq: "!w" ( w-Word )
-- Lösche ein Wort rechts......seq: "!W"
-- Lösche n-Worte links........seq: "!COUNTw"........"!5w" = 5 Worte links löschen
-- Lösche n-Worte rechts.......seq: "!COUNTW"........"!5W" = 5 Worte rechts löschen
-- Lösche Zeile nach links.....seq: "!l" ( l-Line )
-- Lösche Zeile nach rechts....seq: "!L"
-- Tausche Zeile mit voriger...seq: "!s" ( s-Swap )
-- Tausche Zeile mit nächster..seq: "!S"
EditOperations.lua(0.4)
-- 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
------------------------------------------------------------------------
Alles anzeigen
Integration in SciTE:
- Das Skript im SciTE-Ordner speichern.
- Eintrag im "SciTEStartup.lua" vornehmen: LoadLuaFile("RepeatChar.lua")LoadLuaFile("EditOperations.lua")
Die Datei sollte dann etwa so aussehen:
SciTEStartup.lua
-- TIME_STAMP 2011-11-27 11:51:04 v 0.1
--------------------------------------------------------------------------------
-- SciTE startup script.
--------------------------------------------------------------------------------
-- A table listing all loaded files.
LoadLuaFileList = { }
--------------------------------------------------------------------------------
-- LoadLuaFile(file, directory)
--
-- Helper function for easily loading Lua files.
--
-- Parameters:
-- file - The name of a Lua file to load.
-- directory - If specified, file is looked for in that directory. By default,
-- this directory is $(SciTEDefaultHome)\Lua.
--------------------------------------------------------------------------------
function LoadLuaFile(file, directory)
if directory == nil then
directory = props["SciteDefaultHome"] .. "\\Lua\\"
end
table.insert(LoadLuaFileList, directory .. file)
dofile(directory .. file)
end -- LoadLuaFile()
-- Load all the Lua files.
LoadLuaFile("Class.lua") -- Always load first.
LoadLuaFile("Common.lua") -- Always load second.
LoadLuaFile("AutoItPixmap.lua")
LoadLuaFile("AutoHScroll.lua")
LoadLuaFile("AutoItAutoComplete.lua")
LoadLuaFile("LoadSession.lua")
LoadLuaFile("AutoItIndentFix.lua")
LoadLuaFile("EdgeMode.lua")
LoadLuaFile("SmartAutoCompleteHide.lua")
LoadLuaFile("Tools.lua")
LoadLuaFile("AutoItTools.lua")
LoadLuaFile("AutoItGotoDefinition.lua")
--~ LoadLuaFile("AutoCloseBraces.lua") -- don't use together with "EdgingSelection.lua"
-- Start up the events (Calls OnStartup()).
EventClass:BeginEvents()
-- Files are using EventClass must load after Events startup
LoadLuaFile("AutoStampSaveVersion.lua") -- use Event: "OnBeforeSave"
LoadLuaFile("MyDebug.lua")
LoadLuaFile("EdgingSelection.lua") -- use Event: "OnKey"
LoadLuaFile("EditOperations.lua") -- use Event: "OnChar"
Alles anzeigen
Anschließend SciTE neu starten (oder wenn vorhanden das ReloadStartup ausführen), dann ist das Tool aktiv.