Hello!
Apologies for dragging up an old message. For my Uni Thesis work, I am going to translate some Fortran code to C++ or Python. My knowledge of Fortran, Regex and tmbundles is essentially zero beyond recent Kindle book reads. Because I did not think to search for a fortran bundle, I wrote my own primitive one which used the following for comments which seems to better colourise fortran code even if it is not 100% as per specs:
{ name = 'comment.line.character.fortran'; match = '^([\S]{1,}[\s]{1,})*'; }, { name = 'comment.line.character.fortran'; match = '!([\S\s]{1,})'; },
Testing in Textmate / Sublime, you can see my results in the left hand side of the image in this URL:
http://skitch.com/mlivingstone/f5h1w/tmscore.f
The right hand side is the existing Textmate fortran bundle colourising (shown in a Sublime window).
Could someone with SVN access please fix the spelling of "intrinsic" which the bundle author keeps using other dyslexic spelling? ;-)
This was my first attempt which worked quite well seeing I didn't know anything about what I was doing before commencing!
{ scopeName = 'source.fortran'; comment = '
This has only been tested against two classic column delimited Fortran 77 code files, and I have never written a Fortran program before, so buyer beware ;-) That said, it colourises code by other experienced Fortran code as I would expect. --- livingstonemark@gmail.com '; fileTypes = ( 'f', 'for', 'f77' ); foldingStartMarker = '/**|{\s*$'; foldingStopMarker = '**/|^\s*}'; patterns = ( { name = 'comment.line.character.fortran'; match = '^([\S]{1,}[\s]{1,})*'; }, { name = 'comment.line.character.fortran'; match = '!([\S\s]{1,})'; }, { name = 'constant.language.fortran'; match = '(?i)([.](true|false)[.])'; }, { name = 'entity.name.function.fortran'; match = '(?i)\b(getarg|iargc|read|print|format|close|open|write)\b'; }, { name = 'entity.name.tag.fortran'; match = '(?i)\b(unit=|file=|status=|end=|err=|fmt=|access=|form=|recl=)\b'; }, { name = 'keyword.control.fortran'; match = '(?i)\b(if|then|while|for|return|continue|stop|call|elseif|else if|else|[e][n][d][i][f]|do|enddo|goto|continue)\b'; }, { name = 'keyword.operator.fortran'; match = '(?i)([.](gt|ge|eq|lt|le|or|ne|and|eqv|neqv|not)[.])'; }, { name = 'keyword.other.fortran'; match = '(?i)\b(abs|acos|aint|anint|asin|atan|cos|cosh|dabs|datan2|dcos|dim|dsin|exp|int|log|log10|max|min|mod|nint|real|sign|sin|sinh|sqrt|tan|tanh|dsqrt)\b'; }, { name = 'storage.type.fortran'; match = '(?i)\b(program|parameter|subroutine|function|end|dimension|data|save|integer|external|intrinsic|implicit|implicit none|logical|character|real|double|float|precision|complex|equivalence|common|block data)\b'; }, { name = 'string.quoted.single.fortran'; begin = "'"; end = "'"; patterns = ( { name = 'constant.character.escape.fortran'; match = '\.'; }, ); }, ); }
The first language I was formally taught was Cobol in the early 80s so this all takes me back! :-D
Cheers,
MarkL
On 1/04/11 12:32 AM, Steve King wrote:
On 2011-03-30 18:52, Kaster Might wrote:
If some variable starts with "C", the whole line which contains that variable and where it at the very first place highlighted as comment. I suppose it comes from old F77 style, where C denotes comment, but it's not necessary now. Is there any way to fix it? My current way-around is to put single space before that variable, but in this case overall code doesn't look as nice as before.
The 'Fortran - Modern' bundle inherits this behavior from 'Fortran - Punchcard'. Modern makes an attempt to flag lines beginning with 'C' as invalid, but only if the 'C' is followed by whitespace. Punchcard treats any line beginning with 'C' as a comment.
I think the easiest way to work around this is to edit the Punchcard language definition to change the 'begin' expression for 'comment.line.c.fortran' from '^[Cc]' to '^[Cc]\s+', which requires comments to start with 'C' followed by whitespace.. This may not strictly adhere to the language spec, but it probably matches common practice. And if you're not using the older F77 style it won't matter anyway.
{ name = 'comment.line.c.fortran'; begin = '^[Cc]\s+'; end = '$\n?'; beginCaptures = { 0 = { name =
'punctuation.definition.comment.fortran'; }; }; patterns = ( { match = '\\s*\n'; } ); },
(Wow, FORTRAN... That takes me back to 1984 and the start of college. That was the first year the freshman FORTRAN class was taught using an interactive terminal instead of on punch cards. Of course, it was on VM/CMS which implemented a virtual card punch/reader system, but at least we had the glorified virtual card punch that was XEDIT.)