1% The functions push_mode and pop_mode are designed to allow one to temporarily
2% switch buffer modes and then restore the original mode.
3% It requires a version of jed with buffer local variables.
4% To use it, add:
5%
6%    autoload ("push_mode", "pushmode");
7%
8% to you .jedrc file.
9
10define push_mode ()
11{
12   variable mode, old_mode, keymap;
13   variable var_name, try_mode;
14
15   var_name = "push-mode-stack";
16   !if (blocal_var_exists (var_name))
17     define_blocal_var (var_name, "");
18
19   if (_NARGS)
20     mode = ();
21   else
22     mode = strtrim (read_mini ("Push to mode:", Null_String, Null_String));
23
24   !if (strlen (mode))
25     return;
26
27   if (is_defined (mode) <= 0)
28     {
29	mode += "_mode";
30	if (is_defined (mode) <= 0)
31	  error ("Mode is not defined.");
32     }
33
34   (old_mode,) = what_mode ();
35   !if (strlen (old_mode))
36     old_mode = "no";
37
38   old_mode = strtrans (old_mode, "-", "_");
39   % Some modes may set modeline to two words.
40   try_mode = strlow (strtrans (old_mode, " ", "_") + "_mode");
41   if (2 != is_defined (try_mode))
42     {
43	try_mode = strlow (extract_element (old_mode, 0, ' ') + "_mode");
44	if (2 != is_defined (try_mode))
45	  verror ("Unable to get mode.  Tried %s.", try_mode);
46     }
47
48   keymap = what_keymap ();
49
50   no_mode ();
51   eval ("." + mode);		       %  RPN form
52
53   set_blocal_var (sprintf (".%s|%s,%s", try_mode, keymap,
54			    get_blocal_var (var_name)),
55		   var_name);
56}
57
58define pop_mode ()
59{
60   variable var_name = "push-mode-stack";
61   variable modes, keymap, mode;
62
63   modes = get_blocal_var (var_name);
64   !if (strlen (modes))
65     error ("mode stack is empty.");
66
67   mode = extract_element (modes, 0, ',');
68   keymap = extract_element (mode, 1, '|');
69   mode = extract_element (mode, 0, '|');
70
71   no_mode ();
72   eval (mode);
73   use_keymap (keymap);
74   set_blocal_var (extract_element (modes, 1, ','), var_name);
75}
76
77
78
79
80
81
82
83
84
85