Вот пересмотренная версия функции, опубликованной принцем Гуляшем.Эта версия принимает список слов в качестве входных данных и возвращает отформатированную и алфавитизированную строку результата:
function! IndexByWord( wordlist )
let temp_dict = {}
for word in a:wordlist
redir => result
sil! exe ':g/' . word . '/#'
redir END
let tmp_list = split(strtrans(result),"\\^\@ *")
let res_list = []
call map(tmp_list, 'add(res_list,str2nr(matchstr(v:val,"^[0-9]*")))')
let temp_dict[word] = res_list
endfor
let result_list = []
for key in sort(keys(temp_dict))
call add(result_list, key . ' : ' . string(temp_dict[key])[1:-2])
endfor
return join(result_list, "\n")
endfunction
Один из способов вызвать это будет:
echo IndexByWord(['word1', 'word2', 'word3', etc])
Не должно бытьпроблема с длинным списком слов, хотя в этом случае вы, вероятно, захотите использовать переменную списка, и получение результатов, конечно, займет больше времени.Например:
let my_word_list = ['word1', 'word2', . . . 'word1000']
echo IndexByWord(my_word_list)