¿Cómo doblar comentarios?


16

La sintaxis foldmethodes excelente, pero a veces solo quiero doblar los comentarios en un archivo fuente.

También el plegado de sintaxis de comentarios solo funciona para comentarios de estilo C como:

/*
 ...
 */

Pero no para comentarios repetitivos como:

//
//
// ...
//

O incluso para bloques de comentarios en lenguajes no similares a C como:

#
#
# ...
#

¿Cómo puedo configurar esto con vim?


¿Desea utilizar el plegado de sintaxis y el plegado de comentarios? ¿O solo comentar plegado?
Martin Tournoij

@Carpetsmoker, el plegado de sintaxis + el plegado de comentarios estaría bien si se pudiera decir 'abrir todos los pliegues, excepto los comentarios'. De lo contrario, el plegado de comentarios sin plegado de sintaxis también estaría bien.
maxschlepzig

Respuestas:


14

Plegar solo los comentarios es bastante fácil usando foldmethod=expr:

set foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*'.&commentstring[0]

Esto simplemente verificará si la línea comienza con cualquier cantidad de espacio en blanco + un carácter de comentario. Tenga en cuenta que esto es bastante ingenuo y puede no funcionar para todos los idiomas. Por lo tanto, es posible que desee utilizar un autocmd para ser más específico:

autocmd FileType c setlocal foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*//'
autocmd FileType python setlocal foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*#'

Para obtener más información sobre fold-expr, consulte:


El uso del plegado de sintaxis y el plegado de comentarios es más complicado; esto requeriría modificar el archivo de sintaxis /usr/share/vim/vim74/syntax/*.vimy será específico para el idioma que esté utilizando.

Tenga en cuenta que algunos tipos de archivos ya hacen esto. Por ejemplo de ruby.vim:

if !exists("ruby_no_comment_fold")
  syn region rubyMultilineComment start="\%(\%(^\s*#.*\n\)\@<!\%(^\s*#.*\n\)\)\%(\(^\s*#.*\n\)\{1,}\)\@=" end="\%(^\s*#.*\n\)\@<=\%(^\s*#.*\n\)\%(^\s*#\)\@!" contains=rubyC
  syn region rubyDocumentation    start="^=begin\ze\%(\s.*\)\=$" end="^=end\%(\s.*\)\=$" contains=rubySpaceError,rubyTodo,@Spell fold
else
  syn region rubyDocumentation    start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
endif

2

Me gusta doblar con sangría pero incluir los comentarios en el pliegue (quiero decir que cada comentario obtiene el mismo nivel de pliegue que la línea anterior).

Desafortunadamente, la palabra clave foldignore solo funciona para comentarios de una línea. Entonces doblo con expr en vimrc:

set foldmethod=expr
set foldexpr=FoldMethod(v:lnum)

function! FoldMethod(lnum)
  "get string of current line
  let crLine=getline(a:lnum)

  " check if empty line 
  if empty(crLine) "Empty line or end comment 
    return -1 " so same indent level as line before 
  endif 

  " check if comment 
  let a:data=join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )
  if a:data =~ ".*omment.*"
    return '='
  endif

  "Otherwise return foldlevel equal to indent /shiftwidth (like if
  "foldmethod=indent)
  else  "return indent base fold
    return indent(a:lnum)/&shiftwidth
endfunction

El último bloque:

indent(a:lnum)/&shiftwidth

Devuelve una base de doble nivel en la sangría.

Y el otro :

join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )

Comprueba si el primer carácter de la línea se considera como un comentario con la sintaxis. Por lo tanto, es una buena forma de fusionar sangría y sintaxis con expresión, el plegado más avanzado.

Tenga en cuenta que también puede "establecer foldtext" dependiendo de cómo desee que se vea el resultado.


0

Puede seleccionar visualmente el bloque comentado con vacy luego crear un plegado manual zf.

El objeto de texto de comentario puede ser una extensión de lenguaje para establecer un conjunto de objetos de texto vim estándar. Probado con la sintaxis Go.


1
De hecho, acno es un incorporado. Pero con el comentario de tpope gces un objeto de texto. Entonces, mejores soluciones son zfac, zfgco zfipen el peor de los casos
D. Ben Knoble
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.