% ledir.sl % % list directory easily for directory and files % % Lechee.Lai % base on emacsmsc.sl list_directory() % syntax directory parser idea from Guenter filelist.sl % know issue % didn't verify on win32 system should modify for Dir_sep which lazy for me % Version 1.0 2007/05/01 % % Usage: % autoload("list_dir","ledir"); % provide("ledir"); private variable mode = "ledir"; variable List_Dir = "*ledir*"; static variable Dir_Sep = path_concat("a", "")[[1:]]; % path separator create_syntax_table (mode); !if (keymap_p (mode)) make_keymap (mode); definekey ("ledir_open", "\r", mode); definekey ("ledir_exit", "q", mode); definekey ("ledir_right", "\e[C", mode); definekey ("ledir_left", "\e[D", mode); definekey ("ledir_up", "\e[A", mode); definekey ("ledir_down", "\e[B", mode); %create_syntax_table(mode); #ifdef HAS_DFA_SYNTAX custom_color("ledir_yellow", "yellow", "black"); % - custom_color("ledir_green", "green", "black"); % - custom_color("ledir_red", "red", "black"); % - static define setup_dfa_callback (name) { %%% DFA_CACHE_BEGIN %%% dfa_enable_highlight_cache("ledir.dfa", name); dfa_define_highlight_rule("[A-Za-z0-9\\-_]+\\.c}", "ledir_yellow", name); dfa_define_highlight_rule("[A-Za-z0-9\\-_]+\\.cpp", "ledir_green", name); dfa_define_highlight_rule("[A-Za-z0-9\\-_]+\\.sl", "ledir_yellow", name); dfa_define_highlight_rule("[A-Za-z0-9\\-_]+\\.h", "ledir_green", name); dfa_define_highlight_rule("^Directory: .*$", "comment", name); dfa_define_highlight_rule("[A-Za-z0-9\\-\\+_]*" + Dir_Sep, "keyword", name); dfa_define_highlight_rule("^\\.\\./", "comment", name); %%% DFA_CACHE_END %%% dfa_build_highlight_table(name); } dfa_set_init_callback(&setup_dfa_callback, mode); % Highlighting NEEDS dfa for this mode to work. enable_dfa_syntax_for_mode(mode); #endif define fname_skip_word () { define_word("0-9A-Za-z._:/\\\\-+"); while (skip_non_word_chars(), eolp()) { if (1 != right(1)) break; } skip_word_chars(); } define ledir_right() { fname_skip_word(); fname_skip_word(); bskip_word(); } define ledir_left() { define_word("0-9A-Za-z._:/\\\\-+"); bskip_word(); } define ledir_down() { variable aa; aa = what_column(); goto_line(what_line()+1); goto_column(aa); } define ledir_up() { variable aa; aa = what_column(); goto_line(what_line()-1); goto_column(aa); } define my_buffer_format_in_columns() { push_spot_bob (); forever { _for (0,1,1) { goto_column(() * 40 + 1); if (eolp()) { if (eobp()) { pop_spot(); return; } insert_single_space; del(); } } !if (down_1 ()) break; % bol (); % this is a side effect of going down } pop_spot(); } define get_ledir_fn() { % Find the substring which could be a file name. - % The following method assumes reasonably standard file names. bskip_chars ("-0-9a-zA-Z_!%+~./"); % left limit push_mark (); skip_chars ("-0-9a-zA-Z_!%+~./"); % right limit variable fn = bufsubstr (); % the file name pop_mark_0 (); pop_spot (); return fn; } define chk_isDirectory(dir) { variable chk_file; variable i; eob(); eol(); do { ledir_left(); chk_file = get_ledir_fn(); ledir_left(); if (file_status(dir + Dir_Sep + chk_file) == 2) { fname_skip_word(); insert(Dir_Sep); ledir_left(); } } while (what_line()!=2); } define patch_dirname(basedir) { variable aa; aa = strlen(basedir); if (basedir[aa-1]==0x2f) { basedir=substr(basedir,1,aa-1); } return basedir; } define reload_listdir(basedir) { variable pat="*"; if (file_status (basedir) != 2) verror ("%s is not a directory", basedir); variable files = listdir (basedir); if (files == NULL) files = String_Type[0]; pat = glob_to_regexp (pat); files = files[where(array_map (Int_Type, &string_match, files, pat, 1))]; files = files[array_sort(files)]; variable file, buf, flags; (file,,buf,flags) = getbuf_info (); setbuf_info (file, basedir, buf, flags); set_readonly (0); erase_buffer (); if (length (files)) { array_map (Void_Type, &vinsert, "%s\n", files); my_buffer_format_in_columns (); } bob (); if (strlen(basedir)!=1) basedir=patch_dirname(basedir); vinsert ("Directory: %s\n",basedir); vinsert (".. \n",basedir); chk_isDirectory(basedir); bob (); set_buffer_modified_flag (0); set_readonly (1); } define ledir_open() { variable basedir,basefile,fn; variable cur_line=what_line(); if (cur_line==1) { message("Summary Dir just FYR :-)"); return; } push_spot(); bob(); go_right(ffind("Directory: ")); push_mark(); eol(); basedir = bufsubstr(); pop_spot(); push_spot (); fn = get_ledir_fn(); !if (strcmp(fn,"../")) { basedir=path_dirname(basedir); reload_listdir(basedir); return; } basefile=strcat(strcat(basedir,"/"),fn); variable chkdir; variable bl_len; bl_len = strlen(basefile); if (bl_len>1) bl_len--; if (basefile[bl_len]==0x2f) chkdir=basefile; else chkdir=strcat(basefile,"/"); if (file_status (chkdir) == 2) { reload_listdir(chkdir); return; } !if (1 == file_status (basefile)) { error(strcat("File ",fn," not found")); } else { delbuf(whatbuf()); call ("one_window"); () = find_file (basefile); } return; } define ledir_exit() { call ("delete_window"); } public define ledir_mode() { set_readonly (1); set_mode(mode,0); use_syntax_table (mode); use_keymap (mode); run_mode_hooks(mode+"_mode_hook"); } define list_dir () { variable pat = read_file_from_mini ("EDiT:"); variable rfile; !if (strlen (pat)) return; variable dir = path_dirname (pat); pat = path_basename (pat); !if (strlen(pat)) pat = "*"; rfile = dir +"/" + pat; if (file_status (rfile) == 1) { find_file(rfile); return; } if (file_status (dir) != 2) verror ("%s is not a directory", dir); variable files = listdir (dir); if (files == NULL) files = String_Type[0]; pat = glob_to_regexp (pat); files = files[where(array_map (Int_Type, &string_match, files, pat, 1))]; files = files[array_sort(files)]; variable cbuf = whatbuf (); pop2buf (List_Dir); variable file, buf, flags; (file,,buf,flags) = getbuf_info (); setbuf_info (file, dir, buf, flags); erase_buffer (); if (length (files)) { array_map (Void_Type, &vinsert, "%s\n", files); my_buffer_format_in_columns (); } bob (); vinsert ("Directory: %s\n", dir); vinsert (".. \n", dir); chk_isDirectory(dir); bob(); set_buffer_modified_flag (0); % pop2buf (cbuf); ledir_mode(); }