2017-02-09 1 views
2

Ich habe eine Liste von Symbolen und möchte die Vim8-Timer-API verwenden, um alle 80ms die Symbolliste zu durchlaufen und dieses Symbol zurückzugeben. Ich arbeitete heraus etwas wie folgt aus:VimL Druckwerte in einer Liste unendlich

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}) 

Aber sobald es das letzte Symbol in der Liste erreicht, wird es einen Fehler aus, E684: list index out of range: 10. Irgendwelche Ideen, um zu erreichen, was ich will?

Antwort

3

Sie müssen die 1 in Klammern vor dem mod

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

1 % s:numTestimonials haben immer 1 und ausgewertet wird, bevor s Zugabe:

+0

d'oh ... ich hatte das ursprünglich, aber es gab mir Probleme bezüglich eines anderen Syntaxfehlers. Danke für die Antwort! Nun, um herauszufinden, wie der zurückgegebene Wert in einem Statusliniensegment gedruckt wird – mhartington

2

einige kleine Änderungen vorgenommen, um Ihren Code starten (Getestet auf 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