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