Ocultar completamente certas linhas (sem dobrar)

9

Eu gostaria de poder ocultar algumas linhas no meu buffer (e poder alterná-las). Encontrei perguntas semelhantes , mas elas não resolvem o meu problema. Não quero usar dobras para isso.

O que eu quero exatamente?

Quando abro um documento, desejo que o Vim não leia nas linhas comentadas. Deve se comportar como se essas linhas não existissem no documento, com apenas uma exceção: preciso de um indicador visual (por exemplo, em uma coluna adicional ao lado) que me diga que aqui está um comentário que não é exibido.

Ao pressionar uma certa combinação de teclas, desejo que todos os comentários apareçam (ou seja, comportamento normal do Vim).

Quero poder modificar o documento com comentários não exibidos. Ao salvar, o documento inteiro é salvo com comentários (eles sempre são salvos 1 linha acima do texto que estava abaixo deles no início).

Por que eu quero isso?

Destrói menos e parece visualmente mais agradável. Pegue o .vimrcexemplo - você pode ter todas as configurações bem abaixo uma da outra. Se você deseja alterar alguma coisa ou não sabe ao certo por que a define dessa maneira, basta alternar seus comentários.

cbaumhardt
fonte
Espero que você não se importe com a minha pergunta ... Por que você está especificamente excluindo dobras?
Roflo
1
É claro que não :) Excluí dobras porque sei recolher comentários com dobras - mas os comentários dobrados ainda distraem, dificultam o fluxo de leitura e não são realmente atraentes visualmente.
cbaumhardt
Eu quero um monte de coisas também, mas eu descobri que é geralmente melhor stick / se adaptar ao que eu preciso;)
VanLaser
@cbaumhardt você pode dobrá-lo e usar um personalizado / função de ajuste 'foldtext' para esconder tudo
Christian Brabandt

Respostas:

8

Não sei como conseguir exatamente o que você deseja, apenas uma parte.

Você deseja ocultar algum texto dentro ~/.vimrc(por exemplo).

Primeiro, precisamos saber qual grupo de destaque lida com o texto que você deseja ocultar. Adicione este mapeamento ao seu ~/.vimrc:

map <F10> :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<'
\ . synIDattr(synID(line("."),col("."),0),"name") . "> lo<"
\ . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"<CR>

Eu peguei daqui .

Em seguida, coloque o cursor em algum texto que você deseja ocultar, por exemplo, um comentário. Então aperte F10.
O nome do grupo de destaque deve aparecer na linha de comando.
No meu sistema, a saída é:

hi<vimLineComment> trans<vimLineComment> lo<Comment>

Eu acho que isso significa que o grupo de destaque dos comentários do vim é vimLineCommente ao qual está vinculado Comment. Portanto, queremos ocultar o texto tratado pelo grupo de destaque vimLineComment(ou Comment).

Para conseguir isso, poderíamos usar o recurso ocultar adicionado no vim 7.3 ( :help conceal).

:syntax match vimLineComment "^\".*" conceal containedin=ALL cchar=>

Essa linha instrui o vim a pesquisar texto cujo grupo de destaque é vimLineCommente que corresponde ao regex ^\".*(o início de uma linha ( ^) seguido de aspas duplas ( \") seguido de qualquer texto ( .*)) e a ocultar e substituí-lo em todos os locais encontrados ( containedin=ALL) com o caractere >( cchar=>).
O concealatributo de sintaxe oculta o texto que queremos, a menos que o cursor esteja nele.

Em seguida, pedimos ao vim para ocultar completamente o texto, a menos que ele tenha um caractere de substituição personalizado definido:

:set conceallevel=2

Existem 4 valores possíveis para esta opção com 4 efeitos diferentes (consulte :help conceallevel).

Como não queremos digitar esses comandos todas as vezes, adicionamos um comando automático em ~/.vimrc:

augroup hide_text
    autocmd!
    autocmd FileType vim :set conceallevel=2 | :syntax match vimLineComment "^\".*" conceal containedin=ALL cchar=>
augroup END

Por fim, adicionamos um mapeamento para alternar o valor da conceallevelopção (entre 2 e 0; 2 = oculto, 0 = mostrado):

