2017-02-09 10 views
2

У меня есть список символов и вы хотите использовать API-интерфейс таймеров Vim8 для циклического перебора списка символов каждые 80 мс и возврата этого символа. Я разработал что-то вроде этого:VimL печатает значения в списке бесконечно

let s:frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] 
let s:numTestimonials = len(s:frames) 
let s:start = 0 

function! PrintValues() 
    return s:frames[s:start] 
    let s:start = (s:start) + 1 % s:numTestimonials 
endfunction 

let timer = timer_start(80, 'PrintValues', {'repeat': -1}) 

Но как только он достигает последний символ в списке, он выдаст ошибку, E684: list index out of range: 10. Любые идеи, как выполнить то, что я хочу?

ответ

3

Вы должны иметь 1 в скобках перед модом

let s:start = (s:start + 1) % s:numTestimonials 

1 % s:numTestimonials всегда 1 и оценивается, прежде чем добавить s: начать

+0

d'ой ... Я Первоначально, но это давало мне проблемы, связанные с некоторой другой синтаксической ошибкой. Спасибо за ответ! Теперь, чтобы выяснить, как напечатать возвращаемое значение в сегменте статусной линии – mhartington

2

Некоторые небольшие изменения, внесенные в код (Проверено на Vim 7.4):

let timer = timer_start(500, 'PrintValues', {'repeat': -1}) 
let s:frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] 
let s:numTestimonials = len(s:frames) 
let s:start = 0 

function! PrintValues(timer) 
    execute "normal! i".s:frames[s:start] 
    let s:start = (s:start + 1) % s:numTestimonials 
endfunction 

enter image description here