Wie kann ich die vim-Syntaxfaltung für Informix 4GL-Quellcode definieren?

840
RedGrittyBrick

Ich verwende vim zum Bearbeiten von Informix 4GL-Quellcode, der diese Art von Syntax aufweist:

FUNKTION ZUM ... ... ENDE FÜR ENDE FUNKTION 

Ich möchte die Funktionen mit za zM etc klappen

Das funktioniert

 : Faltmarker = FUNKTION, ENDE \ FUNKTION setzen : set foldmethod = Markierung 

Die Schlüsselwörter können jedoch auch in Kleinbuchstaben geschrieben werden, und ich möchte im Idealfall MAIN..END MAIN falten, sodass Marker dies nicht tun können.

Ich habe es versucht

: syn region myFun start = "FUNCTION" end = "END FUNCTION" transparente Falte : set foldmethod = Syntax 

aber es hatte keine Wirkung. Ich habe bereits eine Syntaxdatei, die farbliche Hervorhebung tut und :synzeigte myFunin den Syntax - Definitionen enthalten.

Wie kann ich die fallabhängige Syntaxfaltung von FUNCTION ... END FUNCTION und MAIN..END MAIN konfigurieren?


Update: Ich habe http://www.vim.org/scripts/script.php?script_id=2287 ausprobiert, es gibt jedoch einige Probleme:

  • Es faltet sich auf einem Niveau von Detail möchte ich nicht ( IF, FOR, WHILE, ...)
  • Es wird davon ENDausgegangen, dass Anweisungen in einer neuen Zeile beginnen ( IF a<b call c() END IFfaltet sich also zu EOF).
  • Sie denkt, es SELECT * FROM table \n FOR UPDATEsei der Beginn einer FORAussage

Ich möchte also zuerst versuchen, etwas viel Einfacheres zu erstellen.

0
Welche Sprache ist das? digitxp vor 12 Jahren 0
Informix 4GL. Ich habe eine Syntaxdatei dafür gefunden, aber sie klappt mehr als ich will (IF-Anweisungen), hat Fehler (z. B. "END IF" in derselben Zeile wie "IF") oder zählt "SELECT * FROM table FOR UPDATE" als Anfang von FOR-Schleife) und klappt nicht FUNKTION! (obwohl die Datei scheinbar Code zum Falten von Funktionen enthält) RedGrittyBrick vor 12 Jahren 0
Haben Sie "set foldmethod = indent" versucht? romainl vor 12 Jahren 0
@romainl: Ich hatte es jetzt nicht getan. Es ist nicht ideal für mich, aber es ist nützlich. Vielen Dank. RedGrittyBrick vor 12 Jahren 0

1 Antwort auf die Frage

1
Thor

Ich denke, Sie sollten Ihre eigene Faltfunktion definieren, so haben Sie mehr Kontrolle darüber, was wann gefaltet wird. Die folgende Falzfunktion Falten function/ end functionFall unsensibel und sollte ziemlich einfach für weitere Anforderungen anzupassen:

function! InformixFold() let line = getline(v:lnum) let prev_line = getline(v:lnum-1)  if match(line, '^\s*function\s*$') >= 0 return 1 elseif match(prev_line, '^\s*end\s*function\s*$') >= 0 return 0 else return "=" endfunction 

Dann foldmethodauf exprund foldexprauf die Funktion einstellen :

set foldmethod=expr set foldexpr=InformixFold() 

Sehen Sie help fold-exprfür mehr.

"Bildschirmfoto":

- FUNCTION | FOR ... | ... | END FOR | END FUNCTION  + +-- 5 lines: FUNCTION------------------------------------------------------