2017-03-31 6 views
0

Der SciTE-Editor verfügt über eine eingebettete Lua-Scripting-Engine mit Zugriff auf den Textpuffer des Editors. Dies ermöglicht es, SciTEs Funktionalität mit Werkzeugen zu erweitern, die in Lua programmiert und über das Menü Extras gestartet wurden. Ein solches Werkzeug zur Verfügung, von hier:SciTE-Sortierauswahl-Werkzeug: Zahlen mit führenden Leerzeichen sind nicht wie erwartet sortiert

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

ist ein Werkzeug für die in alphabetischer Reihenfolge der ausgewählten Linien zu sortieren. ärgerlich für mich war/ist, dass es nicht Linien nicht sortieren ihrer numerischen Reihenfolge mit Zahlen in dieser, aber ich mag:

1 
    111 
    2 
    222 
    3 
    333 

, wo ich würde eher erwarten:

1 
    2 
    3 
    111 
    222 
    333 

Google und Co. sind nicht Dies ist sehr hilfreich, da meines Wissens keine Lösung für dieses Problem online verfügbar ist. Es ist auch nicht so einfach, die Lua-Dokumentation für table.sort() zu finden und zu verstehen. Die Frage für einen kenntnisreichen Lua-Programmierer wäre also, wie man den vorhandenen Lua-Skriptcode am besten anpasst, so dass Zahlen (und auch Zeilen mit führenden Leerzeichen) wie erwartet und der Lua-Code für diese Aufgabe sortiert werden läuft so schnell, dass selbst das Sortieren riesiger Dateien (50 MByte und mehr) nicht viel Zeit in Anspruch nimmt?

Antwort

1

Ihre Erwartungen sind falsch. Sie sagten, der Algorithmus soll die Texte alphabetisch sortieren und das ist genau das, was sie tut.

Für Lua ist "11" kleiner als "2". Ich denke, Sie würden zustimmen, dass "aa" vor "b" kommen sollte, was ziemlich das Gleiche ist.

Wenn Sie ändern möchten, wie Texte sortiert werden, müssen Sie eine eigene Funktion angeben.

Das Lua-Referenzhandbuch sagt:

table.sort (Liste [, comp])

Sortierungen Listenelemente in einer bestimmten Reihenfolge, an Ort und Stelle, von der Liste [1] bis Liste [#Liste]. Wenn comp angegeben wird, muss es eine Funktion sein, die zwei Listenelemente empfängt und true zurückgibt, wenn das erste Element vor dem zweiten in der endgültigen Reihenfolge stehen muss (so dass nach der Sortierung i < j nicht comp (Liste [j], Liste [i])). Wenn comp nicht angegeben wird, wird dann der Standard-Lua-Operator < verwendet.

Beachten Sie, dass die Comp-Funktion eine strenge Teilaufordnung über der Elemente in der Liste definieren muss; das heißt, es muss asymmetrisch und transitiv sein. Andernfalls ist möglicherweise keine gültige Sortierung möglich.

Der Sortieralgorithmus ist nicht stabil: Elemente, die durch die gegebene -Ordnung als gleich angesehen werden, können ihre relativen Positionen durch die Sortierung geändert haben.

Sie können also Ihre eigene Comp-Funktion implementieren, um die Sortierung zu ändern.

Standardmäßig table.sort(list) Sortierliste in aufsteigender Reihenfolge. Um es sortieren in absteigender Reihenfolge Sie rufen:

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

Wenn Sie Zahlen behandeln wollen anders man etwas tun kann:

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 

, die Sie die Ausgabe

2 
3 
11 
111 
a 
b 
geben würde,

Natürlich ist dies nur ein schnelles und einfaches Beispiel. Eine schönere Implementierung liegt bei Ihnen.

0

Unter was ich schließlich mit mir selbst kam. Es ist sicher, dass eine schnelle und schmutzige Lösung, die die ohnehin schon langsam

verlangsamt (im Vergleich zu jEdit [Plugins] -> [Text Tools] -> [Zeilen sortieren] oder Befehlszeile Bash 'sortiert -g')

Prozess der Sortierung riesiger Puffer von Textzeilen, aber es ist zumindest für den Einsatz und funktioniert wie erwartet. Der Vollständigkeit halber hier der gesamte Codeabschnitt, der momentan in meinem Lua Startup Script für SciTE vorhanden ist:

-- ============================================================================= 
-- 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 
-- ----------------------------------------------------------------------------- 
Verwandte Themen