Jump to content

SciTE - some more LUA functions for editing in SciTE


BugFix
 Share

Recommended Posts

Hi,

thats the idea behind:

Initiate of editing operations with a short command sequence.

As char to trigger sequences, i've used the exclamation mark. Because in most cases the exclamation mark stands alone, only followed by spaces or CR/LF.

The script header shows, what you can do.

------------------- Description -----------------------------------------
-- EvtOnChar(charAdded)
--
-- Generally:
-- ..........Labeling operations on: left or before: lower case/ right or after: upper case
-- Used chars:
-- r.........Repeat char
-- g/G.......Go (word)
-- w/W.......Word (delete)
-- l/L.......Line (delete)
-- s/S.......Swap (line)
-- Trigger operations by: "!seq"
--
-- repeat n-times...............seq:  "!COUNTrCHAR"...."!5r*"....= "*****"
-- go n-words left..............seq:  "!COUNTg"........"!5g".....= go 5 words to left
-- go n-words right.............seq:  "!CountG"........"!5G".....= go 5 words to right
-- delete one word left.........seq:  "!w"............."!w"......= one word left delete
-- delete one word right........seq:  "!W"............."!W"......= one word right delete
-- delete n-words left..........seq:  "!COUNTw"........"!5w".....= 5 words left delete
-- delete n-words right.........seq:  "!CountW"........"!5W".....= 5 words right delete
-- delete line to start.........seq:  "!l".......................= deletes in current line from caret to start
-- delete line to end...........seq:  "!L".......................= deletes in current line from caret to end
-- swap line with line before...seq:  "!s"
-- swap line with line after....seq:  "!S"
--
-- Parameters:
--   charAdded - The character typed.
-------------------------------------------------------------------------

"Swap lines" is a basic funtion in SciTE, but Tidy has stolen the shortcut for this. :)

I think the syntax is easy to use. In most cases i use repetition, swap lines and delete line to start/end.

I hope, that is also usefull for some others.

Note:

If you don't use a script for auto completion of paired chars ( ' " ( { [ ), it is required to comment the script line #76!

EditOperations[v0.8].lua

-- TIME_STAMP   2011-12-16 12:46:18   v 0.8
-- by BugFix


EvtOnChar = EventClass:new(Common)
------------------- Description -----------------------------------------
-- EvtOnChar(charAdded)
--
-- Generally:
-- ..........Labeling operations on: left or before: lower case/ right or after: upper case
-- Used chars:
-- r.........Repeat char
-- g/G.......Go (word)
-- w/W.......Word (delete)
-- l/L.......Line (delete)
-- s/S.......Swap (line)
-- Trigger operations by: "!seq"
--
-- repeat n-times...............seq:  "!COUNTrCHAR"...."!5r*"....= "*****"
-- go n-words left..............seq:  "!COUNTg"........"!5g".....= go 5 words to left
-- go n-words right.............seq:  "!CountG"........"!5G".....= go 5 words to right
-- delete one word left.........seq:  "!w"............."!w"......= one word left delete
-- delete one word right........seq:  "!W"............."!W"......= one word right delete
-- delete n-words left..........seq:  "!COUNTw"........"!5w".....= 5 words left delete
-- delete n-words right.........seq:  "!CountW"........"!5W".....= 5 words right delete
-- delete line to start.........seq:  "!l".......................= deletes in current line from caret to start
-- delete line to end...........seq:  "!L".......................= deletes in current line from caret to end
-- swap line with line before...seq:  "!s"
-- swap line with line after....seq:  "!S"
--
-- Parameters:
--   charAdded - The character typed.
-------------------------------------------------------------------------

------------------- Declarations ----------------------------------------
-- exclamation mark as trigger
local fTrigger = false
-- wait for char to repeat
local fRepeat = false
-- string to collect given numbers
local sNr = ''
-- table sequences
local tSeq = { 'w','W','l','L','g','G','s','S','r' }
-- table numbers
local tNum = { '0','1','2','3','4','5','6','7','8','9' }
-- table of (opening) paired chairs, (if auto close braces is active)
local tPairs  = { '(','{','[','"',"'" }
-------------------------------------------------------------------------

