El editor SciTE viene con un motor de script Lua incorporado que tiene acceso al búfer de texto del editor. Esto permite ampliar la funcionalidad de SciTE con herramientas programadas en Lua y comenzadas desde el menú Herramientas. Una de esas herramientas disponible desde aquí:

http://lua-users.org/wiki/SciteSortSelection

Es una herramienta para ordenar las líneas seleccionadas en orden alfabético. Molesto para mí fue / es que no ordena las líneas que contienen números en su orden numérico, pero así:

    1
  111
    2
  222
    3
  333

Donde preferiría esperar:

    1
    2
    3
  111
  222
  333

Google y Co. no son de mucha ayuda aquí, ya que no tengo conocimiento de que haya una solución disponible para este problema en línea. Tampoco es tan fácil de encontrar y comprender profundamente la documentación de Lua para table.sort (). Entonces, la pregunta para un programador experto de Lua sería, ¿cuál es la mejor manera de parchear el código de script Lua existente, para que los números (y también las líneas con texto en caso de espacios iniciales) se ordenen como se espera y el código Lua para esta tarea funciona tan rápido que incluso la clasificación de archivos enormes (50 MByte y más) no tomará mucho tiempo.

0
Claudio 1 abr. 2017 a las 02:46

2 respuestas

La mejor respuesta

Tu expectativa está mal. Dijiste que se supone que el algoritmo ordena los textos alfabéticamente y eso es exactamente lo que hace.

Para Lua "11" es más pequeño que "2". Creo que estaría de acuerdo en que "aa" debería venir antes que "b", que es más o menos lo mismo.

Si desea cambiar la forma en que se ordenan los textos, debe proporcionar su propia función.

El manual de referencia de Lua dice:

table.sort (list [, comp])

Ordena los elementos de la lista en un orden dado, en el lugar, desde la lista [1] a la lista [#list]. Si se proporciona comp, entonces debe ser una función que recibe dos elementos de la lista y devuelve verdadero cuando el primer elemento debe venir antes que el segundo en el orden final (de modo que, después del ordenamiento, i

Tenga en cuenta que la función comp debe definir un orden parcial estricto sobre los elementos de la lista; es decir, debe ser asimétrico y transitivo. De lo contrario, no es posible una clasificación válida.

El algoritmo de ordenamiento no es estable: los elementos considerados iguales por el orden dado pueden tener sus posiciones relativas cambiadas por el ordenamiento.

Por lo tanto, puede implementar su propia función de compilación para cambiar la clasificación.

Por defecto table.sort(list) ordena la lista en orden ascendente. Para que se ordene en orden descendente, llame a:

table.sort(list, function(a,b) return a > b end)

Si desea tratar los números de manera diferente, puede hacer algo como esto:

t = {"111", "11", "3", "2", "a", "b"}

local function myCompare(a,b)
    local a_number = tonumber(a)
    local b_number = tonumber(b)
    if a_number and b_number then
       return a_number < b_number
    end
end

table.sort(t, myCompare)

for i,v in ipairs(t) do
    print(v)
end

Que te daría la salida

2
3
11
111
a
b

Por supuesto, este es solo un ejemplo rápido y simple. Una mejor implementación depende de usted.

1
Piglet 1 abr. 2017 a las 09:01

Debajo de lo que finalmente se me ocurrió. Es seguro una solución rápida y sucia que frena lo que ya es lento

(en comparación con jEdit [Complementos] -> [Herramientas de texto] -> [Ordenar líneas] o con la línea de comando bash 'sort -g')

Proceso de clasificar enormes buffers de líneas de texto, pero al menos está ahí para su uso y funciona como se esperaba. En aras de la exhaustividad aquí, la sección completa de código actualmente presente en mi Lua Startup Script para SciTE:

-- =============================================================================
-- Sort Selected Lines (available in MENU -> Tools):
-- -----------------------------------------------------------
-- Specify in .SciTEUser.properties:
--     command.name.2.*=# Sort Selected Lines    '
--     command.subsystem.2.*=3
--     command.mode.2.*=savebefore:no
--     command.2.*=SortSelectedLines
--     # command.shortcut.2.*=Ctrl+2 # Ctrl+2 is DEFAULT for command.2.*

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

-- It was an annoying for me that using table.sort(buffer) in Lua  
-- didn't sort numbers with leading spaces in their numerical order. 
-- Using following comparison function helps to avoid that problem: 
function compare(a,b)
  return a:gsub(" ", "0") < b:gsub(" ", "0")
-- If 'compare' is not used ( table.sort(buf) )
-- Lua uses implicit for sorting (see Lua tutorial): 
--   return a < b
-- so changing the provided return statement to this above
-- would be enough to restore sorting to how it was before 
end

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

--  ---------
-- :Sort Selected Lines
-- -----------------------------------------------------------------------------
1
Claudio 16 abr. 2017 a las 16:46