Come piegare i commenti?


16

La sintassi foldmethodè ottima, ma a volte voglio solo piegare i commenti in un file sorgente.

Anche la piegatura della sintassi dei commenti funziona solo per i commenti in stile C come:

/*
 ...
 */

Ma non per commentare il bollettino come:

//
//
// ...
//

O anche per blocchi di commenti in linguaggi non simili al C come:

#
#
# ...
#

Come posso configurarlo con vim?


Vuoi usare la piegatura della sintassi e la piegatura dei commenti? O solo il commento pieghevole?
Martin Tournoij,

@Carpetsmoker, sintassi pieghevole + commento pieghevole sarebbe ok se si potesse dire 'apri tutte le pieghe, tranne i commenti'. Altrimenti, anche la piegatura dei commenti senza piegatura della sintassi andrebbe bene.
Maxschlepzig,

Risposte:


14

Piegare solo i commenti è abbastanza facile usando foldmethod=expr:

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

Questo controllerà semplicemente se la linea inizia con qualsiasi quantità di spazio bianco + un carattere di commento. Nota che questo è abbastanza ingenuo e potrebbe non funzionare in tutte le lingue. Quindi potresti voler usare un autocmd per essere più specifico:

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

Per ulteriori informazioni su fold-expr, vedere:


L'uso della piegatura della sintassi e della piegatura dei commenti è più complicato; questo richiederebbe la modifica del file di sintassi /usr/share/vim/vim74/syntax/*.vime sarà specifico per la lingua che stai usando.

Nota che alcuni tipi di file lo fanno già! Ad esempio da 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

Mi piace piegare con rientro ma includere i commenti nella piega (intendo che ogni commento ha lo stesso livello di piega della riga precedente).

Sfortunatamente, la parola chiave foldignore funziona solo per i commenti di una riga. Quindi piego con expr in 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

L'ultimo blocco:

indent(a:lnum)/&shiftwidth

Restituisce una base a più livelli sul rientro.

E l'altro:

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

Verifica se il primo carattere della riga viene considerato come un commento con la sintassi. Quindi è un buon modo per unire rientro e sintassi piegando con espressione, la piegatura più avanzata.

Nota che puoi anche "impostare foldtext" a seconda di come vuoi che appaia il risultato.


0

È possibile selezionare visivamente il blocco commentato con vace quindi creare una piega manuale zf.

L'oggetto di testo di commento può essere un'estensione di lingua per l'insieme di oggetti di testo vim standard. Testato con sintassi Go.


1
In effetti, acnon è incorporato. Ma con il commento di tpope gcè un oggetto di testo. Quindi le soluzioni migliori sono zfac, zfgco zfipnel peggiore dei casi
D. Ben Knoble,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.