Mercurial > emacs
comparison lisp/comint.el @ 55295:16abc166af9d
(comint-prompt-read-only): Update docstring.
(comint-update-fence, comint-kill-whole-line)
(comint-kill-region): New functions.
author | Luc Teirlinck <teirllm@auburn.edu> |
---|---|
date | Sat, 01 May 2004 20:14:23 +0000 |
parents | 14d50685dce0 |
children | 79a700a71463 |
comparison
equal
deleted
inserted
replaced
55294:1b8ead47966a | 55295:16abc166af9d |
---|---|
171 | 171 |
172 This is a good thing to set in mode hooks.") | 172 This is a good thing to set in mode hooks.") |
173 | 173 |
174 (defcustom comint-prompt-read-only nil | 174 (defcustom comint-prompt-read-only nil |
175 "If non-nil, the comint prompt is read only. | 175 "If non-nil, the comint prompt is read only. |
176 The read only region includes the newline before the prompt. | |
176 This does not affect existing prompts. | 177 This does not affect existing prompts. |
177 Certain derived modes may override this option." | 178 Certain derived modes may override this option. |
179 | |
180 If you set this option to t, then the safe way to temporarily | |
181 override the read-only-ness of comint prompts is to call | |
182 `comint-kill-whole-line' or `comint-kill-region' with no | |
183 narrowing in effect. This way you will be certain that none of | |
184 the remaining prompts will be accidentally messed up. You may | |
185 wish to put something like the following in your `.emacs' file: | |
186 | |
187 \(add-hook 'comint-mode-hook | |
188 '(lambda () | |
189 (define-key comint-mode-map \"\C-w\" 'comint-kill-region) | |
190 (define-key comint-mode-map [C-S-backspace] | |
191 'comint-kill-whole-line))) | |
192 | |
193 If you sometimes use comint-mode on text-only terminals or with `emacs-nw', | |
194 you might wish to use another binding for `comint-kill-whole-line'." | |
178 :type 'boolean | 195 :type 'boolean |
179 :group 'comint | 196 :group 'comint |
180 :version "21.4") | 197 :version "21.4") |
181 | 198 |
182 (defvar comint-delimiter-argument-list () | 199 (defvar comint-delimiter-argument-list () |
2309 ;; Add a terminating space if necessary. | 2326 ;; Add a terminating space if necessary. |
2310 (unless (eolp) | 2327 (unless (eolp) |
2311 (just-one-space))) | 2328 (just-one-space))) |
2312 | 2329 |
2313 | 2330 |
2331 ;; Support editing with `comint-prompt-read-only' set to t. | |
2332 | |
2333 (defun comint-update-fence () | |
2334 "Update read-only status of newline before point. | |
2335 The `fence' read-only property is used to indicate that a newline | |
2336 is read-only for no other reason than to \"fence off\" a | |
2337 following front-sticky read-only region. This is used to | |
2338 implement comint read-only prompts. If the text after a newline | |
2339 changes, the read-only status of that newline may need updating. | |
2340 That is what this function does. | |
2341 | |
2342 This function does nothing if point is not at the beginning of a | |
2343 line, or is at the beginning of the accessible portion of the buffer. | |
2344 Otherwise, if the character after point has a front-sticky | |
2345 read-only property, then the preceding newline is given a | |
2346 read-only property of `fence', unless it already is read-only. | |
2347 If the character after point does not have a front-sticky | |
2348 read-only property, any read-only property of `fence' on the | |
2349 preceding newline is removed." | |
2350 (let* ((pt (point)) (lst (get-text-property pt 'front-sticky))) | |
2351 (and (bolp) | |
2352 (not (bobp)) | |
2353 (if (and (get-text-property pt 'read-only) | |
2354 (if (listp lst) (memq 'read-only lst) t)) | |
2355 (unless (get-text-property (1- pt) 'read-only) | |
2356 (put-text-property (1- pt) pt 'read-only 'fence)) | |
2357 (when (eq (get-text-property (1- pt) 'read-only) 'fence) | |
2358 (remove-list-of-text-properties (1- pt) pt '(read-only))))))) | |
2359 | |
2360 (defun comint-kill-whole-line (&optional arg) | |
2361 "Kill current line, ignoring read-only and field properties. | |
2362 With prefix arg, kill that many lines starting from the current line. | |
2363 If arg is negative, kill backward. Also kill the preceding newline, | |
2364 instead of the trailing one. \(This is meant to make C-x z work well | |
2365 with negative arguments.) | |
2366 If arg is zero, kill current line but exclude the trailing newline. | |
2367 The read-only status of newlines is updated with `comint-update-fence', | |
2368 if necessary." | |
2369 (interactive "p") | |
2370 (let ((inhibit-read-only t) (inhibit-field-text-motion t)) | |
2371 (kill-whole-line arg) | |
2372 (when (>= arg 0) (comint-update-fence)))) | |
2373 | |
2374 (defun comint-kill-region (beg end &optional yank-handler) | |
2375 "Like `kill-region', but ignores read-only properties, if safe. | |
2376 This command assumes that the buffer contains read-only | |
2377 \"prompts\" which are regions with front-sticky read-only | |
2378 properties at the beginning of a line, with the preceding newline | |
2379 being read-only to protect the prompt. This is true of the | |
2380 comint prompts if `comint-prompt-read-only' is non-nil. This | |
2381 command will not delete the region if this would create mutilated | |
2382 or out of place prompts. That is, if any part of a prompt is | |
2383 deleted, the entire prompt must be deleted and all remaining | |
2384 prompts should stay at the beginning of a line. If this is not | |
2385 the case, this command just calls `kill-region' with all | |
2386 read-only properties intact. The read-only status of newlines is | |
2387 updated using `comint-update-fence', if necessary." | |
2388 (interactive "r") | |
2389 (save-excursion | |
2390 (let* ((true-beg (min beg end)) | |
2391 (true-end (max beg end)) | |
2392 (beg-bolp (progn (goto-char true-beg) (bolp))) | |
2393 (beg-lst (get-text-property true-beg 'front-sticky)) | |
2394 (beg-bad (and (get-text-property true-beg 'read-only) | |
2395 (if (listp beg-lst) (memq 'read-only beg-lst) t))) | |
2396 (end-bolp (progn (goto-char true-end) (bolp))) | |
2397 (end-lst (get-text-property true-end 'front-sticky)) | |
2398 (end-bad (and (get-text-property true-end 'read-only) | |
2399 (if (listp end-lst) (memq 'read-only end-lst) t)))) | |
2400 (if (or (and (not beg-bolp) (or beg-bad end-bad)) | |
2401 (and (not end-bolp) end-bad)) | |
2402 (kill-region beg end yank-handler) | |
2403 (let ((inhibit-read-only t)) | |
2404 (kill-region beg end yank-handler) | |
2405 (comint-update-fence)))))) | |
2406 | |
2407 | |
2314 ;; Support for source-file processing commands. | 2408 ;; Support for source-file processing commands. |
2315 ;;============================================================================ | 2409 ;;============================================================================ |
2316 ;; Many command-interpreters (e.g., Lisp, Scheme, Soar) have | 2410 ;; Many command-interpreters (e.g., Lisp, Scheme, Soar) have |
2317 ;; commands that process files of source text (e.g. loading or compiling | 2411 ;; commands that process files of source text (e.g. loading or compiling |
2318 ;; files). So the corresponding process-in-a-buffer modes have commands | 2412 ;; files). So the corresponding process-in-a-buffer modes have commands |