Ocultar ciertas líneas completamente (no plegables)


9

Me gustaría poder ocultar ciertas líneas en mi búfer para que no aparezcan (y poder alternar verlas). Encontré preguntas similares , pero no resuelven mi problema. No quiero usar pliegues para esto.

¿Qué es lo que quiero exactamente?

Cuando abro un documento, quiero que Vim no lea en líneas comentadas. Debería comportarse como si estas líneas no existieran en absoluto en el documento, con una sola excepción: necesito un indicador visual (por ejemplo, en una columna adicional al costado) que me dice que aquí hay un comentario que no se muestra.

Al presionar una determinada combinación de teclas, quiero que aparezcan todos los comentarios (es decir, el comportamiento normal de Vim).

Quiero poder modificar el documento con comentarios no mostrados. Al guardar, todo el documento se guarda con comentarios (siempre se guardan 1 línea por encima del texto que estaba debajo de ellos al principio).

¿Por qué quiero esto?

Se distrae menos y se ve visualmente más agradable. Tomemos .vimrcpor ejemplo: puede tener todas las configuraciones muy bien una debajo de la otra. Si desea cambiar algo, o no está seguro de por qué lo configuró de esta manera, solo alterne sus comentarios.


Espero que no te importe que te pregunte ... ¿Por qué excluyes específicamente los pliegues?
Roflo

1
Por supuesto que no :) Excluí los pliegues porque sé cómo colapsar los comentarios con pliegues, pero los comentarios plegados aún distraen, dificultan el flujo de lectura y no son visualmente atractivos.
cbaumhardt

También quiero muchas cosas, pero descubrí que generalmente es mejor seguir / adaptarme a lo que necesito;)
VanLaser

@cbaumhardt, puede doblarlo y usar una configuración / función personalizada de 'pliegue de texto' para ocultar todo
Christian Brabandt

Respuestas:


8

No sé cómo lograr exactamente lo que quieres, solo una parte.

Desea ocultar algo de texto dentro ~/.vimrc(por ejemplo).

Primero necesitamos saber qué grupo resaltado maneja el texto que desea ocultar. Agregue esta asignación a su ~/.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>

Lo he tomado desde aquí .

Luego, coloque el cursor sobre el texto que desea ocultar, por ejemplo, un comentario. Entonces golpear F10.
El nombre del grupo resaltado debe aparecer en la línea de comando.
En mi sistema, la salida es:

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

Creo que significa que el grupo destacado para comentarios vim es vimLineCommenty que está vinculado Comment. Por lo tanto, queremos ocultar el texto que maneja el grupo resaltado vimLineComment(o Comment).

Para lograr esto, podríamos usar la función de ocultación agregada en vim 7.3 ( :help conceal).

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

Esta línea le dice a vim que busque texto cuyo grupo resaltado sea vimLineCommenty que coincida con la expresión regular ^\".*(un comienzo de una línea ( ^) seguido de una comilla doble ( \") seguida de cualquier texto ( .*)), y que lo oculte y reemplace en todas partes donde se encuentre ( containedin=ALL) con el personaje >( cchar=>).
El concealatributo de sintaxis ocultará el texto que queramos, a menos que el cursor esté sobre él.

A continuación, le decimos a vim que oculte completamente el texto a menos que tenga un carácter de reemplazo personalizado definido:

:set conceallevel=2

Hay 4 valores posibles para esta opción con 4 efectos diferentes (ver :help conceallevel).

Como no queremos escribir esos comandos cada vez, agregamos un comando automático en nuestro ~/.vimrc:

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

Finalmente, agregamos una asignación para alternar el valor de la conceallevelopción (entre 2 y 0; 2 = oculto, 0 = mostrado):

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

El resultado es que el texto debe mostrarse / ocultarse cuando presionamos <leader>h.

También puede cambiar el color del personaje de reemplazo:

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

Y puede elegir en qué modo se mostrará un comentario. Por ejemplo, si desea que se muestre solo cuando esté en su línea en modo de inserción:

setlocal concealcursor=ncv

Sin embargo, no sé cómo contraer todas esas líneas ocultas como lo hace la función de plegado, lo siento.


Editar : otra posible solución.

Mantiene la configuración de plegado para contraer las líneas que no desea ver y oculta los títulos de los pliegues para que no lo distraigan.

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

En este código personalizamos el título de los pliegues dando el valor FoldingTitle()a la foldtextopción. Significa que podemos cambiar la apariencia de un pliegue a través de esta función. FoldingTitle()solo devuelve un símbolo para que sepa que hay un pliegue ( >precedido por algunos espacios repetidos o |dependiendo del nivel de pliegue).

Luego definimos el carácter de espacio como el carácter a utilizar para llenar el espacio vacío en las líneas:

set fillchars+=fold:\ 

No olvide el espacio después de la barra invertida.

Finalmente definimos una columna (cuyo ancho es 3) que se mostrará al costado de la ventana y que indicará pliegues abiertos y cerrados. También personalizamos el color de la columna de pliegue, así como el color de los títulos de los pliegues. Cada una de estas 3 líneas es 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>

1
Esto es realmente genial, no sabía sobre la función de ocultación. Con su solución, las líneas siguen ahí, pero están completamente vacías o solo tienen un carácter, por lo que tengo mucha menos distracción al mirar mi código. Todavía espero que haya una manera de no mostrar líneas específicas, pero esta solución también es buena (mucho mejor que doblar para mí).
cbaumhardt

Wow, ocultar es realmente genial, incluso puedes ocultar solo partes de una línea (plegado vertical): vim.wikia.com/wiki/Patch_to_conceal_parts_of_lines
cbaumhardt

@cbaumhardt He editado mi respuesta para incluir otra propuesta, que tal vez podría interesarle.
Saginaw

La propuesta en su edición no es realmente una opción, porque quiero poder seguir usando mi plegado normal. Pero cuando lo hago, los Foldedelementos para mis pliegues normales necesitan color, por lo que la única opción es llenar el texto del pliegue de las líneas que quiero ocultar con espacios. Sin embargo, aún veré la parte subrayada, así como el fondo diferente para los Foldedobjetos, y no puedo cambiar eso, ya que los necesito para que funcionen mis pliegues normales.
cbaumhardt

-1

cualquier solución posible es usar una barra de plegado minimalista que utilicé porque no encuentro la misma solución, a continuación pongo una lista de comandos para hacer una barra de plegado minimalista que puedes usar para comentarios ocultos, en cada comando escribo qué hago :

establecer foldtext = '+' "para que aparezca un + en la referencia de texto para fold

hola ctermbg plegado = NINGUNO "cambiar la barra de plegado de color por nada

: set fillchars = vert: \ |, fold: \ "(poner un espacio) no poner un ----- en la barra de plegado

uso opcional para desaparecer comentarios

:¡Hola! enlace Comentario Ignorar

uso de devolución

:¡Hola! enlace Comentario Comentario


Lo siento pero no puedo entender tu publicación. Sugiero escribir más oraciones redondas en él.
peterh - Restablece a Monica el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.