Это полностью не проверено, и я уверен, что есть более элегантные методы, но это должно дать вам грубое представление. Я сканирую каждую строку в файле по одной и делаю отступ, если выполняется одно из ваших условий.
function! Indenter()
let winview=winsaveview()
try
let this_line_num=1
let tw = &textwidth
while this_line_num <= line("$")
let thisline=getline(this_line_num)
let lastline=getline(this_line_num-1)
let firstchar=substitute(matchstr(thisline,"^ *.")," ","","g")
if ( matchstr(lastline,"^.") == "" && this_line_num > 1 )
\ || firstchar =~# "[A-Z]"
\ || ( tw == 0 && strlen(thisline) > 80 )
\ || ( tw != 0 && strlen(thisline) > tw-10
\ && firstchar !~# "[A-Z]" )
sil exe this_line_num . "s#^# #"
endif
let this_line_num+=1
endwhile
finally
call winrestview(winview)
endtry
endfunction
Я предполагаю, что "пустые строки" означают отсутствие пробелов (следовательно, matchstr(lastline,"^.")
), и что строки, содержащие текст, могут иметь начальные пробелы (следовательно, команда substitute(matchstr())
для получения первого непробельного символа.
Надеюсь, это поможет. Дайте мне знать, если он падает на его лицо.