2014-12-01 3 views
0

Экспериментируя с vimscript и читая замечательный Learn Vimscript the Hard Way (LVTHW), я понял, что Vim не сортировал числа так, как я этого хотел.Сортировка чисел в vimscript

Например, эта функция из LVTHW

function! Sorted(l) 
    let new_list = deepcopy(a:l) 
    call sort(new_list) 
    return new_list 
endfunction 

удивил меня, когда я назвал его Sorted([3, 1, 11, 2]):

Он вернулся [1, 11, 2, 3].

Я думаю, что Vim сортирует эти цифры в алфавитном порядке. Но я бы ожидал, что функция вернет номера в natural order: [1, 2, 3, 11]

Как я могу убедить Vim (7.4) сделать это?

ответ

0

Фокус в том, чтобы передать sort Vim функцию компаратора, которая в моем случае я позвонил NaturalOrder.

" Sorts numbers in ascending order. 
" Examples: 
" [2, 3, 1, 11, 2] --> [1, 2, 2, 3, 11] 
" ['2', '1', '10','-1'] --> [-1, 1, 2, 10] 
function! Sorted(list) 
    " Make sure the list consists of numbers (and not strings) 
    " This also ensures that the original list is not modified 
    let nrs= ToNrs(a:list) 
    let sortedList = sort(nrs, "NaturalOrder") 
    echo sortedList 
    return sortedList 
endfunction 

" Comparator function for natural ordering of numbers 
function! NaturalOrder(firstNr, secondNr) 
    if a:firstNr < a:secondNr 
    return -1 
    elseif a:firstNr > a:secondNr 
    return 1 
    else 
    return 0 
    endif 
endfunction 

" Coerces every element of a list to a number. Returns a new list without 
" modifying the original list. 
function! ToNrs(list) 
    let nrs = [] 
    for elem in a:list 
    let nr = 0 + elem 
    call add(nrs, nr) 
    endfor 
    return nrs 
endfunction 
0

, если вы читали помощь документ о sort() функции, вы увидите, что вы можете дать n для {func} параметра а, чтобы позволить сортировать сделать числовую сортировку:

пример:

:echo sort([3,1,11,2],'n') 
[1, 2, 3, 11] 
+0

Hi Kent. Спасибо за Ваш ответ. Я прочитал документацию и не упоминает трюк 'n'. Также, когда я выполняю ': echo sort ([3,1,11,2], 'n')' Я получаю сообщение об ошибке «Неизвестная функция: n'. Какую версию Vim вы используете? –

+0

@MatthiasBraun Я использую 'vim 7.4.473':' Когда задано {func}, и это 'n', тогда все позиции будут \t \t отсортированный номер ' – Kent

+0

Я вижу. Итак, 'n' является функцией, подобной' NaturalOrder' в этом [ответе] (https://stackoverflow.com/questions/27226987/sort-numbers-in-vimscript/27232550?noredirect=1#27226988), правильно? –

Смежные вопросы