[TxMt] Re: Unnecessary commenting line in modern fortran mode

Mark Livingstone livingstonemark at gmail.com
Mon Sep 26 06:17:12 UTC 2011


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 at 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.)
> 




More information about the textmate mailing list