Scite Sort Selection

lua-users home
wiki

The functions below will sort the selected text in alphabetical or alphabetical reverse order. The lines() function has been updated to work on Lua 5.1 or SciTE 1.74+. The new lines() function allows for a missing newline at the end of the selected block. The sort routines also restores the final newline after sorting if there is one. If \n newlines are used, the file size should not change after script execution.

Enjoy!

-- Sort a selected text

function lines(str)
  local t = {}
  local i, lstr = 1, #str
  while i <= lstr do
    local x, y = string.find(str, "\r?\n", i)
    if x then t[#t + 1] = string.sub(str, i, x - 1)
    else break
    end
    i = y + 1
  end
  if i <= lstr then t[#t + 1] = string.sub(str, i) end
  return t
end

function sort_text()
  local sel = editor:GetSelText()
  if #sel == 0 then return end
  local eol = string.match(sel, "\n$")
  local buf = lines(sel)
  --table.foreach(buf, print) --used for debugging
  table.sort(buf)
  local out = table.concat(buf, "\n")
  if eol then out = out.."\n" end
  editor:ReplaceSel(out)
end

function sort_text_reverse()
  local sel = editor:GetSelText()
  if #sel == 0 then return end
  local eol = string.match(sel, "\n$")
  local buf = lines(sel)
  --table.foreach(buf, print) --used for debugging
  table.sort(buf, function(a, b) return a > b end)
  local out = table.concat(buf, "\n")
  if eol then out = out.."\n" end
  editor:ReplaceSel(out)
end

If empty lines are to be ignored, or there are always no empty lines in the selection to be sorted, the following lines() function is more simple:

function lines(str)
  local t = {}
  for ln in string.gmatch(str, "[^\r\n]+") do
    t[#t + 1] = ln
  end
  return t
end

The old lines() function, from StringRecipes suitable for pre-SciTE 1.74 (Lua 5.0.x) is as follows:

function lines(str)
  local t = {n = 0}
  local function helper(line) table.insert(t, line) end
  helper((string.gsub(str, "(.-)\r?\n", helper)))
  return t
end

WalterCruz, KeinHongMan


RecentChanges · preferences
edit · history
Last edited November 18, 2007 8:42 am GMT (diff)