Contar o número de linhas visíveis no documento com dobra?

7

Eu gostaria de escrever um plug-in que defina automaticamente o foldleveldocumento recém-aberto para que o máximo de documentos caiba na tela possível. (Em outras palavras, eu gostaria de garantir que os documentos curtos abram totalmente expandidos, enquanto os documentos longos abrem quase totalmente.)

Existe alguma função interna no vim que reporte o número de linhas visíveis em um documento, dado o estado atual da dobra ou um nível específico de dobra? ( Ou seja, dobras fechadas contam como uma linha, mas as linhas que você teria que rolar para baixo para ver também são contadas.)

Ryan Lue
fonte

Respostas:

6

Boa ideia! Aqui está uma função básica que atinge seu objetivo usando uma técnica diferente:

function! FitOnPage()
  normal! zR
  while &foldlevel > 0
    if line('w0') == 1 && line('w$') == line('$')
      break
    endif
    normal! zm
  endwhile
endfunction

Ele funciona expandindo primeiro todas as dobras. Em seguida, fecha as dobras (globalmente) até que o documento inteiro esteja na tela ou todas as dobras estejam fechadas.

Ele verifica se o arquivo inteiro está na tela, verificando se a primeira e a última linha exibida são a primeira e a última linha do arquivo.

Você pode melhorar um pouco fechando as dobras individualmente, mas isso seria muito mais complicado.

Rico
fonte
Essa é uma alternativa inteligente. Suponho que, se você realmente quisesse saber quantas linhas visíveis havia em todo o documento, poderia fazer algo assim normal G | let i = 0 | while line('.') > 1 | normal k | let i += 1 | endwhile. Talvez eu consiga mexer com isso neste fim de semana. Obrigado!
quer
@RyanLue Acabei de atualizar minha função para usar os line()argumentos que você mencionou em sua resposta de curta duração, em vez de mover o cursor.
Rich
Ahahaha, rapidamente retirei essa resposta depois que percebi que realmente não fazia o que eu queria que ela fizesse em primeiro lugar. Tem sido um dia de ideias cerebrais. -_-'
Ryan Lue
@RyanLue Pode não ter feito o que você queria, mas com certeza faz o que eu quero! ;)
Rich