File: //usr/share/jed/lib/idl.sl
% idl mode
$1 = "IDL";
create_syntax_table ($1);
define_syntax (";", "", '%', $1);
define_syntax ("([{", ")]}", '(', $1);
define_syntax ('"', '"', $1);
define_syntax ('\'', '"', $1);
%define_syntax ('\\', '\\', $1);
define_syntax ("$0-9a-zA-Z_", 'w', $1); % words
define_syntax ("-+0-9a-fA-F.xXL", '0', $1); % Numbers
define_syntax (",.?:", ',', $1);
define_syntax ("%-+/&*=<>|!~^", '+', $1);
define_syntax ('@', '#', $1);
set_syntax_flags ($1, 1); % case insensitive
% These are IDL reserved words
() = define_keywords ($1, "$", 1);
() = define_keywords ($1, "doeqgegtifleltneofor", 2);
() = define_keywords ($1, "andendformodnotproxor", 3);
() = define_keywords ($1, "caseelsegotothen", 4);
() = define_keywords ($1, "beginendifuntilwhile", 5);
() = define_keywords ($1, "commonendforendrependwhirepeatreturn", 6);
() = define_keywords ($1, "endcaseendelse", 7);
() = define_keywords ($1, "endwhilefunctionon_error", 8);
() = define_keywords ($1, "endrepeat", 9);
() = define_keywords ($1, "on_ioerror", 10);
()=define_keywords_n ($1,"abscoseofexpfixhdrmaxminsintan", 3, 1);
()=define_keywords_n ($1,"alogplotsavesizesortsqrtstopuniqwset", 4, 1);
()=define_keywords_n ($1,"closefloatflooropenropenwplotsprintranksreadfreadsreadurebinspawntotalwherewshow", 5, 1);
()=define_keywords_n ($1,"alog10dblarrdoublefinitefltarrindgenintarrlonarrprintfstrarrstringstrlenstrmidstrposstrputwriteuwindow", 6, 1);
()=define_keywords_n ($1,"defsysvdindgenexecutefindgenget_lunintegerrandomnrandomustr_sepstretchstrtrim", 7, 1);
()=define_keywords_n ($1,"findfilefree_lunn_params", 8, 1);
()=define_keywords_n ($1,"histogramimaginaryreplicatestrupcasetranspose", 9, 1);
()=define_keywords_n ($1,"n_elementsstrlowcasestrmessage", 10, 1);
()=define_keywords_n ($1,"keyword_setstrcompress", 11, 1);
% idl indentation routines
define idl_find_effective_eol ()
{
bol ();
while (ffind_char (';'))
{
go_right_1 ();
if (parse_to_point () == -2)
{
go_left_1 ();
return;
}
}
eol ();
}
define idl_beginning_of_statement ()
{
variable n = 0;
bol_skip_white ();
if (looking_at ("pro ") or looking_at ("function "))
{
return 0;
}
while (up_1 ())
{
idl_find_effective_eol (); bskip_white ();
ifnot (blooking_at ("$"))
{
#iffalse
if (bolp ())
{
skip_white ();
if (looking_at_char (';')) continue;
}
#endif
go_down_1 ();
break;
}
n++;
}
bol_skip_white ();
return n;
}
define idl_indent_to (col)
{
push_spot ();
bol_skip_white ();
if (col != what_column ())
{
col--;
bol_trim ();
whitespace (col);
}
pop_spot ();
}
define idl_looking_at_block (word, begin)
{
ifnot (looking_at (word)) return 0;
EXIT_BLOCK
{
pop_spot ();
}
push_spot ();
go_right (strlen (word));
ifnot (re_looking_at ("[^a-z0-9A-Z_]"))
return 0;
if (ffind (begin)) return 1;
do
{
idl_find_effective_eol ();
bskip_white ();
ifnot (blooking_at ("$")) break;
}
while (down (1));
bol ();
return ffind(begin);
}
define idl_is_block_beginnning ()
{
push_spot ();
bol_skip_white ();
variable ret;
if (idl_looking_at_block ("if", " begin")
|| idl_looking_at_block ("while", " begin")
|| idl_looking_at_block ("else ", " begin")
|| idl_looking_at_block ("for", " begin")
|| idl_looking_at_block ("case", " of")
|| idl_looking_at_block ("endif else", " begin")
|| idl_looking_at_block ("repeat", " begin")
|| looking_at ("function ")
|| looking_at ("pro "))
ret = 1;
else
{
idl_find_effective_eol ();
bskip_chars ("$ \t");
ret = blooking_at ("BEGIN") && bfind(":");
};
pop_spot ();
return ret;
}
custom_variable ("Idl_Indent_Amount", 2);
define idl_indent_line ()
{
variable len = 0, extra_indent = 0;
variable word;
push_spot ();
EXIT_BLOCK
{
pop_spot ();
idl_indent_to (len + extra_indent);
push_mark ();
bskip_white ();
pop_mark (not(bolp ()), skip_white ());
}
if (idl_beginning_of_statement ())
{
push_mark ();
pop_spot ();
push_spot ();
bol ();
if (1 == find_matching_delimiter (')'))
{
len = what_column ();
pop_mark_0 ();
len++;
return;
}
pop_mark_1 ();
if (looking_at ("pro ") or looking_at ("function "))
{
() = ffind_char (' ');
skip_white ();
}
skip_chars ("A-Za-z$_!");
len = what_column () + Idl_Indent_Amount;
return;
}
if (looking_at_char ('@')) return;
if (looking_at ("end")) extra_indent = -Idl_Indent_Amount;
else if (looking_at ("else"))
{
go_right (4); skip_white ();
if (not(looking_at_char (':')))
{
extra_indent = -Idl_Indent_Amount;
}
}
ifnot (up_1 ())
{
len = 0;
return;
}
do
{
bol_skip_white ();
ifnot (eolp () or looking_at_char (';') or looking_at_char ('@'))
break;
}
while (up_1 ());
() = idl_beginning_of_statement ();
len = what_column ();
if (idl_is_block_beginnning ())
{
len += Idl_Indent_Amount;
}
}
define idl_newline_and_indent ()
{
if (idl_is_block_beginnning ()) idl_indent_line ();
bskip_white ();
if (blooking_at (",")) insert (" $");
newline ();
idl_indent_line ();
}
$1 = "IDL";
ifnot (keymap_p ($1))
{
make_keymap ($1);
definekey ("newline_and_indent", "\r", $1);
definekey ("indent_line", "\t", $1);
}
define idl_mode ()
{
variable idl = "IDL";
set_mode (idl, 0);
use_syntax_table (idl);
use_keymap (idl);
set_buffer_hook ("indent_hook", "idl_indent_line");
set_buffer_hook ("newline_indent_hook", "idl_newline_and_indent");
run_mode_hooks ("idl_mode_hook");
}