Mercurial > emacs
view lisp/vc-hooks.el @ 4872:628cbf7e7005
(comint-after-partial-file-name-command):
Renamed from comint-after-partial-pathname-command.
(comint-match-partial-file-name, comint-after-partial-file-name):
Renamed from comint-match-partial-pathname, etc.
(comint-last-output-start): New variable to record
where most recent process output started from.
(comint-mode): Initialise it.
(comint-output-filter): Set it.
(comint-previous-matching-input-string): Moved to
comint-previous-matching-input-position.
(comint-previous-matching-input-string): Use it.
(comint-search-arg, comint-search-start,
comint-previous-input-string): New subroutines.
(comint-previous-input, comint-next-input,
comint-previous-matching-input, comint-next-matching-input,
comint-previous-matching-input-from-input,
comint-next-matching-input-from-input): Use them.
(comint-mode-map): Added signal menu-bar. Moved
comint-backward/forward-matching-input to output menu-bar, since
they move within the buffer rather than do input.
(comint-send-input, comint-after-pmark-p,
comint-kill-input, comint-proc-query): Removed serialisation of
obtaining the process mark's marker-position.
Commented out comint-load-hooks.
(comint-dynamic-simple-complete): New subroutine.
(comint-dynamic-complete-filename-command): New variable.
(comint-after-partial-pathname-command): New variable.
(comint-after-partial-pathname): New subroutine.
(comint-dynamic-complete): Use them.
(comint-mode): Make them local.
Renamed comint-dynamic-complete-command to
comint-dynamic-complete-command-command for consistency.
Renamed comint-file-name-addsuffix/autolist/recexact to
comint-completion-addsuffix/autolist/recexact for consistency.
(comint-replace-by-expanded-history): Check if input
ring size is not big enough for relative reference.
(comint-read-input-ring, comint-input-ring-file-name):
From shell.el.
(shell-write-input-ring): New subroutine.
(comint-file-name-prefix): New variable.
(comint-directory): New inline subroutine.
(comint-dynamic-complete-filename, comint-dynamic-complete-variable,
comint-dynamic-list-filename-completions): Use it.
(comint-dynamic-complete-filename,
comint-dynamic-complete-variable,
comint-dynamic-list-filename-completions): Make sure local
completion-ignore-case is nil.
(comint-next-prompt, comint-previous-prompt): Use
paragraph-start and paragraph motion commands rather than
re-search-forward and re-search-backward commands.
(comint-dynamic-list-input-ring,
comint-previous-matching-input-string): Use ring-empty-p rather
than zerop and ring-length.
(comint-input-ignoredups): New variable.
(comint-send-input, shell-read-input-ring): Use it.
(comint-mode): Make comint-input-ignoredups local. Doc fix.
(comint-scroll-to-bottom-on-input): New variable.
(comint-scroll-to-bottom-on-output): New variable.
(comint-scroll-show-maximum-output): New variable.
(comint-output-filter-hook): New variable, defaults to
comint-postoutput-scroll-to-bottom.
(comint-output-filter): Renamed from comint-filter
for consistency. Now calls comint-output-filter-hook.
(comint-preinput-scroll-to-bottom): New subroutine.
(comint-postoutput-scroll-to-bottom): New subroutine.
(comint-show-maximum-output): New command.
(comint-copy-old-input): New command.
(comint-send-input): Run comint-output-filter-hook if
necessary as a kludge to prevent messy redisplays.
(comint-mode-map): Added comint-show-maximum-output to
C-c C-e and menu-bar output, and comint-copy-old-input to C-c C-i
and menu-bar input.
(comint-mode): Make local variables
comint-scroll-to-bottom-on-input, before-change-function,
comint-scroll-to-bottom-on-output, comint-scroll-show-maximum-output,
and comint-output-filter-hook.
(comint-version): Deleted--no need for separate version.
(comint-input-ring-index): Make this a permanent local.
(comint-mode): Don't alter comint-input-ring-index or comint-input-ring
if already set meaningfully.
(comint-mode-map): Added keys M-R/S for
comint-previous/next-matching-input-from-input and to completion
menu-bar. Added comint-forward/backward-matching-input and
comint-previous/next-matching-input to completion menu-bar.
(comint-mode): Doc fix for functionality.
(comint-exec-1): Uses setenv.
(comint-update-env): Removed.
(comint-input-ring-size): Incremented to 32, as with
command history.
(comint-dynamic-list-input-ring): Check for zero
length ring. Use ring length, not ring size, when generating
list. Use buffer " *Input History*".
(comint-previous-matching-input-string): Check for zero-length ring.
Check last item in case at end of cycle and it's a match.
(comint-searching-input-ring): New subroutine.
(comint-regexp-arg): New subroutine.
(comint-previous-matching-input-from-input): New command.
(comint-next-matching-input-from-input): New command.
(comint-replace-by-expanded-history): Fix for matching
inside quotes. Fix to allow argument subrange specifiers. Fix to
identify and reject absolute input number references.
(comint-within-quotes): New subroutine.
(comint-how-many-region): New subroutine.
(comint-args): New subroutine.
(comint-delim-arg): New subroutine.
(comint-arguments): New subroutine.
(comint-delimiter-argument-list): New variable.
(comint-send-input): Inserts input arguments into ring
separated by single spaces.
(comint-filter): Checks the buffer's process to make
sure it's still there. Otherwise, set-buffer will fail.
(comint-backward-matching-input): New command.
(comint-forward-matching-input): New command.
(comint-next-prompt, comint-previous-prompt):
Error if reach beg/end of buffer.
(comint-dynamic-complete): Fix for absolute input
number references.
(comint-dynamic-complete-filename): Changed listings
function to comint-dynamic-list-filename-completions. Uses
file-directory-p rather than string-match to test for directories.
(comint-dynamic-list-completions): Changed to list the
list of completions supplied as the function argument. Use buffer
" *Completions*".
(comint-match-partial-pathname): New subroutine.
(comint-dynamic-complete-variable): New command.
(comint-dynamic-list-filename-completions): New function.
(comint-previous-input):
Don't use replace-match; just insert before deleting.
(comint-magic-space): Use self-insert command.
(comint-history-file-name): New variable.
(comint-mode): Initialize comint-input-ring before
running comint-mode-hook.
(comint-input-autoexpand): New variable.
(comint-dynamic-complete-command): New variable.
(comint-get-current-command): New variable.
(comint-read-input-ring): New function.
(comint-send-input): Handle history expansion.
(comint-input-sentinel): Doc fix.
(comint-mode-map): Added key binding for C-c C-h.
Added menu bars for completion, input and output.
(comint-dynamic-list-input-ring): New function.
(comint-previous-input-string): New subroutine.
(comint-previous-input): Use it.
(comint-previous-matching-input-string): New subroutine.
(comint-previous-matching-input): Use it.
(comint-replace-by-expanded-history): New command.
(comint-magic-space): New command.
(comint-replace-by-expanded-filename): Now replaces
expanded match for a filename, and then calls filename completion
comint-dynamic-complete-filename to do file name completion.
(comint-kill-output): Don't kill prompt.
(comint-show-output): Don't move point if it's
visible where it is, and if point is moved, put it after prompt.
(comint-dynamic-complete): Totally new definition.
(comint-dynamic-complete-filename): New name for old
function comint-dynamic-complete, completes files and lists
candidates, souped up for configurability.
(comint-dynamic-complete-variable): New command.
(comint-file-name-autolist): New variable.
(comint-file-name-addsuffix): New variable,
(comint-file-name-recexact): New variable.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Fri, 22 Oct 1993 02:57:36 +0000 |
parents | f7a2f8a2f883 |
children | 04d6b9e7782a |
line wrap: on
line source
;;; vc-hooks.el --- resident support for version-control ;; Copyright (C) 1992, 1993 Free Software Foundation, Inc. ;; Author: Eric S. Raymond <esr@snark.thyrsus.com> ;; Version: 5.3 ;; This file is part of GNU Emacs. ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 2, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;;; Commentary: ;; See the commentary of vc.el. ;;; Code: (defvar vc-master-templates '(("%sRCS/%s,v" . RCS) ("%s%s,v" . RCS) ("%sRCS/%s" . RCS) ("%sSCCS/s.%s" . SCCS) ("%ss.%s". SCCS)) "*Where to look for version-control master files. The first pair corresponding to a given back end is used as a template when creating new masters.") (defvar vc-make-backup-files nil "*If non-nil, backups of registered files are made according to the make-backup-files variable. Otherwise, prevents backups being made.") (defvar vc-rcs-status t "*If non-nil, revision and locks on RCS working file displayed in modeline. Otherwise, not displayed.") ;; Tell Emacs about this new kind of minor mode (if (not (assoc 'vc-mode minor-mode-alist)) (setq minor-mode-alist (cons '(vc-mode vc-mode) minor-mode-alist))) (make-variable-buffer-local 'vc-mode) (put 'vc-mode 'permanent-local t) ;; We need a notion of per-file properties because the version ;; control state of a file is expensive to derive --- we don't ;; want to recompute it even on every find. (defmacro vc-error-occurred (&rest body) (list 'condition-case nil (cons 'progn (append body '(nil))) '(error t))) (defvar vc-file-prop-obarray [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] "Obarray for per-file properties.") (defun vc-file-setprop (file property value) ;; set per-file property (put (intern file vc-file-prop-obarray) property value)) (defun vc-file-getprop (file property) ;; get per-file property (get (intern file vc-file-prop-obarray) property)) ;;; actual version-control code starts here (defun vc-registered (file) (let (handler handlers) (if (boundp 'file-name-handler-alist) (save-match-data (setq handlers file-name-handler-alist) (while (and (consp handlers) (null handler)) (if (and (consp (car handlers)) (stringp (car (car handlers))) (string-match (car (car handlers)) file)) (setq handler (cdr (car handlers)))) (setq handlers (cdr handlers))))) (if handler (funcall handler 'vc-registered file) ;; Search for a master corresponding to the given file (let ((dirname (or (file-name-directory file) "")) (basename (file-name-nondirectory file))) (catch 'found (mapcar (function (lambda (s) (let ((trial (format (car s) dirname basename))) (if (and (file-exists-p trial) ;; Make sure the file we found with name ;; TRIAL is not the source file itself. ;; That can happen with RCS-style names ;; if the file name is truncated ;; (e.g. to 14 chars). See if either ;; directory or attributes differ. (or (not (string= dirname (file-name-directory trial))) (not (equal (file-attributes file) (file-attributes trial))))) (throw 'found (cons trial (cdr s))))))) vc-master-templates) nil))))) (defun vc-name (file) "Return the master name of a file, nil if it is not registered." (or (vc-file-getprop file 'vc-name) (let ((name-and-type (vc-registered file))) (if name-and-type (progn (vc-file-setprop file 'vc-backend (cdr name-and-type)) (vc-file-setprop file 'vc-name (car name-and-type))))))) (defun vc-backend-deduce (file) "Return the version-control type of a file, nil if it is not registered." (and file (or (vc-file-getprop file 'vc-backend) (let ((name-and-type (vc-registered file))) (if name-and-type (progn (vc-file-setprop file 'vc-name (car name-and-type)) (vc-file-setprop file 'vc-backend (cdr name-and-type)))))))) (defun vc-toggle-read-only () "Change read-only status of current buffer, perhaps via version control. If the buffer is visiting a file registered with version control, then check the file in or out. Otherwise, just change the read-only flag of the buffer." (interactive) (if (vc-backend-deduce (buffer-file-name)) (vc-next-action nil) (toggle-read-only))) (define-key global-map "\C-x\C-q" 'vc-toggle-read-only) (defun vc-mode-line (file &optional label) "Set `vc-mode' to display type of version control for FILE. The value is set in the current buffer, which should be the buffer visiting FILE." (interactive (list buffer-file-name nil)) (let ((vc-type (vc-backend-deduce file))) (setq vc-mode (and vc-type (concat " " (or label (symbol-name vc-type)) (if (and vc-rcs-status (eq vc-type 'RCS)) (vc-rcs-status file))))) ;; force update of mode line (set-buffer-modified-p (buffer-modified-p)) vc-type)) (defun vc-rcs-status (file) ;; Return string for placement in modeline by `vc-mode-line'. ;; If FILE is not registered under RCS, return nil. ;; If FILE is registered but not locked, return " REV" if there is a head ;; revision and " @@" otherwise. ;; If FILE is locked then return all locks in a string of the ;; form " LOCKER1:REV1 LOCKER2:REV2 ...", where "LOCKERi:" is empty if you ;; are the locker, and otherwise is the name of the locker followed by ":". ;; Algorithm: ;; 1. Check for master file corresponding to FILE being visited. ;; ;; 2. Insert the first few characters of the master file into a work ;; buffer. ;; ;; 3. Search work buffer for "locks...;" phrase; if not found, then ;; keep inserting more characters until the phrase is found. ;; ;; 4. Extract the locks, and remove control characters ;; separating them, like newlines; the string " user1:revision1 ;; user2:revision2 ..." is returned. ;; Limitations: ;; The output doesn't show which version you are actually looking at. ;; The modeline can get quite cluttered when there are multiple locks. ;; The head revision is probably not what you want if you've used `rcs -b'. (let ((master (vc-name file)) found) ;; If master file exists, then parse its contents, otherwise we return the ;; nil value of this if form. (if master (save-excursion ;; Create work buffer. (set-buffer (get-buffer-create " *vc-rcs-status*")) (setq buffer-read-only nil default-directory (file-name-directory master)) (erase-buffer) ;; Check if we have enough of the header. ;; If not, then keep including more. (while (not (or found (let ((s (buffer-size))) (goto-char (1+ s)) (zerop (car (cdr (insert-file-contents master nil s (+ s 8192)))))))) (beginning-of-line) (setq found (re-search-forward "^locks\\([^;]*\\);" nil t))) (if found ;; Clean control characters and self-locks from text. (let* ((lock-pattern (concat "[ \b\t\n\v\f\r]+\\(" (regexp-quote (user-login-name)) ":\\)?")) (locks (save-restriction (narrow-to-region (match-beginning 1) (match-end 1)) (goto-char (point-min)) (while (re-search-forward lock-pattern nil t) (replace-match (if (eobp) "" "-") t t)) (buffer-string))) (status (if (not (string-equal locks "")) locks (goto-char (point-min)) (if (looking-at "head[ \b\t\n\v\f\r]+\\([.0-9]+\\)") (concat "-" (buffer-substring (match-beginning 1) (match-end 1))) " @@")))) ;; Clean work buffer. (erase-buffer) (set-buffer-modified-p nil) status)))))) ;;; install a call to the above as a find-file hook (defun vc-find-file-hook () ;; Recompute whether file is version controlled, ;; if user has killed the buffer and revisited. (if buffer-file-name (vc-file-setprop buffer-file-name 'vc-backend nil)) (if (and (vc-mode-line buffer-file-name) (not vc-make-backup-files)) (progn (make-local-variable 'make-backup-files) (setq make-backup-files nil)))) (add-hook 'find-file-hooks 'vc-find-file-hook) ;;; more hooks, this time for file-not-found (defun vc-file-not-found-hook () "When file is not found, try to check it out from RCS or SCCS. Returns t if checkout was successful, nil otherwise." (if (vc-backend-deduce buffer-file-name) (progn (require 'vc) (not (vc-error-occurred (vc-checkout buffer-file-name)))))) (add-hook 'find-file-not-found-hooks 'vc-file-not-found-hook) ;;; Now arrange for bindings and autoloading of the main package. ;;; Bindings for this have to go in the global map, as we'll often ;;; want to call them from random buffers. (setq vc-prefix-map (lookup-key global-map "\C-xv")) (if (not (keymapp vc-prefix-map)) (progn (setq vc-prefix-map (make-sparse-keymap)) (define-key global-map "\C-xv" vc-prefix-map) (define-key vc-prefix-map "a" 'vc-update-change-log) (define-key vc-prefix-map "c" 'vc-cancel-version) (define-key vc-prefix-map "d" 'vc-directory) (define-key vc-prefix-map "h" 'vc-insert-headers) (define-key vc-prefix-map "i" 'vc-register) (define-key vc-prefix-map "l" 'vc-print-log) (define-key vc-prefix-map "r" 'vc-retrieve-snapshot) (define-key vc-prefix-map "s" 'vc-create-snapshot) (define-key vc-prefix-map "u" 'vc-revert-buffer) (define-key vc-prefix-map "v" 'vc-next-action) (define-key vc-prefix-map "=" 'vc-diff) (define-key vc-prefix-map "~" 'vc-version-other-window) )) (provide 'vc-hooks) ;;; vc-hooks.el ends here