comparison lisp/server.el @ 10961:88cba63f2a9b

(server-buffer-done): Return a list (NEXT-BUFFER KILLED). KILLED is t if we killed the buffer. (server-edit): Values from server-done is now list of args for server-switch-buffer. (server-switch-buffer): Likewise. (server-switch-buffer): New optional arg KILLED-ONE. Avoid the other-buffer at the end in that case.
author Richard M. Stallman <rms@gnu.org>
date Sat, 11 Mar 1995 20:32:48 +0000
parents 44d98e169823
children e6bdaaa6ce1b
comparison
equal deleted inserted replaced
10960:d6d3905ec550 10961:88cba63f2a9b
238 (set-buffer obuf)) 238 (set-buffer obuf))
239 (nconc client client-record))) 239 (nconc client client-record)))
240 240
241 (defun server-buffer-done (buffer) 241 (defun server-buffer-done (buffer)
242 "Mark BUFFER as \"done\" for its client(s). 242 "Mark BUFFER as \"done\" for its client(s).
243 Buries the buffer, and returns another server buffer 243 This buries the buffer, then returns a list of the form (NEXT-BUFFER KILLED).
244 as a suggestion for what to select next." 244 NEXT-BUFFER is another server buffer, as a suggestion for what to select next,
245 or nil. KILLED is t if we killed BUFFER (because it was a temp file)."
245 (let ((running (eq (process-status server-process) 'run)) 246 (let ((running (eq (process-status server-process) 'run))
246 (next-buffer nil) 247 (next-buffer nil)
248 (killed nil)
247 (old-clients server-clients)) 249 (old-clients server-clients))
248 (while old-clients 250 (while old-clients
249 (let ((client (car old-clients))) 251 (let ((client (car old-clients)))
250 (or next-buffer 252 (or next-buffer
251 (setq next-buffer (nth 1 (memq buffer client)))) 253 (setq next-buffer (nth 1 (memq buffer client))))
275 (save-excursion 277 (save-excursion
276 (set-buffer buffer) 278 (set-buffer buffer)
277 (setq server-buffer-clients nil) 279 (setq server-buffer-clients nil)
278 (run-hooks 'server-done-hook)) 280 (run-hooks 'server-done-hook))
279 (if (server-temp-file-p buffer) 281 (if (server-temp-file-p buffer)
280 (kill-buffer buffer) 282 (progn (kill-buffer buffer)
283 (setq killed t))
281 (bury-buffer buffer)))) 284 (bury-buffer buffer))))
282 next-buffer)) 285 (list next-buffer killed)))
283 286
284 (defun server-temp-file-p (buffer) 287 (defun server-temp-file-p (buffer)
285 "Return non-nil if BUFFER contains a file considered temporary. 288 "Return non-nil if BUFFER contains a file considered temporary.
286 These are files whose names suggest they are repeatedly 289 These are files whose names suggest they are repeatedly
287 reused to pass information to another program. 290 reused to pass information to another program.
291 (and (buffer-file-name buffer) 294 (and (buffer-file-name buffer)
292 (string-match server-temp-file-regexp (buffer-file-name buffer)))) 295 (string-match server-temp-file-regexp (buffer-file-name buffer))))
293 296
294 (defun server-done () 297 (defun server-done ()
295 "Offer to save current buffer, mark it as \"done\" for clients. 298 "Offer to save current buffer, mark it as \"done\" for clients.
296 Then bury it, and return a suggested buffer to select next." 299 This buries the buffer, then returns a list of the form (NEXT-BUFFER KILLED).
300 NEXT-BUFFER is another server buffer, as a suggestion for what to select next,
301 or nil. KILLED is t if we killed the BUFFER (because it was a temp file)."
297 (let ((buffer (current-buffer))) 302 (let ((buffer (current-buffer)))
298 (if server-buffer-clients 303 (if server-buffer-clients
299 (progn 304 (progn
300 (if (server-temp-file-p buffer) 305 (if (server-temp-file-p buffer)
301 ;; For a temp file, save, and do make a non-numeric backup 306 ;; For a temp file, save, and do make a non-numeric backup
349 (interactive "P") 354 (interactive "P")
350 (if (or arg 355 (if (or arg
351 (not server-process) 356 (not server-process)
352 (memq (process-status server-process) '(signal exit))) 357 (memq (process-status server-process) '(signal exit)))
353 (server-start nil) 358 (server-start nil)
354 (server-switch-buffer (server-done)))) 359 (apply 'server-switch-buffer (server-done))))
355 360
356 (defun server-switch-buffer (next-buffer) 361 (defun server-switch-buffer (next-buffer &optional killed-one)
357 "Switch to another buffer, preferably one that has a client. 362 "Switch to another buffer, preferably one that has a client.
358 Arg NEXT-BUFFER is a suggestion; if it is a live buffer, use it." 363 Arg NEXT-BUFFER is a suggestion; if it is a live buffer, use it."
364 ;; KILLED-ONE is t in a recursive call
365 ;; if we have already killed one temp-file server buffer.
366 ;; This means we should avoid the final "switch to some other buffer"
367 ;; since we've already effectively done that.
359 (cond ((and (windowp server-window) 368 (cond ((and (windowp server-window)
360 (window-live-p server-window)) 369 (window-live-p server-window))
361 (select-window server-window)) 370 (select-window server-window))
362 ((framep server-window) 371 ((framep server-window)
363 (if (not (frame-live-p server-window)) 372 (if (not (frame-live-p server-window))
376 (buffer-name next-buffer)) 385 (buffer-name next-buffer))
377 (switch-to-buffer next-buffer) 386 (switch-to-buffer next-buffer)
378 ;; If NEXT-BUFFER is a dead buffer, 387 ;; If NEXT-BUFFER is a dead buffer,
379 ;; remove the server records for it 388 ;; remove the server records for it
380 ;; and try the next surviving server buffer. 389 ;; and try the next surviving server buffer.
381 (server-switch-buffer 390 (apply 'server-switch-buffer
382 (server-buffer-done next-buffer))) 391 (server-buffer-done next-buffer)))
383 (if server-clients 392 (if server-clients
384 (server-switch-buffer (nth 1 (car server-clients))) 393 (server-switch-buffer (nth 1 (car server-clients)) killed-one)
385 (switch-to-buffer (other-buffer))))) 394 (if (not killed-one)
395 (switch-to-buffer (other-buffer))))))
386 396
387 (global-set-key "\C-x#" 'server-edit) 397 (global-set-key "\C-x#" 'server-edit)
388 398
389 (provide 'server) 399 (provide 'server)
390 400