Wie falte ich Kommentare?

16

Die Syntax foldmethodist großartig, aber manchmal möchte ich die Kommentare einfach in einer Quelldatei zusammenfassen.

Auch das Syntaxfalten von Kommentaren funktioniert nur für C-Style-Kommentare wie:

/*
 ...
 */

Aber nicht für Kommentare wie:

//
//
// ...
//

Oder auch für Kommentarblöcke in nicht C-ähnlichen Sprachen wie:

#
#
# ...
#

Wie kann ich das mit vim konfigurieren?

maxschlepzig
quelle
Möchten Sie Syntax- und Kommentarfaltung verwenden? Oder nur Kommentarfaltung?
Martin Tournoij
@Carpetsmoker, Syntaxfaltung + Kommentarfaltung wäre in Ordnung, wenn man sagen könnte, dass alle Faltungen außer Kommentaren geöffnet sind. Andernfalls wäre die Kommentarfaltung ohne Syntaxfaltung ebenfalls in Ordnung.
Maxschlepzig

Antworten:

14

Es ist ziemlich einfach, nur die Kommentare zu falten, indem Sie Folgendes verwenden foldmethod=expr:

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

Dies prüft einfach, ob die Zeile mit einem Leerzeichen + einem Kommentarzeichen beginnt. Beachten Sie, dass dies ziemlich naiv ist und möglicherweise nicht für alle Sprachen funktioniert. Vielleicht möchten Sie ein AutocMD verwenden, um genauer zu sein:

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

Weitere Informationen zu fold-expr finden Sie unter:


Das Syntaxfalten und Kommentarfalten ist komplizierter. Dies würde eine Änderung der Syntaxdatei in erfordern /usr/share/vim/vim74/syntax/*.vimund ist spezifisch für die von Ihnen verwendete Sprache.

Beachten Sie, dass einige Dateitypen dies bereits tun! Zum Beispiel von 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
Martin Tournoij
quelle
2

Ich mag es, mit Einzug zu falten, aber die Kommentare in die Falte einzubeziehen (ich meine, jeder Kommentar hat die gleiche Faltebene wie die vorherige Zeile).

Leider funktioniert das Schlüsselwort foldignore nur für einzeilige Kommentare. Also folge ich mit 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

Der letzte Block:

indent(a:lnum)/&shiftwidth

Gibt eine Foldlevel-Basis für den Einzug zurück.

Und die andere :

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

Überprüft, ob das erste Zeichen der Zeile als Kommentar in der Syntax berücksichtigt wird. So ist es eine gute Möglichkeit, Einzugs- und Syntaxfaltung mit Ausdruck zu verbinden, der fortschrittlichsten Faltung.

Beachten Sie, dass Sie auch "Falttext festlegen" können, je nachdem, wie das Ergebnis aussehen soll.

tinmarino
quelle
0

Sie können einen kommentierten Block mit visuell auswählen vacund dann eine manuelle Falte erstellen zf.

Das Kommentartextobjekt kann eine Spracherweiterung zum Festlegen von Standard-VIM-Textobjekten sein. Getestet mit Go-Syntax.

AB
quelle
1
In der Tat acist kein eingebaut. Bei tpopes Kommentar gchandelt es sich jedoch um ein Textobjekt . Also bessere Lösungen sind zfac, zfgcoder zfipim schlimmsten Fall
D. Ben Knoble