Skif-off left a comment (geany/geany-plugins#1590)

I looked at these messages in Geany and plugins, I think we can try something 
like
 ```lua
-- Replace-text.lua (cross-platform)
-- 2026.07.23
--[[
Find & replace by list. See the "aFR" table (the third parameter is the
parameters of the "geany.find" function, see
https://plugins.geany.org/geanylua/geanylua-ref.html).
Idea: https://github.com/geany/geany-plugins/issues/1590

P.S. If the found string is located at the beginning of the selection,
then for some reason after the replacement the selection starts AFTER
the replacement string. So, we will "restore" the selection.
]]

local aFR = {
{"find1", "replace1", {"matchcase"}},
{"find2", "replace2", {}},
{"find3", "replace3", {"matchcase", "wholeword"}}
}

local function IsRegExp(iN)
  if #aFR[iN][3] == 0 then return false end
  for i = 1, #aFR[iN][3] do
    if aFR[iN][3][i] == "regexp" then return true end
  end
  return false
end

local function ReplaceFull()
  local iSciM, iPS, iPE, iS, iE, iLR, iLRR
  -- SCI_BEGINUNDOACTION
  geany.scintilla(2078, 0, 0)
  for i = 1, #aFR do
    -- SCI_REPLACETARGET (2194) or SCI_REPLACETARGETRE (2195)
    if IsRegExp(i) == false then iSciM = 2194 else iSciM = 2195 end
    iPS = 0
    iPE = geany.length()
    iLR = string.len(aFR[i][2])
    while true do
      iS, iE = geany.find(aFR[i][1], iPS, iPE, aFR[i][3])
      if iS == nil then break end
      -- SCI_SETTARGETSTART
      geany.scintilla(2190, iS, 0)
      -- SCI_SETTARGETEND
      geany.scintilla(2192, iE, 0)
      -- SCI_REPLACETARGET or SCI_REPLACETARGETRE
      iLRR = geany.scintilla(iSciM, iLR, aFR[i][2])
      iPS = iS + iLRR
      iPE = geany.length()
    end
  end
  -- SCI_ENDUNDOACTION
  geany.scintilla(2079, 0, 0)
end

local function ReplaceInSel(iN1, iN2)
  local iSciM, iPS, iPE, iS, iE, iLR, iLRR
  -- SCI_BEGINUNDOACTION
  geany.scintilla(2078, 0, 0)
  iPE = iN2
  for i = 1, #aFR do
    -- SCI_REPLACETARGET (2194) or SCI_REPLACETARGETRE (2195)
    if IsRegExp(i) == false then iSciM = 2194 else iSciM = 2195 end
    iPS = iN1
    iLR = string.len(aFR[i][2])
    while true do
      iS, iE = geany.find(aFR[i][1], iPS, iPE, aFR[i][3])
      if iS == nil then break end
      -- SCI_SETTARGETSTART
      geany.scintilla(2190, iS, 0)
      -- SCI_SETTARGETEND
      geany.scintilla(2192, iE, 0)
      -- SCI_REPLACETARGET or SCI_REPLACETARGETRE
      iLRR = geany.scintilla(iSciM, iLR, aFR[i][2])
      iPS = iS + iLRR
      iPE = iPE - (iE - iS) + iLRR
    end
  end
  -- SCI_ENDUNDOACTION
  geany.scintilla(2079, 0, 0)
  return iN1, iPE
end

local sSel = geany.selection()
if sSel == nil then
  geany.message("There is no open document!")
  return
end
local iStart, iStop = geany.select()
if iStart == iStop then
  ReplaceFull()
else
  local iStartN, iStopN
  if iStart < iStop then
    iStartN, iStopN = ReplaceInSel(iStart, iStop)
    geany.select(iStartN, iStopN)
  elseif iStart > iStop then
    iStopN, iStartN = ReplaceInSel(iStop, iStart)
    geany.select(iStopN, iStartN)
  end
end

geany.status(geany.basename(geany.script) .. ": Done.")
```
But I can't test it yet.

-- 
Reply to this email directly or view it on GitHub:
https://github.com/geany/geany-plugins/issues/1590#issuecomment-5059028122
You are receiving this because you are subscribed to this thread.

Message ID: <geany/geany-plugins/issues/1590/[email protected]>

Reply via email to