annotate lisp/pcvs-util.el @ 72550:666bd542be19

(get_window_cursor_type): Replace BOX cursor on images with a hollow box cursor if image is larger than 32x32 (or the default frame font if that is bigger). Replace any other cursor on images with hollow box cursor, as redisplay doesn't support bar and hbar cursors on images.
author Kim F. Storm <storm@cua.dk>
date Sun, 27 Aug 2006 22:23:07 +0000
parents 63a604af4b8e
children e3694f1cb928 858cb33ae39d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38422
7a94f1c588c4 Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37338
diff changeset
1 ;;; pcvs-util.el --- utility functions for PCL-CVS -*- byte-compile-dynamic: t -*-
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
2
56956
14b1949ce3d4 (cvs-string-prefix-p): Use compare-strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55791
diff changeset
3 ;; Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
68651
3bd95f4f2941 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64762
diff changeset
4 ;; 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
5
70292
2b77fa42947f Update my email address.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69746
diff changeset
6 ;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
7 ;; Keywords: pcl-cvs
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
8
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
10
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
14 ;; any later version.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
15
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
19 ;; GNU General Public License for more details.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
20
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 60591
diff changeset
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 60591
diff changeset
24 ;; Boston, MA 02110-1301, USA.
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
25
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
26 ;;; Commentary:
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
27
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
28
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
29 ;;; Code:
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
30
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
31 (eval-when-compile (require 'cl))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
32
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
33 ;;;;
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
34 ;;;; list processing
33229
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
35 ;;;;
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
36
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
37 (defsubst cvs-car (x) (if (consp x) (car x) x))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
38 (defalias 'cvs-cdr 'cdr-safe)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
39 (defsubst cvs-append (&rest xs)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
40 (apply 'append (mapcar (lambda (x) (if (listp x) x (list x))) xs)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
41
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
42 (defsubst cvs-every (-cvs-every-f -cvs-every-l)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
43 (while (consp -cvs-every-l)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
44 (unless (funcall -cvs-every-f (pop -cvs-every-l))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
45 (setq -cvs-every-l t)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
46 (not -cvs-every-l))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
47
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
48 (defun cvs-union (xs ys)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
49 (let ((zs ys))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
50 (dolist (x xs zs)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
51 (unless (member x ys) (push x zs)))))
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 42205
diff changeset
52
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
53 (defun cvs-map (-cvs-map-f &rest -cvs-map-ls)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
54 (unless (cvs-every 'null -cvs-map-ls)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
55 (cons (apply -cvs-map-f (mapcar 'car -cvs-map-ls))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
56 (apply 'cvs-map -cvs-map-f (mapcar 'cdr -cvs-map-ls)))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
57
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
58 (defun cvs-first (l &optional n)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
59 (if (null n) (car l)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
60 (when l
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
61 (let* ((nl (list (pop l)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
62 (ret nl))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
63 (while (and l (> n 1))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
64 (setcdr nl (list (pop l)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
65 (setq nl (cdr nl))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
66 (decf n))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
67 ret))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
68
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
69 (defun cvs-partition (p l)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
70 "Partition a list L into two lists based on predicate P.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
71 The function returns a `cons' cell where the `car' contains
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
72 elements of L for which P is true while the `cdr' contains
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
73 the other elements. The ordering among elements is maintained."
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
74 (let (car cdr)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
75 (dolist (x l)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
76 (if (funcall p x) (push x car) (push x cdr)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
77 (cons (nreverse car) (nreverse cdr))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
78
34407
bcedf6eef407 Minor doc/comment changes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34304
diff changeset
79 ;;;
bcedf6eef407 Minor doc/comment changes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34304
diff changeset
80 ;;; frame, window, buffer handling
bcedf6eef407 Minor doc/comment changes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34304
diff changeset
81 ;;;
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
82
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
83 (defun cvs-pop-to-buffer-same-frame (buf)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
84 "Pop to BUF like `pop-to-buffer' but staying on the same frame.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
85 If `pop-to-buffer' would have opened a new frame, this function would
34407
bcedf6eef407 Minor doc/comment changes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 34304
diff changeset
86 try to split a new window instead."
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
87 (let ((pop-up-windows (or pop-up-windows pop-up-frames))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
88 (pop-up-frames nil))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
89 (or (let ((buf (get-buffer-window buf))) (and buf (select-window buf)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
90 (and pop-up-windows
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
91 (ignore-errors (select-window (split-window-vertically)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
92 (switch-to-buffer buf))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
93 (pop-to-buffer (current-buffer)))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
94
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
95 (defun cvs-bury-buffer (buf &optional mainbuf)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
96 "Hide the buffer BUF that was temporarily popped up.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
97 BUF is assumed to be a temporary buffer used from the buffer MAINBUF."
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
98 (interactive (list (current-buffer)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
99 (save-current-buffer
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
100 (let ((win (if (eq buf (window-buffer (selected-window))) (selected-window)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
101 (get-buffer-window buf t))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
102 (when win
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
103 (if (window-dedicated-p win)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
104 (condition-case ()
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
105 (delete-window win)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
106 (error (iconify-frame (window-frame win))))
57528
c39903008a0d (cvs-bury-buffer): Don't call get-buffer-window for effect.
Richard M. Stallman <rms@gnu.org>
parents: 56956
diff changeset
107 ;;; (if (and mainbuf (get-buffer-window mainbuf))
c39903008a0d (cvs-bury-buffer): Don't call get-buffer-window for effect.
Richard M. Stallman <rms@gnu.org>
parents: 56956
diff changeset
108 ;;; ;; FIXME: if the buffer popped into a pre-existing window,
c39903008a0d (cvs-bury-buffer): Don't call get-buffer-window for effect.
Richard M. Stallman <rms@gnu.org>
parents: 56956
diff changeset
109 ;;; ;; we don't want to delete that window.
c39903008a0d (cvs-bury-buffer): Don't call get-buffer-window for effect.
Richard M. Stallman <rms@gnu.org>
parents: 56956
diff changeset
110 ;;; t ;;(delete-window win)
c39903008a0d (cvs-bury-buffer): Don't call get-buffer-window for effect.
Richard M. Stallman <rms@gnu.org>
parents: 56956
diff changeset
111 ;;; )
c39903008a0d (cvs-bury-buffer): Don't call get-buffer-window for effect.
Richard M. Stallman <rms@gnu.org>
parents: 56956
diff changeset
112 )))
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
113 (with-current-buffer buf
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
114 (bury-buffer (unless (and (eq buf (window-buffer (selected-window)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
115 (not (window-dedicated-p (selected-window))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
116 buf)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
117 (when mainbuf
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
118 (let ((mainwin (or (get-buffer-window mainbuf)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
119 (get-buffer-window mainbuf 'visible))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
120 (when mainwin (select-window mainwin))))))
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 42205
diff changeset
121
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
122 (defun cvs-get-buffer-create (name &optional noreuse)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
123 "Create a buffer NAME unless such a buffer already exists.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
124 If the NAME looks like an absolute file name, the buffer will be created
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
125 with `create-file-buffer' and will probably get another name than NAME.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
126 In such a case, the search for another buffer with the same name doesn't
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
127 use the buffer name but the buffer's `list-buffers-directory' variable.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
128 If NOREUSE is non-nil, always return a new buffer."
72244
63a604af4b8e (cvs-get-buffer-create): Obey `noreuse' even if `name'
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 70292
diff changeset
129 (or (and (not (file-name-absolute-p name))
63a604af4b8e (cvs-get-buffer-create): Obey `noreuse' even if `name'
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 70292
diff changeset
130 (if noreuse (generate-new-buffer name)
63a604af4b8e (cvs-get-buffer-create): Obey `noreuse' even if `name'
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 70292
diff changeset
131 (get-buffer-create name)))
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
132 (unless noreuse
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
133 (dolist (buf (buffer-list))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
134 (with-current-buffer buf
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
135 (when (equal name list-buffers-directory)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
136 (return buf)))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
137 (with-current-buffer (create-file-buffer name)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
138 (set (make-local-variable 'list-buffers-directory) name)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
139 (current-buffer))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
140
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
141 ;;;;
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
142 ;;;; string processing
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
143 ;;;;
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
144
33229
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
145 (defun cvs-insert-strings (strings)
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
146 "Insert a list of STRINGS into the current buffer.
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
147 Uses columns to keep the listing readable but compact."
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
148 (when (consp strings)
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
149 (let* ((length (apply 'max (mapcar 'length strings)))
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
150 (wwidth (1- (window-width)))
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
151 (columns (min
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
152 ;; At least 2 columns; at least 2 spaces between columns.
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
153 (max 2 (/ wwidth (+ 2 length)))
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
154 ;; Don't allocate more columns than we can fill.
37338
221cb2f0438b Add comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 36906
diff changeset
155 ;; Windows can't show less than 3 lines anyway.
33229
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
156 (max 1 (/ (length strings) 2))))
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
157 (colwidth (/ wwidth columns)))
37338
221cb2f0438b Add comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 36906
diff changeset
158 ;; Use tab-width rather than indent-to.
33229
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
159 (setq tab-width colwidth)
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
160 ;; The insertion should be "sensible" no matter what choices were made.
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
161 (dolist (str strings)
69746
768d198de598 (cvs-insert-strings): Fix bug with strings longer than wwidth.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
162 (unless (bolp)
768d198de598 (cvs-insert-strings): Fix bug with strings longer than wwidth.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
163 (insert " \t")
768d198de598 (cvs-insert-strings): Fix bug with strings longer than wwidth.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
164 (when (< wwidth (+ (max colwidth (length str)) (current-column)))
768d198de598 (cvs-insert-strings): Fix bug with strings longer than wwidth.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
165 (delete-char -2) (insert "\n")))
768d198de598 (cvs-insert-strings): Fix bug with strings longer than wwidth.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
166 (insert str)))))
33229
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
167
c76308387eec (cvs-butlast, cvs-nbutlast): New (copied from CL).
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 30618
diff changeset
168
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
169 (defun cvs-file-to-string (file &optional oneline args)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
170 "Read the content of FILE and return it as a string.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
171 If ONELINE is t, only the first line (no \\n) will be returned.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
172 If ARGS is non-nil, the file will be executed with ARGS as its
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
173 arguments. If ARGS is not a list, no argument will be passed."
41780
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
174 (condition-case nil
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
175 (with-temp-buffer
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
176 (if args
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
177 (apply 'call-process
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
178 file nil t nil (when (listp args) args))
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
179 (insert-file-contents file))
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
180 (goto-char (point-min))
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
181 (buffer-substring (point)
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
182 (if oneline (line-end-position) (point-max))))
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
183 (file-error nil)))
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
184
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
185 (defun cvs-string-prefix-p (str1 str2)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
186 "Tell whether STR1 is a prefix of STR2."
56956
14b1949ce3d4 (cvs-string-prefix-p): Use compare-strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55791
diff changeset
187 (eq t (compare-strings str2 nil (length str1) str1 nil nil)))
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
188
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
189 ;; (string->strings (strings->string X)) == X
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
190 (defun cvs-strings->string (strings &optional separator)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
191 "Concatenate the STRINGS, adding the SEPARATOR (default \" \").
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
192 This tries to quote the strings to avoid ambiguity such that
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
193 (cvs-string->strings (cvs-strings->string strs)) == strs
64545
f227dc7508ad (cvs-flags-query, cvs-strings->string, cvs-prefix-get): Fix typos in docstrings.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
194 Only some SEPARATORs will work properly."
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
195 (let ((sep (or separator " ")))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
196 (mapconcat
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
197 (lambda (str)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
198 (if (string-match "[\\\"]" str)
28177
ff69c2cd80c1 (cvs-strings->string): Rename
Dave Love <fx@gnu.org>
parents: 28088
diff changeset
199 (concat "\"" (replace-regexp-in-string "[\\\"]" "\\\\\\&" str) "\"")
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
200 str))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
201 strings sep)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
202
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
203 ;; (string->strings (strings->string X)) == X
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
204 (defun cvs-string->strings (string &optional separator)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
205 "Split the STRING into a list of strings.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
206 It understands elisp style quoting within STRING such that
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
207 (cvs-string->strings (cvs-strings->string strs)) == strs
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
208 The SEPARATOR regexp defaults to \"\\s-+\"."
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
209 (let ((sep (or separator "\\s-+"))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
210 (i (string-match "[\"]" string)))
60591
e1ebbef182c4 (cvs-string->strings): Strip trailing whitespace.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57528
diff changeset
211 (if (null i) (split-string string sep t) ; no quoting: easy
e1ebbef182c4 (cvs-string->strings): Strip trailing whitespace.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57528
diff changeset
212 (append (unless (eq i 0) (split-string (substring string 0 i) sep t))
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
213 (let ((rfs (read-from-string string i)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
214 (cons (car rfs)
41780
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
215 (cvs-string->strings (substring string (cdr rfs))
fd46c3fb8ae5 (cvs-file-to-string): Move condition-case outside.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 41174
diff changeset
216 sep)))))))
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
217
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 42205
diff changeset
218 ;;;;
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
219 ;;;; file names
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 42205
diff changeset
220 ;;;;
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
221
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
222 (defsubst cvs-expand-dir-name (d)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
223 (file-name-as-directory (expand-file-name d)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
224
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
225 ;;;;
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
226 ;;;; (interactive <foo>) support function
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
227 ;;;;
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
228
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
229 (defstruct (cvs-qtypedesc
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
230 (:constructor nil) (:copier nil)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
231 (:constructor cvs-qtypedesc-create
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
232 (str2obj obj2str &optional complete hist-sym require)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
233 str2obj
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
234 obj2str
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
235 hist-sym
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
236 complete
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
237 require)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
238
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
239
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
240 (defconst cvs-qtypedesc-string1 (cvs-qtypedesc-create 'identity 'identity t))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
241 (defconst cvs-qtypedesc-string (cvs-qtypedesc-create 'identity 'identity))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
242 (defconst cvs-qtypedesc-strings
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
243 (cvs-qtypedesc-create 'cvs-string->strings 'cvs-strings->string nil))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
244
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
245 (defun cvs-query-read (default prompt qtypedesc &optional hist-sym)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
246 (let* ((qtypedesc (or qtypedesc cvs-qtypedesc-strings))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
247 (hist-sym (or hist-sym (cvs-qtypedesc-hist-sym qtypedesc)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
248 (complete (cvs-qtypedesc-complete qtypedesc))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
249 (completions (and (functionp complete) (funcall complete)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
250 (initval (funcall (cvs-qtypedesc-obj2str qtypedesc) default)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
251 (funcall (cvs-qtypedesc-str2obj qtypedesc)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
252 (cond
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
253 ((null complete) (read-string prompt initval hist-sym))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
254 ((functionp complete)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
255 (completing-read prompt completions
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
256 nil (cvs-qtypedesc-require qtypedesc)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
257 initval hist-sym))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
258 (t initval)))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
259
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 42205
diff changeset
260 ;;;;
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
261 ;;;; Flags handling
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 42205
diff changeset
262 ;;;;
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
263
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
264 (defstruct (cvs-flags
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
265 (:constructor nil)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
266 (:constructor -cvs-flags-make
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
267 (desc defaults &optional qtypedesc hist-sym)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
268 defaults persist desc qtypedesc hist-sym)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
269
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
270 (defmacro cvs-flags-define (sym defaults
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
271 &optional desc qtypedesc hist-sym docstring)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
272 `(defconst ,sym
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
273 (let ((bound (boundp ',sym)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
274 (if (and bound (cvs-flags-p ,sym)) ,sym
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
275 (let ((defaults ,defaults))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
276 (-cvs-flags-make ,desc
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
277 (if bound (cons ,sym (cdr defaults)) defaults)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
278 ,qtypedesc ,hist-sym))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
279 ,docstring))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
280
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
281 (defun cvs-flags-query (sym &optional desc arg)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
282 "Query flags based on SYM.
64545
f227dc7508ad (cvs-flags-query, cvs-strings->string, cvs-prefix-get): Fix typos in docstrings.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
283 Optional argument DESC will be used for the prompt.
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
284 If ARG (or a prefix argument) is nil, just use the 0th default.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
285 If it is a non-negative integer, use the corresponding default.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
286 If it is a negative integer query for a new value of the corresponding
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
287 default and return that new value.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
288 If it is \\[universal-argument], just query and return a value without
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
289 altering the defaults.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
290 If it is \\[universal-argument] \\[universal-argument], behave just
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
291 as if a negative zero was provided."
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
292 (let* ((flags (symbol-value sym))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
293 (desc (or desc (cvs-flags-desc flags)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
294 (qtypedesc (cvs-flags-qtypedesc flags))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
295 (hist-sym (cvs-flags-hist-sym flags))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
296 (arg (if (eq arg 'noquery) 0 (or arg current-prefix-arg 0)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
297 (numarg (prefix-numeric-value arg))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
298 (defaults (cvs-flags-defaults flags))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
299 (permstr (if (< numarg 0) (format " (%sth default)" (- numarg)))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
300 ;; special case for universal-argument
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
301 (when (consp arg)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
302 (setq permstr (if (> numarg 4) " (permanent)" ""))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
303 (setq numarg 0))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
304
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
305 ;; sanity check
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
306 (unless (< (abs numarg) (length defaults))
38422
7a94f1c588c4 Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37338
diff changeset
307 (error "There is no %sth default" (abs numarg)))
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
308
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
309 (if permstr
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
310 (let* ((prompt (format "%s%s: " desc permstr))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
311 (fs (cvs-query-read (nth (- numarg) (cvs-flags-defaults flags))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
312 prompt qtypedesc hist-sym)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
313 (when (not (equal permstr ""))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
314 (setf (nth (- numarg) (cvs-flags-defaults flags)) fs))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
315 fs)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
316 (nth numarg defaults))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
317
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
318 (defsubst cvs-flags-set (sym index value)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
319 "Set SYM's INDEX'th setting to VALUE."
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
320 (setf (nth index (cvs-flags-defaults (symbol-value sym))) value))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
321
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 42205
diff changeset
322 ;;;;
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
323 ;;;; Prefix keys
49597
e88404e8f2cf Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 42205
diff changeset
324 ;;;;
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
325
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
326 (defconst cvs-prefix-number 10)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
327
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
328 (defsubst cvs-prefix-sym (sym) (intern (concat (symbol-name sym) "-cps")))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
329
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
330 (defmacro cvs-prefix-define (sym docstring desc defaults
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
331 &optional qtypedesc hist-sym)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
332 (let ((cps (cvs-prefix-sym sym)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
333 `(progn
39542
48d3de634dc8 (cvs-prefix-define): Typo cons->concat.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38422
diff changeset
334 (defvar ,sym nil ,(concat (or docstring "") "
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
335 See `cvs-prefix-set' for further description of the behavior."))
41174
6f2dcaad706b (cvs-prefix-define): Don't defconst a variable.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39542
diff changeset
336 (defvar ,cps
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
337 (let ((defaults ,defaults))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
338 ;; sanity ensurance
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
339 (unless (>= (length defaults) cvs-prefix-number)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
340 (setq defaults (append defaults
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
341 (make-list (1- cvs-prefix-number)
30618
9dd1a6504bdd Use `nth' instead of `first', `second', and `third'.
Gerd Moellmann <gerd@gnu.org>
parents: 28256
diff changeset
342 (nth 0 defaults)))))
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
343 (-cvs-flags-make ,desc defaults ,qtypedesc ,hist-sym))))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
344
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
345 (defun cvs-prefix-make-local (sym)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
346 (let ((cps (cvs-prefix-sym sym)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
347 (make-local-variable sym)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
348 (set (make-local-variable cps) (copy-cvs-flags (symbol-value cps)))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
349
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
350 (defun cvs-prefix-set (sym arg)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
351 ;; we could distinguish between numeric and non-numeric prefix args instead of
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
352 ;; relying on that magic `4'.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
353 "Set the cvs-prefix contained in SYM.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
354 If ARG is between 0 and 9, it selects the corresponding default.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
355 If ARG is negative (or \\[universal-argument] which corresponds to negative 0),
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
356 it queries the user and sets the -ARG'th default.
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
357 If ARG is greater than 9 (or \\[universal-argument] \\[universal-argument]),
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
358 the (ARG mod 10)'th prefix is made persistent.
42205
7308bbc423d5 Doc fixes.
Pavel Janík <Pavel@Janik.cz>
parents: 41780
diff changeset
359 If ARG is nil toggle the PREFIX's value between its 0th default and nil
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
360 and reset the persistence."
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
361 (let* ((prefix (symbol-value (cvs-prefix-sym sym)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
362 (numarg (if (integerp arg) arg 0))
69746
768d198de598 (cvs-insert-strings): Fix bug with strings longer than wwidth.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
363 ;; (defs (cvs-flags-defaults prefix))
768d198de598 (cvs-insert-strings): Fix bug with strings longer than wwidth.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
364 )
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
365
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
366 ;; set persistence if requested
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
367 (when (> (prefix-numeric-value arg) 9)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
368 (setf (cvs-flags-persist prefix) t)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
369 (setq numarg (mod numarg 10)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
370
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
371 ;; set the value
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
372 (set sym
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
373 (cond
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
374 ((null arg)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
375 (setf (cvs-flags-persist prefix) nil)
30618
9dd1a6504bdd Use `nth' instead of `first', `second', and `third'.
Gerd Moellmann <gerd@gnu.org>
parents: 28256
diff changeset
376 (unless (symbol-value sym) (nth 0 (cvs-flags-defaults prefix))))
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
377
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
378 ((or (consp arg) (< numarg 0))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
379 (setf (nth (- numarg) (cvs-flags-defaults prefix))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
380 (cvs-query-read (nth (- numarg) (cvs-flags-defaults prefix))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
381 (format "%s: " (cvs-flags-desc prefix))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
382 (cvs-flags-qtypedesc prefix)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
383 (cvs-flags-hist-sym prefix))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
384 (t (nth numarg (cvs-flags-defaults prefix)))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
385 (force-mode-line-update)))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
386
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
387 (defun cvs-prefix-get (sym &optional read-only)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
388 "Return the current value of the prefix SYM.
64545
f227dc7508ad (cvs-flags-query, cvs-strings->string, cvs-prefix-get): Fix typos in docstrings.
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
389 And reset it unless READ-ONLY is non-nil."
28088
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
390 (prog1 (symbol-value sym)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
391 (unless (or read-only
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
392 (cvs-flags-persist (symbol-value (cvs-prefix-sym sym))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
393 (set sym nil)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
394 (force-mode-line-update))))
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
395
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
396 (provide 'pcvs-util)
b442dfc3cef0 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
397
56956
14b1949ce3d4 (cvs-string-prefix-p): Use compare-strings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55791
diff changeset
398 ;; arch-tag: 3b2588bb-2ae3-4f1f-bf5b-dea91b1f8a59
38422
7a94f1c588c4 Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37338
diff changeset
399 ;;; pcvs-util.el ends here