view lisp/pcmpl-cvs.el @ 51195:3cbf29813eea

(struct frame): Rename members height to text_lines, width to text_cols, window_height to total_lines, window_width to total_cols, new_height to new_text_lines, new_width to new_text_cols. All uses changed. (struct frame): New members which consolidate common members of x_output, w32_output, and mac_output structures: left_pos, top_pos, pixel_height, pixel_width, x_pixels_diff, y_pixels_diff, win_gravity, size_hint_flags, border_width, internal_border_width, line_height, fringe_cols, left_fringe_width, right_fringe_width, want_fullscreen. All uses changed. (struct frame): New member column_width contaning the canonical column width, analogue to line_height. All uses changed. (struct frame): Rename members scroll_bar_pixel_width to config_scroll_bar_width, and scroll_bar_cols to config_scroll_bar_cols. All uses changed. (struct frame): New member scroll_bar_actual_width which consolidates and renames the vertical_scroll_bar_extra member of x_output, w32_output, and mac_output structures. All uses changed. (FRAME_PIXEL_HEIGHT): Renamed from PIXEL_HEIGHT and moved from x/w32/macterm.h files. All uses changed. Also change code which referred to f->output_data...->pixel_height. (FRAME_PIXEL_WIDTH): Renamed from PIXEL_WIDTH and moved from x/w32/macterm.h files. All uses changed. Also change code which referred to f->output_data...->pixel_width. (FRAME_LINES): Renamed from FRAME_HEIGHT. All uses changed. Also change code which referred to f->height. (FRAME_COLS): Renamed from FRAME_WIDTH. All uses changed. Also change code which referred to f->width. (FRAME_NEW_HEIGHT, FRAME_NEW_WIDTH): Remove macros; change uses to update new_text_lines and new_text_cols members directly. (FRAME_CONFIG_SCROLL_BAR_WIDTH): Renamed from FRAME_SCROLL_BAR_PIXEL_WIDTH. All uses changed. (FRAME_CONFIG_SCROLL_BAR_COLS): Renamed from FRAME_SCROLL_BAR_COLS. All uses changed. (FRAME_LEFT_SCROLL_BAR_COLS, FRAME_RIGHT_SCROLL_BAR_COLS): Renamed from FRAME_LEFT_SCROLL_BAR_WIDTH and FRAME_RIGHT_SCROLL_BAR_WIDTH, resp. All uses changed. (FRAME_SCROLL_BAR_AREA_WIDTH, FRAME_LEFT_SCROLL_BAR_AREA_WIDTH) (FRAME_RIGHT_SCROLL_BAR_AREA_WIDTH): New macros. (FRAME_TOTAL_COLS): Renamed from FRAME_WINDOW_WIDTH. (SET_FRAME_COLS): Renamed from SET_FRAME_WIDTH. (FRAME_TOTAL_COLS_ARG): Renamed from FRAME_WINDOW_WIDTH_ARG. (WINDOW_VERTICAL_SCROLL_BAR_COLUMN): Remove unused macro. (WINDOW_VERTICAL_SCROLL_BAR_HEIGHT): Remove unused macro. (FRAME_LINE_HEIGHT): Renamed from CANON_Y_UNIT. Unconditionally return line_height member (it now has proper value also for non-window frames). (FRAME_COLUMN_WIDTH): Renamed from CANON_X_UNIT. Unconditionally return new column_width member (rather than the default font width). (FRAME_FRINGE_COLS, FRAME_LEFT_FRINGE_WIDTH) (FRAME_RIGHT_FRINGE_WIDTH): Renamed from FRAME_X_... and moved from x/w32/macterm.h files. Unconditionally return corresponding member of frame structure (they now have proper values also for non-window frames). (FRAME_TOTAL_FRINGE_WIDTH): Renamed from FRAME_FRINGE_WIDTH. Calculate return value from left and right widths. (FRAME_INTERNAL_BORDER_WIDTH): Unconditionally return internal_border_width member (has proper value for non-window frame). (FRAME_PIXEL_X_FROM_CANON_X): Renamed from PIXEL_X_FROM_CANON_X. (FRAME_PIXEL_Y_FROM_CANON_Y): Renamed from PIXEL_Y_FROM_CANON_Y. (FRAME_CANON_X_FROM_PIXEL_X): Renamed from CANON_X_FROM_PIXEL_X. (FRAME_CANON_Y_FROM_PIXEL_Y): Renamed from CANON_Y_FROM_PIXEL_Y. (FRAME_LINE_TO_PIXEL_Y): Renamed from CHAR_TO_PIXEL_ROW, consolidated from xterm.h, macterm.h, and w32term.h. (FRAME_COL_TO_PIXEL_X): Renamed from CHAR_TO_PIXEL_COL, consolidated from xterm.h, macterm.h, and w32term.h. (FRAME_TEXT_COLS_TO_PIXEL_WIDTH): Renamed from CHAR_TO_PIXEL_WIDTH consolidated from x/mac/w32term.h. (FRAME_TEXT_LINES_TO_PIXEL_HEIGHT): Renamed from CHAR_TO_PIXEL_HEIGHT consolidated from x/mac/w32term.h. (FRAME_PIXEL_Y_TO_LINE): Renamed from PIXEL_TO_CHAR_ROW consolidated from x/mac/w32term.h. (FRAME_PIXEL_X_TO_COL): Renamed from PIXEL_TO_CHAR_COL consolidated from x/mac/w32term.h. (FRAME_PIXEL_WIDTH_TO_TEXT_COLS): Renamed from PIXEL_TO_CHAR_WIDTH consolidated from x/mac/w32term.h. (FRAME_PIXEL_HEIGHT_TO_TEXT_LINES): Renamed from PIXEL_TO_CHAR_HEIGHT consolidated from x/mac/w32term.h.
author Kim F. Storm <storm@cua.dk>
date Sat, 24 May 2003 21:58:07 +0000
parents e0672852f9dd
children 695cf19ef79e d7ddb3e565de
line wrap: on
line source

