Вопрос первый
Вот функция для перечисления абзацев. Просто сделайте :call EnumeratePara()
в любом месте вашего файла. Переменная indent
может быть изменена по вашему желанию. Дайте мне знать, если что-то нужно исправить или объяснить.
function! EnumeratePara()
let indent=5
let lnum=1
let para=1
let next_is_new_para=1
while lnum <= line("$")
let this = getline(lnum)
if this =~ "^ *$"
let next_is_new_para=1
elseif next_is_new_para==1 && this !~ "^ *$"
call cursor(lnum,1)
sil exe "normal i" . para . repeat(" ",indent-len(para))
let para+=1
let next_is_new_para=0
else
call cursor(lnum,1)
sil exe "normal i" . repeat(" ",indent)
endif
let lnum+=1
endwhile
endfunction
Вопрос второй
Это не очень элегантный подход, но, похоже, он работает. Прежде всего, вот функция, которая отображает каждую строку в файле на номер абзаца:
function! MapLinesToParagraphs()
let lnum=1
let para_lines=[]
let next_is_new_para=1
let current_para=0
while lnum <= line("$")
let this = getline(lnum)
if this =~ "^ *$"
let next_is_new_para=1
elseif next_is_new_para==1
let current_para+=1
let next_is_new_para=0
endif
call add(para_lines,current_para)
let lnum+=1
endwhile
return para_lines
endfunction
Так что para_lines [i] даст абзац строки i.
Теперь мы можем использовать существующую функцию IndexByWord () и использовать MapLinesToParagraph () для преобразования номеров строк в номера абзацев, прежде чем мы их вернем:
function! IndexByParagraph( wordlist )
let temp_dict = {}
let para_lines = MapLinesToParagraphs()
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]*")))')
call map(res_list, 'para_lines[v:val]')
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
Я не очень тщательно тестировал эти функции, но, похоже, они работают нормально, по крайней мере, в вашем примере текста. Дайте мне знать, как вы поживаете!