Как изменить размер окна, чтобы соответствовать, с учетом только логических линий? - PullRequest
6 голосов
/ 05 февраля 2012

Я хочу написать функцию, которую я могу вызвать с карты. Идея состоит в том, чтобы изменить размер окна, чтобы оно соответствовало содержимому буфера. Это не так уж сложно:

fu! ResizeWindow(vert) "{{{
    if a:vert
        let longest = max(map(range(1, line('$')), "virtcol([v:val, '$'])"))
        exec "vertical resize " . (longest+4)
    else
        exec 'resize ' . line('$')
        1
    endif
endfu "}}}

Однако мне бы хотелось, чтобы эта функция учитывала логические линии при расчете высоты (меня не очень беспокоит ширина).

Например, обернутая строка (из-за :set wrap) будет считаться двумя или более строками. Сложенный блок из 37 строк считается только одной.

Кто-нибудь знает удобный способ получить этот «логический счетчик строк», не пытаясь вычислить его вручную? Если мне нужно сделать это вручную, есть ли другие случаи, которые я пропускаю, из-за которых строка может быть представлена ​​потенциально другим числом строк?

1 Ответ

3 голосов
/ 10 февраля 2012

Для тех, кто заинтересован, я перестал пытаться найти простое решение для этого.Ниже приведен код, которым я закончил.Он учитывает пару очевидных крайних случаев;Я уверен, что другие остаются.Предложения по улучшению приветствуются.

fu! Sum(vals) "{{{
    let acc = 0
    for val in a:vals
        let acc += val
    endfor
    return acc
endfu "}}}
fu! LogicalLineCounts() "{{{
    if &wrap
        let width = winwidth(0)
        let line_counts = map(range(1, line('$')), "foldclosed(v:val)==v:val?1:(virtcol([v:val, '$'])/width)+1")
    else
        let line_counts = [line('$')]
    endif
    return line_counts
endfu "}}}
fu! LinesHiddenByFoldsCount() "{{{
    let lines = range(1, line('$'))
    call filter(lines, "foldclosed(v:val) > 0 && foldclosed(v:val) != v:val")
    return len(lines)
endfu "}}}
fu! AutoResizeWindow(vert) "{{{
    if a:vert
        let longest = max(map(range(1, line('$')), "virtcol([v:val, '$'])"))
        exec "vertical resize " . (longest+4)
    else
        let line_counts  = LogicalLineCounts()
        let folded_lines = LinesHiddenByFoldsCount()
        let lines        = Sum(line_counts) - folded_lines
        exec 'resize ' . lines
        1
    endif
endfu "}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...