View file File name : menu.sl Content :% This File is OBSOLETE % % Example of menus for JED. This is designed to aid in learning % the editor since after a menu item has been chosen, the user is % informed of the keybinding of the function. % enable_top_status_line (1); if (TOP_WINDOW_ROW == 1) error ("Menu bar has been disabled. It must be present to use the menus."); define menu_build_display_string (list) { variable i = 0, cmd, s = Null_String; forever { cmd = extract_element (list, i, ','); if (cmd == NULL) break; if (i) s += ", "; s = sprintf("%s(%d)%s", s, i, cmd); ++i; } s; } define menu_list_length (list) { variable i = 0; i - 1; } variable Menu_Last_Cmd; variable Menu_Abort; Menu_Abort = 0; define menu_select_cmd (s_list, cmd_list) { variable cmd, i, s, n; i = 0; n = 0; while (NULL != extract_element(cmd_list, n, ',')) n++; n--; s = strcat ("Menu: ", menu_build_display_string(s_list)); do { Menu_Abort = 0; forever { message ("Pick a number or press Ctrl-G to abort or SPACE to go back to previous level."); set_top_status_line (s); pop (); update_sans_update_hook(1); i = getkey(); if (i == 7) call ("kbd_quit"); if (i == ' ') { Menu_Abort = 1; return; } i -= '0'; if ((i >= 0) and (i <= n)) break; beep(); flush_input(); % flush("Pick a number or press Ctrl-G to abort or SPACE to go back."); % pop(input_pending(20)); } cmd = extract_element(cmd_list, i, ','); if (cmd [0] == '@') { Menu_Last_Cmd = substr(cmd, 2, strlen(cmd)); call (Menu_Last_Cmd); } else { Menu_Last_Cmd = cmd; eval(strcat (".", cmd)); % Use RPN--- no need to parse it } } while(Menu_Abort); } define menu_window_cmds () { menu_select_cmd ("One window,Split Window,Other Window,Del Window,Redraw", "@one_window,@split_window,@other_window,@delete_window,@redraw"); } define search_replace () { menu_select_cmd ("Search Forward,Search Backward,Replace", "search_forward,search_backward,replace_cmd"); } define menu_deletion_cmd () { menu_select_cmd ("Delete Char,Delete Word", "del,delete_word"); } define menu_cut_paste () { menu_select_cmd ("Deleting,Begin Region,Cut Region,Copy Region,Paste", "menu_deletion_cmd,@set_mark_cmd,@kill_region,@copy_region,@yank"); } define menu_movement () { menu_select_cmd ("Page Up,Page Down,Top,Bottom,Page Left,Page Right", "@page_up,@page_down,@beg_of_buffer,@end_of_buffer,@scroll_right,@scroll_left"); } define menu_buffer_modes () { menu_select_cmd ("C-Mode,Text-Mode,No-Mode,Fortran-Mode", "c_mode,text_mode,no_mode,fortran"); } define menu_basics () { menu_select_cmd ("Search/Replace,Movement,Cut/Paste,Undo,Formatting", "search_replace,menu_movement,menu_cut_paste,@undo,@format_paragraph"); } define menu_buffers () { menu_select_cmd ("Kill Buffer,Switch To Buffer,List Buffers,Set buffer modes", "@kill_buffer,@switch_to_buffer,list_buffers,menu_buffer_modes"); } define menu_files () { menu_select_cmd ("Open File,Save to File,Save Buffers,Insert File", "@find_file,@write_buffer,@save_some_buffers,@insert_file"); } define menu_help () { menu_select_cmd ("Pop up help,Browse Documentation,Show Key,Where is Command", "help,info_reader,showkey,where_is"); } define menu_misc () { #ifdef UNIX VMS menu_select_cmd ("compose mail,send mail,ispell,shell command,suspend", "mail,mail_send,ispell,do_shell_cmd,@sys_spawn_cmd"); #else menu_select_cmd ("Shell command,Suspend", "do_shell_cmd,@sys_spawn_cmd"); #endif } define menu_main_cmds () { variable n, key, len, next, nlen; try { menu_select_cmd ("File,Edit,Buffers,Windows,Help,Misc,Exit", "menu_files,menu_basics,menu_buffers,menu_window_cmds,menu_help,menu_misc,@exit_jed"); } finally () = set_top_status_line (Global_Top_Status_Line); % % Show user keybinding of the function. % The problem with this is that any function which leaves a message % in the message buffer, the message will be destroyed. Here I % update screen and sleep for a second before continuing. Menus are % intrinsically inefficient anyway. % if (strlen(MESSAGE_BUFFER)) { update_sans_update_hook (0); () = input_pending(20); } if (Menu_Abort) { return; } if (n = which_key (Menu_Last_Cmd), n) { key = (); n--; len = strlen (key); loop (n) { next = (); nlen = strlen (next); if (nlen < len) { len = nlen; key = next; } } sprintf ("%s is on key %s", Menu_Last_Cmd, expand_keystring (key)); } else strcat (Menu_Last_Cmd, " is not on any keys."); message (()); }