nnoremap <leader>h :<c-u>if (&conceallevel==2) \| set conceallevel=0 \| else \| set conceallevel=2 \| endif<cr>

O resultado é que o texto deve ser mostrado / oculto quando atingimos <leader>h.

Você também pode alterar a cor do caractere de substituição:

highlight Conceal ctermfg=<code color> guifg=#<code color>

E você pode escolher em qual modo um comentário será exibido. Por exemplo, se você deseja que seja mostrado apenas quando estiver na linha no modo de inserção:

setlocal concealcursor=ncv

No entanto, não sei como recolher todas essas linhas ocultas, como o recurso de dobra, desculpe.


Edit : outra solução possível.

Você mantém suas configurações de dobra para recolher as linhas que não deseja ver e oculta os títulos das dobras, para que elas não o distraiam.

function! FoldingTitle()
    if (v:foldlevel>1)
        let line = repeat(' ', &sw * (v:foldlevel-1)).'>'
    else
        let line = '|'
    endif
    return line
endfunction

set foldtext=FoldingTitle()
set fillchars+=fold:\ 
set foldcolumn=3 " optional

highlight FoldColumn ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color> "optional
highlight Folded ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color> "optional

Nesse código, personalizamos o título das dobras, atribuindo o valor FoldingTitle()à foldtextopção. Isso significa que podemos mudar a aparência de uma dobra através dessa função. FoldingTitle()apenas retorna um símbolo para que você saiba que há uma dobra ( >precedida por alguns espaços repetidos ou |dependendo do nível da dobra).

Em seguida, definimos o caractere de espaço como o caractere a ser usado para preencher o espaço vazio nas linhas:

set fillchars+=fold:\ 

Não esqueça o espaço após a barra invertida.

Finalmente, definimos uma coluna (cuja largura é 3) que será mostrada ao lado da janela e que indicará dobras abertas e fechadas. Também personalizamos a cor da coluna da dobra e a cor dos títulos das dobras. Cada uma dessas 3 linhas é opcional.

set foldcolumn=3 " optional
highlight FoldColumn ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color>
highlight Folded ctermfg=<code color> guifg=#<code color> ctermbg=<code color> guibg=#<code color>
saginaw
fonte
1
Isso é realmente ótimo, eu não sabia sobre o recurso ocultar. Com sua solução, as linhas ainda estão lá, mas estão completamente vazias ou têm apenas um caractere - portanto, tenho muito menos distração olhando meu código. Ainda espero que exista uma maneira de não mostrar linhas específicas, mas essa solução também é boa (muito melhor do que dobrar para mim).
cbaumhardt
Uau, esconder é realmente grande, você pode apenas partes ainda escondem de uma linha (dobragem vertical): vim.wikia.com/wiki/Patch_to_conceal_parts_of_lines
cbaumhardt
@cbaumhardt Editei minha resposta para incluir outra proposição, que talvez possa interessá-lo.
Saginaw
A proposta na sua edição não é realmente uma opção, pois ainda quero usar minha dobra normal. Mas quando faço isso, os Foldedelementos para minhas dobras normais precisam de cor, portanto, a única opção é preencher apenas o texto da dobra para as linhas que quero ocultar com espaços. No entanto, ainda verei a parte sublinhada e o plano de fundo diferente dos Foldedobjetos - e não posso mudar isso, pois preciso deles para que minhas dobras normais funcionem.
cbaumhardt
-1

qualquer solução possível é usar uma barra de dobra minimalista que usei porque não encontro a mesma solução, abaixo coloco uma lista de comandos para fazer uma barra de dobra minimalista que você pode usar para comentários ocultos, em cada comando escrevo o que faz :

defina foldtext = '+' "para aparecer um + na referência de texto para fold

oi Ctermbg dobrado = NENHUM "muda a barra de dobra de cor para nada

: defina fillchars = vert: \ |, fold: \ "(coloque um espaço) não coloque a ----- na barra de dobras

uso opcional para desaparecer comentários

:Oi! link Comentário Ignorar

retornar uso

:Oi! link Comentário Comentário

ramses_ATK
fonte
Sinto muito, mas não consigo entender sua postagem. Sugiro escrever mais frases redondas nele.
peterh - Restabelece Monica