No es posible tener diferentes tipos de métodos de plegado en el mismo buffer. ¿Cómo es que Vim sabe que hay algunos comentarios al mismo nivel de sangrado que otro texto que desea tratar como de un nivel diferente (más numerado)?
Estoy seguro de que puede lograr lo que desea estableciendo foldmethod en 'expr'. Esta es la forma más flexible de hacer pliegues en Vim, pero puede complicarse (y/o ralentizarse) según lo que desee. Aunque creo que funcionaría con bastante facilidad para su caso de uso.
Primero, en algún lugar de vimrc o vimscripts necesita asegurarse de que foldexpr se está definiendo para el tipo de archivo en cuestión.
set foldexpr=MyFoldLevel(v:lnum)
set foldmethod=expr
" and for last code example
let b:previous_level = 0
y luego tienes que dar cuerpo a su función foldexpr de manera que asigna los niveles de una manera que resulta en un comportamiento que desea. Algo como el siguiente código podría estar a punto de funcionar en casos en que cada línea de comentario tenga el símbolo de prefijo (es decir, no en su caso), pero espero que necesite algunos ajustes. h: fold-expr
sería un buen lugar para buscar ayuda:
function! MyFoldLevel(linenum)
" assign levels based on spaces indented and tabstop of 4
let level = indent(a:linenum)/4
if getline(a:linenum) =~ [put line-based comment prefix pattern here]
let level = 20
endif
endfunction
tendría que ser modificado para asignar un nivel más alto para las líneas entre el inicio comentario y al final marcadores de la manera deseada:
function! MyFoldLevel(linenum)
let linetext = getline(a:linenum)
if linetext =~ [put line-based comment prefix pattern here]
let level = 20
elseif linetext =~ '^\s*/\*'
let level = 20
elseif linetext =~ '^\s*\*/'
let level = 21
else
if b:previous_level == 20
let level = 20
else
"assuming code is space-indented with tabstop of 4
let level = indent(a:linenum)/4
endif
endif
let b:previous_level = level
return level
endfunction
I don' T esperar que las funciones de foldmethod que he escrito funcionen exactamente como están escritas. Pero señalan el camino a algo que funcionaría.
Tenga en cuenta que el uso del nivel de '20' para los comentarios es solo un nivel arbitrario que les permite ser plegados, mientras que todos los códigos sangrados (presumiblemente de nivel inferior) podrían ser visibles. '21' para la última línea de la sección de comentarios es solo para diferenciarlo de las líneas anteriores de comentarios que tienen un nivel de 20, para saber que la siguiente línea debe tratarse como una línea de código regular.
Además, las operaciones clave como 'zc' y 'zo' no funcionarán del todo bien en los comentarios cuando se establecen en un nivel mucho más alto que el código circundante. Quisiera usar el comando directo como :set foldlevel=21
para mostrar todas las líneas de comentarios.
No es bonito, y espero que se pueda simplificar un poco, pero algo como esto es lo que creo que se requiere para lo que quiere.
En realidad, pensando en esto un poco más, creo que desearía que la primera línea de cualquier bloque de comentarios estuviera en el mismo nivel que si fuera una línea sin comentario, solo las líneas de comentario posteriores en el mismo bloque necesitarían ser de un nivel superior para que se "doble" en la línea de comentario inicial.En el código que di, si funciona o está a punto de funcionar, creo que vim doblaría las líneas de comentarios detrás de la línea anterior sin comentario, que no es lo que quieres, pero desafortunadamente no tener más tiempo para dedicar a este pequeño rompecabezas. . . He hecho este tipo de plegado personalizado bastantes veces y generalmente siempre tengo un poco de prueba y error para obtener exactamente lo que quiero.
¿Es posible mapear 'zo' comando para 'zo' comando pulsa 21 veces? Me di cuenta de que zo presionado más veces no tiene efectos secundarios. ¿Se ralentiza demasiado? – xralf