------------------- Helper Functions ------------------------------------
local fH = {}
fH.tContains   = function(_t, _value) for i, val in pairs(_t) do if _t[i] == _value then return true end end return false end
fH.SetVarsBack = function() fTrigger = false fRepeat = false sNr = '' end
fH.DeleteSeq   = function(_pos, _addLen) if _addLen == nil then _addLen = 0 end editor:SetSel(_pos -(2 +_addLen), _pos) editor:ReplaceSel('') end
-------------------------------------------------------------------------

------------------- Sequence Functions ----------------------------------
local fS = {}
fS['w'] = function(_pos) if sNr ~= '' then fH.DeleteSeq(_pos, string.len(sNr)) for i = 1, tonumber(sNr) do editor:DelWordLeft() end else fH.DeleteSeq(_pos) editor:DelWordLeft() end return true end
fS['W'] = function(_pos) if sNr ~= '' then fH.DeleteSeq(_pos, string.len(sNr)) for i = 1, tonumber(sNr) do editor:DelWordRight() end else fH.DeleteSeq(_pos) editor:DelWordRight() end return true end
fS['l'] = function(_pos) editor:DelLineLeft() return true end
fS['L'] = function(_pos) editor:GotoPos(_pos-2) editor:DelLineRight() return true end
fS['s'] = function(_pos) fH.DeleteSeq(_pos) fS.SwapLine(editor:LineFromPosition(_pos), -1) return true end
fS['S'] = function(_pos) fH.DeleteSeq(_pos) fS.SwapLine(editor:LineFromPosition(_pos)) return true end
fS['g'] = function(_pos) if sNr == '' then return true else fH.DeleteSeq(_pos, string.len(sNr)) for i = 1, tonumber(sNr) do editor:WordLeft() end end return true end
fS['G'] = function(_pos) if sNr == '' then return true else fH.DeleteSeq(_pos, string.len(sNr)) for i = 1, tonumber(sNr) do editor:WordRight() end end return true end
fS['r'] = function(_pos) if sNr == '' then fH.SetVarsBack() return true else fRepeat = true return false end end
fS.SwapLine =    function(_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
fS.RepeatChar = function(_pos, _charAdded) editor:BeginUndoAction() editor:SetSel(_pos -(string.len(sNr) +3) , _pos) editor:ReplaceSel(string.rep(_charAdded, tonumber(sNr)))
                    -- by using auto close braces:
                    -- if repeating char is an opening char from paired chars - the last inserted char triggers additional insert of closing char - must delete that
                    if fH.tContains(tPairs, _charAdded) then _pos = editor.CurrentPos editor:SetSel(_pos, _pos+1) editor:ReplaceSel('') end
                    -- comment the line before, if you don't use a auto close braces function!
                    editor:EndUndoAction() fH.SetVarsBack() end
-------------------------------------------------------------------------

-------------------------------------------------------------------------
function EvtOnChar:OnChar(_charAdded)
    local pos = editor.CurrentPos
    if fRepeat then
        fS.RepeatChar(pos, _charAdded) fH.SetVarsBack()                -- repeat _charAdded sNr -times
    elseif fTrigger then                                                  -- exclamation mark was set - trigger is active
        if fH.tContains(tNum, _charAdded) then                          -- input is number
            if fRepeat == false then                                      -- not activated "repeat"
                sNr = sNr.._charAdded                                    -- add number to string of numbers
            elseif fRepeat then                                        -- activated "repeat"
                fS.RepeatChar(pos, _charAdded) fH.SetVarsBack()        -- repeat this number sNr -times
            end
        elseif fH.tContains(tSeq, _charAdded) then                      -- _charAdded is a sequence identifier
            if not fS[_charAdded](pos) then return false end              -- call the related sequence function
            fH.SetVarsBack()
        else
            fH.SetVarsBack()
        end
    end
    if _charAdded == '!' then fTrigger = true end                        -- activate "trigger"
    return false
end  --> EvtOnChar
-------------------------------------------------------------------------

Integration in SciTE:

- Rename the appended file to "EditOperations.lua" (i have used *.txt, attach *.lua is impossible)

- Save the file "EditOperations.lua" in your folder "..SciTELUA"

- Open the SciTE startup script "..SciTELUASciTEStartup.lua"

- Add new Entry at the end of file: LoadLuaFile("EditOperations.lua")

- Reload startup script or restart SciTE and this works

EditOperations.txt

Edited by BugFix

Best Regards BugFix  

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...