;;; pcmpl-cvs.el --- functions for dealing with cvs completions

;; Copyright (C) 1999, 2000, 2002 Free Software Foundation

;; Author: John Wiegley <johnw@gnu.org>

;; 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, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;;; Commentary:

;; These functions provide completion rules for the `cvs' tool.

;;; Code:

(provide 'pcmpl-cvs)

(require 'pcomplete)
(require 'executable)

(defgroup pcmpl-cvs nil
  "Functions for dealing with CVS completions"
  :group 'pcomplete)

;; User Variables:

(defcustom pcmpl-cvs-binary (or (executable-find "cvs") "cvs")
  "*The full path of the 'cvs' binary."
  :type 'file
  :group 'pcmpl-cvs)

;; Functions:

;;;###autoload
(defun pcomplete/cvs ()
  "Completion rules for the `cvs' command."
  (let ((pcomplete-help "(cvs)Invoking CVS"))
    (pcomplete-opt "HQqrwlntvfab/T/e*d/z?s")
    (pcomplete-here* (pcmpl-cvs-commands))
    (cond ((pcomplete-test "add")
	   (setq pcomplete-help "(cvs)Adding files")
	   (pcomplete-opt "k?m?")
	   (while (pcomplete-here (pcmpl-cvs-entries '(??)))))
	  ((pcomplete-test "remove")
	   (setq pcomplete-help "(cvs)Removing files")
	   (pcomplete-opt "flR")
	   (while (pcomplete-here (pcmpl-cvs-entries '(?U)))))
	  ((pcomplete-test "init")
	   (setq pcomplete-help "(cvs)Creating a repository"))
	  ((pcomplete-test '("login" "logout"))
	   (setq pcomplete-help "(cvs)Password authentication client"))
	  ((pcomplete-test "import")
	   (setq pcomplete-help "(cvs)import")
	   (pcomplete-opt "dk?I(pcmpl-cvs-entries '(??))b?m?W?"))
	  ((pcomplete-test "checkout")
	   (setq pcomplete-help "(cvs)checkout")
	   (pcomplete-opt "ANPRcflnpsr?D?d/k?j?")
	   (pcomplete-here (pcmpl-cvs-modules)))
	  ((pcomplete-test "rtag")
	   (setq pcomplete-help "(cvs)Creating a branch")
	   (pcomplete-opt "aflRndbr?DF")
	   (pcomplete-here (pcmpl-cvs-modules)))
	  ((pcomplete-test "release")
	   (setq pcomplete-help "(cvs)release")
	   (pcomplete-opt "d")
	   (while (pcomplete-here (pcomplete-dirs))))
	  ((pcomplete-test "export")
	   (setq pcomplete-help "(cvs)export")
	   (pcomplete-opt "NflRnr?D?d/k?")
	   (pcomplete-here (pcmpl-cvs-modules)))
	  ((pcomplete-test "commit")
	   (setq pcomplete-help "(cvs)commit files")
	   (pcomplete-opt "nRlfF.m?r(pcmpl-cvs-tags '(?M ?R ?A))")
	   (while (pcomplete-here (pcmpl-cvs-entries '(?M ?R ?A)))))
	  ((pcomplete-test "diff")
	   (setq pcomplete-help "(cvs)Viewing differences")
	   (let ((opt-index pcomplete-index)
		 saw-backdate)
	     (pcomplete-opt "lRD?Nr(pcmpl-cvs-tags)")
	     (while (< opt-index pcomplete-index)
	       (if (pcomplete-match "^-[Dr]" (- pcomplete-index opt-index))
		   (setq saw-backdate t opt-index pcomplete-index)
		 (setq opt-index (1+ opt-index))))
	     (while (pcomplete-here
		     (pcmpl-cvs-entries (unless saw-backdate '(?M)))))))
	  ((pcomplete-test "unedit")
	   (setq pcomplete-help "(cvs)Editing files")
	   (pcomplete-opt "lR")
	   (while (pcomplete-here (pcmpl-cvs-entries '(?M ?R ?A)))))
	  ((pcomplete-test "update")
	   (setq pcomplete-help "(cvs)update")
	   (pcomplete-opt
	    (concat "APdflRpk?r(pcmpl-cvs-tags '(?U ?P))D?"
		    "j(pcmpl-cvs-tags '(?U ?P))"
		    "I(pcmpl-cvs-entries '(??))W?"))
	   (while (pcomplete-here (pcmpl-cvs-entries '(?U ?P)))))
	  (t
	   (while (pcomplete-here (pcmpl-cvs-entries)))))))

(defun pcmpl-cvs-commands ()
  "Return a list of available CVS commands."
  (with-temp-buffer
    (call-process pcmpl-cvs-binary nil t nil "--help-commands")
    (goto-char (point-min))
    (let (cmds)
      (while (re-search-forward "^\\s-+\\([a-z]+\\)" nil t)
	(setq cmds (cons (match-string 1) cmds)))
      (pcomplete-uniqify-list cmds))))

(defun pcmpl-cvs-modules ()
  "Return a list of available modules under CVS."
  (with-temp-buffer
    (call-process pcmpl-cvs-binary nil t nil "checkout" "-c")
    (goto-char (point-min))
    (let (entries)
      (while (re-search-forward "\\(\\S-+\\)$" nil t)
	(setq entries (cons (match-string 1) entries)))
      (pcomplete-uniqify-list entries))))

(defun pcmpl-cvs-tags (&optional opers)
  "Return all the tags which could apply to the files related to OPERS."
  (let ((entries (pcmpl-cvs-entries opers))
	tags)
    (with-temp-buffer
      (apply 'call-process pcmpl-cvs-binary nil t nil
	     "status" "-v" entries)
      (goto-char (point-min))
      (while (re-search-forward "Existing Tags:" nil t)
	(forward-line)
	(while (not (looking-at "^$"))
	  (unless (looking-at "^\\s-+\\(\\S-+\\)\\s-+")
	    (error "Error in output from `cvs status -v'"))
	  (setq tags (cons (match-string 1) tags))
	  (forward-line))))
    (pcomplete-uniqify-list tags)))

(defun pcmpl-cvs-entries (&optional opers)
  "Return the Entries for the current directory.
If OPERS is a list of characters, return entries for which that
operation character applies, as displayed by 'cvs -n update'."
  (let* ((arg (pcomplete-arg))
	 (dir (file-name-as-directory
	       (or (file-name-directory arg) "")))
	 (nondir (or (file-name-nondirectory arg) ""))
	 entries)
    (if opers
	(with-temp-buffer
	  (and dir (cd dir))
	  (call-process pcmpl-cvs-binary nil t nil
			"-q" "-n" "-f" "update"); "-l")
	  (goto-char (point-min))
	  (while (re-search-forward "^\\(.\\) \\(.+\\)$" nil t)
	    (if (memq (string-to-char (match-string 1)) opers)
		(setq entries (cons (match-string 2) entries)))))
      (with-temp-buffer
	(insert-file-contents (concat dir "CVS/Entries"))
	(goto-char (point-min))
	(while (not (eobp))
	  (let* ((line (buffer-substring (line-beginning-position)
					 (line-end-position)))
		 (fields (split-string line "/"))
		 text)
	    (if (eq (aref line 0) ?/)
		(setq fields (cons "" fields)))
	    (setq text (nth 1 fields))
	    (when text
	      (if (string= (nth 0 fields) "D")
		  (setq text (file-name-as-directory text)))
	      (setq entries (cons text entries))))
	  (forward-line))))
    (setq pcomplete-stub nondir)
    (pcomplete-uniqify-list entries)))

;;; pcmpl-cvs.el ends here