Mercurial > emacs
annotate lisp/userlock.el @ 2318:50737ca2fd45
Decide automatically whether to use COFF or ELF.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Mon, 22 Mar 1993 19:50:35 +0000 |
| parents | 2cdce064065f |
| children | 14d8646c61c4 |
| rev | line source |
|---|---|
|
657
fec3f9a1e3e5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
258
diff
changeset
|
1 ;;; userlock.el --- handle file access contention between multiple users |
|
fec3f9a1e3e5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
258
diff
changeset
|
2 |
| 841 | 3 ;; Copyright (C) 1985, 1986 Free Software Foundation, inc. |
| 4 | |
|
812
485e82a8acb5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
5 ;; Maintainer: FSF |
|
485e82a8acb5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
6 ;; Keywords: internal |
|
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
657
diff
changeset
|
7 |
| 36 | 8 ;; This file is part of GNU Emacs. |
| 9 | |
| 10 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
| 11 ;; it under the terms of the GNU General Public License as published by | |
|
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
657
diff
changeset
|
12 ;; the Free Software Foundation; either version 2, or (at your option) |
| 36 | 13 ;; any later version. |
| 14 | |
| 15 ;; GNU Emacs is distributed in the hope that it will be useful, | |
| 16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 18 ;; GNU General Public License for more details. | |
| 19 | |
| 20 ;; You should have received a copy of the GNU General Public License | |
| 21 ;; along with GNU Emacs; see the file COPYING. If not, write to | |
| 22 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | |
| 23 | |
|
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
657
diff
changeset
|
24 ;;; Commentary: |
| 36 | 25 |
|
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
657
diff
changeset
|
26 ;; This file is autoloaded to handle certain conditions |
| 36 | 27 ;; detected by the file-locking code within Emacs. |
| 28 ;; The two entry points are `ask-user-about-lock' and | |
| 29 ;; `ask-user-about-supersession-threat'. | |
| 30 | |
|
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
657
diff
changeset
|
31 ;;; Code: |
| 36 | 32 |
| 33 (put 'file-locked 'error-conditions '(file-locked file-error error)) | |
| 34 | |
| 258 | 35 ;;;###autoload |
| 36 | 36 (defun ask-user-about-lock (fn opponent) |
| 37 "Ask user what to do when he wants to edit FILE but it is locked by USER. | |
| 38 This function has a choice of three things to do: | |
| 39 do (signal 'buffer-file-locked (list FILE USER)) | |
| 40 to refrain from editing the file | |
| 41 return t (grab the lock on the file) | |
| 42 return nil (edit the file even though it is locked). | |
| 43 You can rewrite it to use any criterion you like to choose which one to do." | |
| 44 (discard-input) | |
| 45 (save-window-excursion | |
| 46 (let (answer) | |
| 47 (while (null answer) | |
| 48 (message "%s is locking %s: action (s, q, p, ?)? " opponent fn) | |
| 49 (let ((tem (let ((inhibit-quit t) | |
| 50 (cursor-in-echo-area t)) | |
| 51 (prog1 (downcase (read-char)) | |
| 52 (setq quit-flag nil))))) | |
| 53 (if (= tem help-char) | |
| 54 (ask-user-about-lock-help) | |
| 55 (setq answer (assoc tem '((?s . t) | |
| 56 (?q . yield) | |
| 57 (?\C-g . yield) | |
| 58 (?p . nil) | |
| 59 (?? . help)))) | |
| 60 (cond ((null answer) | |
| 61 (beep) | |
| 62 (message "Please type q, s, or p; or ? for help") | |
| 63 (sit-for 3)) | |
| 64 ((eq (cdr answer) 'help) | |
| 65 (ask-user-about-lock-help) | |
| 66 (setq answer nil)) | |
| 67 ((eq (cdr answer) 'yield) | |
| 68 (signal 'file-locked (list "File is locked" fn opponent))))))) | |
| 69 (cdr answer)))) | |
| 70 | |
| 71 (defun ask-user-about-lock-help () | |
| 72 (with-output-to-temp-buffer "*Help*" | |
| 73 (princ "It has been detected that you want to modify a file that someone else has | |
| 74 already started modifying in EMACS. | |
| 75 | |
| 76 You can <s>teal the file; The other user becomes the | |
| 77 intruder if (s)he ever unmodifies the file and then changes it again. | |
| 78 You can <p>roceed; you edit at your own (and the other user's) risk. | |
| 79 You can <q>uit; don't modify this file."))) | |
| 80 | |
| 81 (put | |
| 82 'file-supersession 'error-conditions '(file-supersession file-error error)) | |
| 83 | |
| 258 | 84 ;;;###autoload |
| 36 | 85 (defun ask-user-about-supersession-threat (fn) |
| 86 "Ask a user who is about to modify an obsolete buffer what to do. | |
| 87 This function has two choices: it can return, in which case the modification | |
| 88 of the buffer will proceed, or it can (signal 'file-supersession (file)), | |
| 89 in which case the proposed buffer modification will not be made. | |
| 90 | |
| 91 You can rewrite this to use any criterion you like to choose which one to do. | |
| 92 The buffer in question is current when this function is called." | |
| 93 (discard-input) | |
| 94 (save-window-excursion | |
| 95 (let (answer) | |
| 96 (while (null answer) | |
| 97 (message "File has changed on disk; really want to edit the buffer? (y, n or C-h) ") | |
| 98 (let ((tem (downcase (let ((cursor-in-echo-area t)) | |
| 99 (read-char))))) | |
| 100 (setq answer | |
| 101 (if (= tem help-char) | |
| 102 'help | |
| 103 (cdr (assoc tem '((?n . yield) | |
| 104 (?\C-g . yield) | |
| 105 (?y . proceed) | |
| 106 (?? . help)))))) | |
| 107 (cond ((null answer) | |
| 108 (beep) | |
| 109 (message "Please type y or n; or ? for help") | |
| 110 (sit-for 3)) | |
| 111 ((eq answer 'help) | |
| 112 (ask-user-about-supersession-help) | |
| 113 (setq answer nil)) | |
| 114 ((eq answer 'yield) | |
| 115 (signal 'file-supersession | |
| 116 (list "File changed on disk" fn)))))) | |
| 117 (message | |
| 118 "File on disk now will become a backup file if you save these changes.") | |
| 119 (setq buffer-backed-up nil)))) | |
| 120 | |
| 121 (defun ask-user-about-supersession-help () | |
| 122 (with-output-to-temp-buffer "*Help*" | |
| 123 (princ "You want to modify a buffer whose disk file has changed | |
| 124 since you last read it in or saved it with this buffer. | |
| 125 | |
| 126 If you say `y' to go ahead and modify this buffer, | |
| 127 you risk ruining the work of whoever rewrote the file. | |
| 128 If you say `n', the change you started to make will be aborted. | |
| 129 | |
| 130 Usually, you should type `n' and then `M-x revert-buffer', | |
| 131 to get the latest version of the file, then make the change again."))) | |
| 132 | |
|
657
fec3f9a1e3e5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
258
diff
changeset
|
133 ;;; userlock.el ends here |
