2017-03-31 15 views
0

SciTE 편집기는 편집기의 텍스트 버퍼에 액세스 할 수있는 내장 루아 스크립팅 엔진과 함께 제공됩니다. 이를 통해 Lua에서 프로그래밍되고 도구 메뉴에서 시작된 도구로 SciTE의 기능을 확장 할 수 있습니다. 여기에서 제공 한 이러한 도구 :SciTE 정렬 선택 도구 : 선행 공백이있는 숫자가 예상대로 정렬되지 않음

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

는 알파벳 순서로 선택된 라인의 정렬을위한 도구입니다. 나를 위해 성가신 은 /이었다 그들의 숫자 순서대로 숫자를 포함 라인을 정렬하지 않는다는 것입니다 그러나이 같은 :

1 
    111 
    2 
    222 
    3 
    333 

는 차라리 기대 여기서

1 
    2 
    3 
    111 
    222 
    333 

구글과 유한 없습니다 이 문제에 대한 해결책은 아직 온라인 상태가 아니기 때문에 많은 도움이됩니다. table.sort()에 대한 루아 문서를 찾아 내고 이해하는 것도 쉽지는 않습니다. 그래서 지식이 풍부한 루아 프로그래머를위한 질문은, 기존의 루아 스크립트 코드를 패치하는 가장 좋은 방법은 무엇입니까? (또한 공백 문자의 경우 텍스트가있는 행)가 예상대로 정렬되고이 작업을위한 루아 코드 너무 빨리 실행되므로 대용량 파일 (50MB 이상)을 정렬해도 시간이 많이 걸리지 않을 것입니다.

답변

1

귀하의 기대가 잘못되었습니다. 당신은 알고리즘이 텍스트를 사전 순으로 정렬하고 그것이 정확히 무엇인지를 말했습니다.

루아의 경우 "11"은 "2"보다 작습니다. 나는 "aa"가 "b"와 같아야한다는 것에 동의 할 것입니다.

텍스트 정렬 방법을 변경하려면 사용자 고유의 기능을 제공해야합니다.

루아 메뉴얼 말한다리스트에서 [1] 리스트

table.sort (목록 [완])에 적절한 소정의 순서

정렬리스트 요소, [#명부]. comp가 주어지면 이 두 개의 목록 요소를 받고 첫 번째 요소 이 최종 순서의 두 번째 앞에 와야하는 경우 true를 반환해야합니다. 따라서 정렬 후에는 < j는 comp (list [j], list [i])). comp가 지정되지 않은 경우 표준 Lua 연산자 <이 대신 사용됩니다.

comp 함수는 목록의 요소를 보다 엄격한 부분 순서로 정의해야합니다. 즉, 비대칭이어야하고 전이 적이어야합니다. 그렇지 않으면 유효한 정렬이 불가능할 수 있습니다.

정렬 알고리즘이 안정적이지 않습니다. 지정된 순서대로 으로 간주되는 요소의 정렬 기준이 상대 위치로 변경 될 수 있습니다.

그래서 자신의 comp 함수를 자유롭게 구현하여 정렬을 변경할 수 있습니다.

기본적으로 table.sort(list) 오름차순으로 정렬 할 수 있습니다. 이 정렬 순서를 내림차순으로 그것을 확인하려면 전화 :

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 

출력

2 
3 
11 
111 
a 
b 
당신에게 줄 것이다 : 당신이 다른 숫자를 치료하려면

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

는이 같은 작업을 수행 할 수 있습니다

물론 이것은 단지 빠르고 간단한 예입니다. 더 효과적인 구현은 귀하에게 달려 있습니다.

0

아래에 내가 결국 나 자신을 생각해 냈습니다. 그것은 이미 느린 속도가 느려 신속하고 더러운 솔루션 있는지의

(jEdit과 [플러그인]에 비해 -> [텍스트 도구] -> [정렬 선] 또는 '종류 -g'명령 줄을 비난하는)

텍스트 행의 거대한 버퍼를 정렬하는 프로세스이지만 최소한 사용하기에 충분하며 예상대로 작동합니다. 여기에 코드의 전체 섹션이 현재 SciTE 용 내 Lua 스타트 업 스크립트에 있습니다 :

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