File: recent.sl

package info (click to toggle)
jed 0.99.16-5
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 4,312 kB
  • ctags: 4,736
  • sloc: ansic: 36,879; sh: 8,660; makefile: 379
file content (226 lines) | stat: -rw-r--r-- 5,408 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
% File:          recent.sl      -*- SLang -*-
%
% Author:        Guido Gonzato, <ggonza@tin.it>
% 
% Version:       1.0.1. This file provides easy access to recently
%                accessed files.
%
% Installation:  to install this feature globally, load recent.sl from site.sl
%                and insert the following lines in defaults.sl:
%
%                  variable RECENT_FILES_LIST = ".jedrecent";    % or other
%                  variable MAX_RECENT_FILES  = 20;              % ditto
%
%                For personal customisation, insert these lines in your .jedrc:
% 
%                  % WANT_RECENT_FILES_LIST = 1 % set this to 0 to disable
%                  % RECENT_FILES_LIST = ".jedrecent"; % uncomment to customise
%                  % MAX_RECENT_FILES  = 10;
%
% Last updated:  17 April 2001
_traceback=1;
_debug_info=1;

custom_variable ("WANT_RECENT_FILES_LIST", 1);
#ifdef IBMPC_SYSTEM
custom_variable ("RECENT_FILES_LIST", "_jedrcnt");
#else
custom_variable ("RECENT_FILES_LIST", ".jedrecent");
#endif
custom_variable ("MAX_RECENT_FILES", 15);

% -----

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The Jed_Home_Directory code is in 0.99-14 site.sl
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#ifnexists Jed_Home_Directory
public variable Jed_Home_Directory;
#ifdef VMS
Jed_Home_Directory = "SYS$LOGIN:";
if (NULL != getenv("JED_HOME")) 
  Jed_Home_Directory = "JED_HOME:";
#else
Jed_Home_Directory = getenv ("JED_HOME");
if (Jed_Home_Directory == NULL)
  Jed_Home_Directory = getenv("HOME");
#endif
if (Jed_Home_Directory == NULL)
  Jed_Home_Directory = "";
#endif
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

static variable Recent_Files_Buf = " *recent files*";
static variable List_Of_Buffers = NULL;

static define get_recent_file_list_name ()
{
   variable file = RECENT_FILES_LIST;
   
% Versions of slang prior to 1.4.3 have a bug in the path_is_absolute function.
   if (_slang_version >= 10403)
     {
	if (path_is_absolute (file))
	  return file;
     }

   variable dir = Jed_Home_Directory;
#ifdef IBMPC_SYSTEM
   if (dir == "")
     {
	dir = getenv ("TEMP");
	if (dir == NULL)
	  dir = "";
     }
#endif
   return dircat (dir, file);
}

% Load the list of recent files in recent_files_buf.
static define load_recent_file_list ()
{
   variable file = get_recent_file_list_name ();

   if (bufferp (Recent_Files_Buf))
     {
	setbuf (Recent_Files_Buf);
	if (file_changed_on_disk (file))
	  delbuf (Recent_Files_Buf);
     }

   !if (bufferp (Recent_Files_Buf))
     {
	() = read_file (file);
	rename_buffer (Recent_Files_Buf);
     }
   bob ();
}


% Build the menu of recent files.
public define recent_files_menu_callback (popup)
{
  variable buf, tmp, i, cmd;
  variable menu;

  buf = whatbuf ();
  load_recent_file_list ();  % load the list of recent files
  bob ();
  
  i = '1'; % use 1-9 first, then a-z, then A-Z, then give up and restart
   
  forever
     {
	tmp = line_as_string ();
	!if (strlen (tmp))
	  break;
	
	cmd = sprintf ("()=find_file (\"%s\")", tmp);
	(cmd, ) = strreplace (cmd, "\\", "\\\\", strlen (cmd)); % fix DOS
	menu_append_item (popup, sprintf ("&%c %s", i, tmp), cmd);
	go_down_1 ();

	% check - what should we use?
	switch (i)
	  { case '9': i = 'a' - 1; }
	  { case 'z': i = 'A' - 1; }
	  { case 'Z': i = '1' - 1; }
	i++;
     }
  
  setbuf (buf);
}


% This function is called by _jed_switch_active_buffer_hooks
public define append_recent_files (buf)
{
   variable file, dir, n;
   variable blist;

   !if (WANT_RECENT_FILES_LIST)
     return;

   % find out the file name with full path
   (file,dir,buf,) = getbuf_info ();
   !if (strlen (file))
     return;

   blist = [buffer_list (), pop ()];

   file = dircat (dir, file);
   load_recent_file_list ();

   EXIT_BLOCK
     {
	sw2buf (buf);
	List_Of_Buffers = blist;
     }
   
   if (is_readonly ())
     return;			       %  no permission to modify buffer/list

   % Check to see if this one is already on the list
   bob ();
   if (file == line_as_string ())
     return;

   % Only add the file to the list if it is not on the list, or it was 
   % not in the previously checked list of buffers.
   
   if (List_Of_Buffers != NULL)
     {
	if (length (where (List_Of_Buffers == buf)))
	  return;
     }

  if (bol_fsearch (file))
    {
       go_right (strlen (file));
       if (eolp ())
	 delete_line ();
    }
   bob ();
   vinsert ("%s\n", file);

   % are there more entries than allowed?
   goto_line (MAX_RECENT_FILES);
   if (down_1 ())
     {
	bol ();
	push_mark ();
	eob ();
	del_region ();
     }
   
   ERROR_BLOCK
     {
	_clear_error ();
     }
   () = write_buffer (get_recent_file_list_name ());
}

%add_to_hook ("_jed_find_file_after_hooks", &append_recent_files);
append_to_hook ("_jed_switch_active_buffer_hooks", &append_recent_files);

static define add_recent_files_popup_hook (menubar)
{
   !if (WANT_RECENT_FILES_LIST)
     return;

   variable menu = "Global.&File";
   
   menu_append_separator (menu);
   menu_append_popup (menu, "&Recent Files");
   menu_set_select_popup_callback (strcat (menu, ".&Recent Files"),
				   &recent_files_menu_callback);
}

#ifexists _jed_run_hooks
append_to_hook ("load_popup_hooks", &add_recent_files_popup_hook);
#else
variable Menu_Load_Popups_Hook = &add_recent_files_popup_hook;
#endif

% End of file recent.sl