annotate lisp/vc-dir.el @ 107777:13c077500eb3

2010-04-04 John Wiegley <jwiegley@gmail.com> * ido.el (ido-use-virtual-buffers): New variable to indicate whether "virtual buffer" support is enabled for IDO. Essentially it works as follows: Say you are visiting a file and the buffer gets cleaned up by mignight.el. Later, you want to switch to that buffer, but find it's no longer open. With virtual buffers enabled, the buffer name stays in the buffer list (using the ido-virtual face, and always at the end), and if you select it, it opens the file back up again. This allows you to think less about whether recently opened files are still open or not. Most of the time you can quit Emacs, restart, and then switch to a file buffer that was previously open as if it still were. NOTE: This feature has been present in iswitchb for several years now, and I'm porting the same logic to IDO. (ido-virtual): Face used to indicate virtual buffers in the list. (ido-buffer-internal): If a buffer is chosen, and no such buffer exists, but a virtual buffer of that name does (which would be why it was in the list), recreate the buffer by reopening the file. (ido-make-buffer-list): If virtual buffers are being used, call `ido-add-virtual-buffers-to-list' before the make list hook. (ido-virtual-buffers): New variable which contains a copy of the current contents of the `recentf-list', albeit pared down for the sake of speed, and with proper faces applied. (ido-add-virtual-buffers-to-list): Using the `recentf-list', create a list of "virtual buffers" to present to the user in addition to the currently open set. Note that this logic could get rather slow if that list is too large. With the default `recentf-max-saved-items' of 200, there is little speed penalty.
author jwiegley@gmail.com
date Sun, 04 Apr 2010 02:55:19 -0400
parents 7c9abe9e21d1
children 2cdeb4c70d45
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1 ;;; vc-dir.el --- Directory status display under VC
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
2
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 106759
diff changeset
3 ;; Copyright (C) 2007, 2008, 2009, 2010
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
4 ;; Free Software Foundation, Inc.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
5
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
6 ;; Author: Dan Nicolaescu <dann@ics.uci.edu>
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
7 ;; Keywords: tools
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
8
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
10
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
11 ;; GNU Emacs is free software: you can redistribute it and/or modify
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
13 ;; the Free Software Foundation, either version 3 of the License, or
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
14 ;; (at your option) any later version.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
15
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
19 ;; GNU General Public License for more details.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
20
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
23
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
24 ;;; Credits:
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
25
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
26 ;; The original VC directory status implementation was based on dired.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
27 ;; This implementation was inspired by PCL-CVS.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
28 ;; Many people contributed comments, ideas and code to this
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
29 ;; implementation. These include:
96388
7ed97437d100 * vc-dir.el (vc-dir): Complete only directory names.
Juanma Barranquero <lekktu@gmail.com>
parents: 96310
diff changeset
30 ;;
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
31 ;; Alexandre Julliard <julliard@winehq.org>
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
32 ;; Stefan Monnier <monnier@iro.umontreal.ca>
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
33 ;; Tom Tromey <tromey@redhat.com>
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
34
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
35 ;;; Commentary:
96388
7ed97437d100 * vc-dir.el (vc-dir): Complete only directory names.
Juanma Barranquero <lekktu@gmail.com>
parents: 96310
diff changeset
36 ;;
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
37
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
38 ;;; Todo: see vc.el.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
39
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
40 (require 'vc-hooks)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
41 (require 'vc)
96310
ba295cada06b * vc-dir.el (tool-bar): Require.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96256
diff changeset
42 (require 'tool-bar)
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
43 (require 'ewoc)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
44
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
45 ;;; Code:
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
46 (eval-when-compile
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
47 (require 'cl))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
48
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
49 (defcustom vc-dir-mode-hook nil
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
50 "Normal hook run by `vc-dir-mode'.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
51 See `run-hooks'."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
52 :type 'hook
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
53 :group 'vc)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
54
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
55 ;; Used to store information for the files displayed in the directory buffer.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
56 ;; Each item displayed corresponds to one of these defstructs.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
57 (defstruct (vc-dir-fileinfo
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
58 (:copier nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
59 (:type list) ;So we can use `member' on lists of FIs.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
60 (:constructor
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
61 ;; We could define it as an alias for `list'.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
62 vc-dir-create-fileinfo (name state &optional extra marked directory))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
63 (:conc-name vc-dir-fileinfo->))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
64 name ;Keep it as first, for `member'.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
65 state
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
66 ;; For storing backend specific information.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
67 extra
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
68 marked
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
69 ;; To keep track of not updated files during a global refresh
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
70 needs-update
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
71 ;; To distinguish files and directories.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
72 directory)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
73
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
74 (defvar vc-ewoc nil)
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
75
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
76 (defvar vc-dir-process-buffer nil
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
77 "The buffer used for the asynchronous call that computes status.")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
78
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
79 (defvar vc-dir-backend nil
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
80 "The backend used by the current *vc-dir* buffer.")
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
81
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
82 (defun vc-dir-move-to-goal-column ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
83 ;; Used to keep the cursor on the file name column.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
84 (beginning-of-line)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
85 (unless (eolp)
99159
b0dce7f34dda * vc.el: Rename VC methods that were missed when vc-status was
Dan Nicolaescu <dann@ics.uci.edu>
parents: 99133
diff changeset
86 ;; Must be in sync with vc-default-dir-printer.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
87 (forward-char 25)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
88
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
89 (defun vc-dir-prepare-status-buffer (bname dir backend &optional create-new)
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
90 "Find a buffer named BNAME showing DIR, or create a new one."
97660
cf2cf606d5d7 (vc-dir-prepare-status-buffer): Make sure we use a
Dan Nicolaescu <dann@ics.uci.edu>
parents: 97315
diff changeset
91 (setq dir (file-name-as-directory (expand-file-name dir)))
105293
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
92 (let* ;; Look for another buffer name BNAME visiting the same directory.
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
93 ((buf (save-excursion
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
94 (unless create-new
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
95 (dolist (buffer vc-dir-buffers)
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
96 (when (buffer-live-p buffer)
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
97 (set-buffer buffer)
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
98 (when (and (derived-mode-p 'vc-dir-mode)
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
99 (eq vc-dir-backend backend)
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
100 (string= default-directory dir))
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
101 (return buffer))))))))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
102 (or buf
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
103 ;; Create a new buffer named BNAME.
106759
e778a4a0f821 Fix bug#3224.
Juanma Barranquero <lekktu@gmail.com>
parents: 106412
diff changeset
104 ;; We pass a filename to create-file-buffer because it is what
e778a4a0f821 Fix bug#3224.
Juanma Barranquero <lekktu@gmail.com>
parents: 106412
diff changeset
105 ;; the function expects, and also what uniquify needs (if active)
e778a4a0f821 Fix bug#3224.
Juanma Barranquero <lekktu@gmail.com>
parents: 106412
diff changeset
106 (with-current-buffer (create-file-buffer (expand-file-name bname dir))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
107 (cd dir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
108 (vc-setup-buffer (current-buffer))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
109 ;; Reset the vc-parent-buffer-name so that it does not appear
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
110 ;; in the mode-line.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
111 (setq vc-parent-buffer-name nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
112 (current-buffer)))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
113
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
114 (defvar vc-dir-menu-map
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
115 (let ((map (make-sparse-keymap "VC-dir")))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
116 (define-key map [quit]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
117 '(menu-item "Quit" quit-window
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
118 :help "Quit"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
119 (define-key map [kill]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
120 '(menu-item "Kill Update Command" vc-dir-kill-dir-status-process
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
121 :enable (vc-dir-busy)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
122 :help "Kill the command that updates the directory buffer"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
123 (define-key map [refresh]
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
124 '(menu-item "Refresh" revert-buffer
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
125 :enable (not (vc-dir-busy))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
126 :help "Refresh the contents of the directory buffer"))
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
127 (define-key map [remup]
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
128 '(menu-item "Hide up-to-date" vc-dir-hide-up-to-date
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
129 :help "Hide up-to-date items from display"))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
130 ;; Movement.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
131 (define-key map [sepmv] '("--"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
132 (define-key map [next-line]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
133 '(menu-item "Next line" vc-dir-next-line
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
134 :help "Go to the next line" :keys "n"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
135 (define-key map [previous-line]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
136 '(menu-item "Previous line" vc-dir-previous-line
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
137 :help "Go to the previous line"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
138 ;; Marking.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
139 (define-key map [sepmrk] '("--"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
140 (define-key map [unmark-all]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
141 '(menu-item "Unmark All" vc-dir-unmark-all-files
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
142 :help "Unmark all files that are in the same state as the current file\
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
143 \nWith prefix argument unmark all files"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
144 (define-key map [unmark-previous]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
145 '(menu-item "Unmark previous " vc-dir-unmark-file-up
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
146 :help "Move to the previous line and unmark the file"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
147
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
148 (define-key map [mark-all]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
149 '(menu-item "Mark All" vc-dir-mark-all-files
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
150 :help "Mark all files that are in the same state as the current file\
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
151 \nWith prefix argument mark all files"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
152 (define-key map [unmark]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
153 '(menu-item "Unmark" vc-dir-unmark
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
154 :help "Unmark the current file or all files in the region"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
155
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
156 (define-key map [mark]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
157 '(menu-item "Mark" vc-dir-mark
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
158 :help "Mark the current file or all files in the region"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
159
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
160 (define-key map [sepopn] '("--"))
96500
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
161 (define-key map [qr]
96964
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
162 '(menu-item "Query Replace in Files..." vc-dir-query-replace-regexp
96500
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
163 :help "Replace a string in the marked files"))
96963
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
164 (define-key map [se]
96964
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
165 '(menu-item "Search Files..." vc-dir-search
96963
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
166 :help "Search a regexp in the marked files"))
96964
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
167 (define-key map [ires]
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
168 '(menu-item "Isearch Regexp Files..." vc-dir-isearch-regexp
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
169 :help "Incremental search a regexp in the marked files"))
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
170 (define-key map [ise]
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
171 '(menu-item "Isearch Files..." vc-dir-isearch
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
172 :help "Incremental search a string in the marked files"))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
173 (define-key map [open-other]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
174 '(menu-item "Open in other window" vc-dir-find-file-other-window
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
175 :help "Find the file on the current line, in another window"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
176 (define-key map [open]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
177 '(menu-item "Open file" vc-dir-find-file
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
178 :help "Find the file on the current line"))
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
179 (define-key map [sepvcdet] '("--"))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
180 ;; FIXME: This needs a key binding. And maybe a better name
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
181 ;; ("Insert" like PCL-CVS uses does not sound that great either)...
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
182 (define-key map [ins]
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
183 '(menu-item "Show File" vc-dir-show-fileentry
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
184 :help "Show a file in the VC status listing even though it might be up to date"))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
185 (define-key map [annotate]
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
186 '(menu-item "Annotate" vc-annotate
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
187 :help "Display the edit history of the current file using colors"))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
188 (define-key map [diff]
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
189 '(menu-item "Compare with Base Version" vc-diff
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
190 :help "Compare file set with the base version"))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
191 (define-key map [log]
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
192 '(menu-item "Show history" vc-print-log
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
193 :help "List the change log of the current file set in a window"))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
194 ;; VC commands.
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
195 (define-key map [sepvccmd] '("--"))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
196 (define-key map [update]
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
197 '(menu-item "Update to latest version" vc-update
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
198 :help "Update the current fileset's files to their tip revisions"))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
199 (define-key map [revert]
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
200 '(menu-item "Revert to base version" vc-revert
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
201 :help "Revert working copies of the selected fileset to their repository contents."))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
202 (define-key map [next-action]
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
203 ;; FIXME: This really really really needs a better name!
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
204 ;; And a key binding too.
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
205 '(menu-item "Check In/Out" vc-next-action
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
206 :help "Do the next logical version control operation on the current fileset"))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
207 (define-key map [register]
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
208 '(menu-item "Register" vc-register
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
209 :help "Register file set into the version control system"))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
210 map)
101642
a2281d8c22e0 * vc-dir.el (vc-dir-menu-map, vc-dir-at-event, vc-dir-resynch-file):
Juanma Barranquero <lekktu@gmail.com>
parents: 100908
diff changeset
211 "Menu for VC dir.")
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
212
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
213 ;; VC backends can use this to add mode-specific menu items to
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
214 ;; vc-dir-menu-map.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
215 (defun vc-dir-menu-map-filter (orig-binding)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
216 (when (and (symbolp orig-binding) (fboundp orig-binding))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
217 (setq orig-binding (indirect-function orig-binding)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
218 (let ((ext-binding
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
219 (when (derived-mode-p 'vc-dir-mode)
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
220 (vc-call-backend vc-dir-backend 'extra-status-menu))))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
221 (if (null ext-binding)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
222 orig-binding
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
223 (append orig-binding
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
224 '("----")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
225 ext-binding))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
226
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
227 (defvar vc-dir-mode-map
96500
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
228 (let ((map (make-sparse-keymap)))
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
229 ;; VC commands
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
230 (define-key map "v" 'vc-next-action) ;; C-x v v
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
231 (define-key map "=" 'vc-diff) ;; C-x v =
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
232 (define-key map "i" 'vc-register) ;; C-x v i
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
233 (define-key map "+" 'vc-update) ;; C-x v +
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
234 (define-key map "l" 'vc-print-log) ;; C-x v l
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
235 ;; More confusing than helpful, probably
97210
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
236 ;;(define-key map "R" 'vc-revert) ;; u is taken by vc-dir-unmark.
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
237 ;;(define-key map "A" 'vc-annotate) ;; g is taken by revert-buffer
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
238 ;; bound by `special-mode'.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
239 ;; Marking.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
240 (define-key map "m" 'vc-dir-mark)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
241 (define-key map "M" 'vc-dir-mark-all-files)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
242 (define-key map "u" 'vc-dir-unmark)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
243 (define-key map "U" 'vc-dir-unmark-all-files)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
244 (define-key map "\C-?" 'vc-dir-unmark-file-up)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
245 (define-key map "\M-\C-?" 'vc-dir-unmark-all-files)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
246 ;; Movement.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
247 (define-key map "n" 'vc-dir-next-line)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
248 (define-key map " " 'vc-dir-next-line)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
249 (define-key map "\t" 'vc-dir-next-directory)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
250 (define-key map "p" 'vc-dir-previous-line)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
251 (define-key map [backtab] 'vc-dir-previous-directory)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
252 ;;; Rebind paragraph-movement commands.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
253 (define-key map "\M-}" 'vc-dir-next-directory)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
254 (define-key map "\M-{" 'vc-dir-previous-directory)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
255 (define-key map [C-down] 'vc-dir-next-directory)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
256 (define-key map [C-up] 'vc-dir-previous-directory)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
257 ;; The remainder.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
258 (define-key map "f" 'vc-dir-find-file)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
259 (define-key map "\C-m" 'vc-dir-find-file)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
260 (define-key map "o" 'vc-dir-find-file-other-window)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
261 (define-key map "\C-c\C-c" 'vc-dir-kill-dir-status-process)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
262 (define-key map [down-mouse-3] 'vc-dir-menu)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
263 (define-key map [mouse-2] 'vc-dir-toggle-mark)
99133
be46fd14df8a (vc-dir-mode-map): Add follow-link behavior.
Chong Yidong <cyd@stupidchicken.com>
parents: 98471
diff changeset
264 (define-key map [follow-link] 'mouse-face)
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
265 (define-key map "x" 'vc-dir-hide-up-to-date)
96963
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
266 (define-key map "S" 'vc-dir-search) ;; FIXME: Maybe use A like dired?
96500
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
267 (define-key map "Q" 'vc-dir-query-replace-regexp)
96964
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
268 (define-key map (kbd "M-s a C-s") 'vc-dir-isearch)
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
269 (define-key map (kbd "M-s a M-C-s") 'vc-dir-isearch-regexp)
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
270
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
271 ;; Hook up the menu.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
272 (define-key map [menu-bar vc-dir-mode]
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
273 `(menu-item
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
274 ;; VC backends can use this to add mode-specific menu items to
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
275 ;; vc-dir-menu-map.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
276 "VC-dir" ,vc-dir-menu-map :filter vc-dir-menu-map-filter))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
277 map)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
278 "Keymap for directory buffer.")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
279
100483
15455ea10b4a (vc-dir-at-event): Rename from vc-at-event. Change
Dan Nicolaescu <dann@ics.uci.edu>
parents: 100475
diff changeset
280 (defmacro vc-dir-at-event (event &rest body)
101642
a2281d8c22e0 * vc-dir.el (vc-dir-menu-map, vc-dir-at-event, vc-dir-resynch-file):
Juanma Barranquero <lekktu@gmail.com>
parents: 100908
diff changeset
281 "Evaluate BODY with point located at event-start of EVENT.
a2281d8c22e0 * vc-dir.el (vc-dir-menu-map, vc-dir-at-event, vc-dir-resynch-file):
Juanma Barranquero <lekktu@gmail.com>
parents: 100908
diff changeset
282 If BODY uses EVENT, it should be a variable,
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
283 otherwise it will be evaluated twice."
100483
15455ea10b4a (vc-dir-at-event): Rename from vc-at-event. Change
Dan Nicolaescu <dann@ics.uci.edu>
parents: 100475
diff changeset
284 (let ((posn (make-symbol "vc-dir-at-event-posn")))
100475
75d8b06be81f (vc-at-event): Handle (tool-bar) events. Fix bug#1585.
Sam Steingold <sds@gnu.org>
parents: 99367
diff changeset
285 `(save-excursion
75d8b06be81f (vc-at-event): Handle (tool-bar) events. Fix bug#1585.
Sam Steingold <sds@gnu.org>
parents: 99367
diff changeset
286 (unless (equal ,event '(tool-bar))
75d8b06be81f (vc-at-event): Handle (tool-bar) events. Fix bug#1585.
Sam Steingold <sds@gnu.org>
parents: 99367
diff changeset
287 (let ((,posn (event-start ,event)))
75d8b06be81f (vc-at-event): Handle (tool-bar) events. Fix bug#1585.
Sam Steingold <sds@gnu.org>
parents: 99367
diff changeset
288 (set-buffer (window-buffer (posn-window ,posn)))
75d8b06be81f (vc-at-event): Handle (tool-bar) events. Fix bug#1585.
Sam Steingold <sds@gnu.org>
parents: 99367
diff changeset
289 (goto-char (posn-point ,posn))))
75d8b06be81f (vc-at-event): Handle (tool-bar) events. Fix bug#1585.
Sam Steingold <sds@gnu.org>
parents: 99367
diff changeset
290 ,@body)))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
291
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
292 (defun vc-dir-menu (e)
97210
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
293 "Popup the VC dir menu."
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
294 (interactive "e")
100483
15455ea10b4a (vc-dir-at-event): Rename from vc-at-event. Change
Dan Nicolaescu <dann@ics.uci.edu>
parents: 100475
diff changeset
295 (vc-dir-at-event e (popup-menu vc-dir-menu-map e)))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
296
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
297 (defvar vc-dir-tool-bar-map
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
298 (let ((map (make-sparse-keymap)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
299 (tool-bar-local-item-from-menu 'vc-dir-find-file "open"
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
300 map vc-dir-mode-map)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
301 (tool-bar-local-item "bookmark_add"
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
302 'vc-dir-toggle-mark 'vc-dir-toggle-mark map
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
303 :help "Toggle mark on current item")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
304 (tool-bar-local-item-from-menu 'vc-dir-previous-line "left-arrow"
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
305 map vc-dir-mode-map
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
306 :rtl "right-arrow")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
307 (tool-bar-local-item-from-menu 'vc-dir-next-line "right-arrow"
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
308 map vc-dir-mode-map
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
309 :rtl "left-arrow")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
310 (tool-bar-local-item-from-menu 'vc-print-log "info"
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
311 map vc-dir-mode-map)
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
312 (tool-bar-local-item-from-menu 'revert-buffer "refresh"
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
313 map vc-dir-mode-map)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
314 (tool-bar-local-item-from-menu 'nonincremental-search-forward
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
315 "search" map)
96500
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
316 (tool-bar-local-item-from-menu 'vc-dir-query-replace-regexp
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
317 "search-replace" map vc-dir-mode-map)
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
318 (tool-bar-local-item-from-menu 'vc-dir-kill-dir-status-process "cancel"
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
319 map vc-dir-mode-map)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
320 (tool-bar-local-item-from-menu 'quit-window "exit"
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
321 map vc-dir-mode-map)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
322 map))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
323
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
324 (defun vc-dir-node-directory (node)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
325 ;; Compute the directory for NODE.
105424
098f8a47a308 Fix typos in comments.
Juanma Barranquero <lekktu@gmail.com>
parents: 105293
diff changeset
326 ;; If it's a directory node, get it from the node.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
327 (let ((data (ewoc-data node)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
328 (or (vc-dir-fileinfo->directory data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
329 ;; Otherwise compute it from the file name.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
330 (file-name-directory
104615
6915f976dcd2 (vc-dir-node-directory, vc-dir-update): Get the parent
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104051
diff changeset
331 (directory-file-name
6915f976dcd2 (vc-dir-node-directory, vc-dir-update): Get the parent
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104051
diff changeset
332 (expand-file-name
6915f976dcd2 (vc-dir-node-directory, vc-dir-update): Get the parent
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104051
diff changeset
333 (vc-dir-fileinfo->name data)))))))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
334
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
335 (defun vc-dir-update (entries buffer &optional noinsert)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
336 "Update BUFFER's ewoc from the list of ENTRIES.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
337 If NOINSERT, ignore elements on ENTRIES which are not in the ewoc."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
338 ;; Add ENTRIES to the vc-dir buffer BUFFER.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
339 (with-current-buffer buffer
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
340 ;; Insert the entries sorted by name into the ewoc.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
341 ;; We assume the ewoc is sorted too, which should be the
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
342 ;; case if we always add entries with vc-dir-update.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
343 (setq entries
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
344 ;; Sort: first files and then subdirectories.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
345 ;; XXX: this is VERY inefficient, it computes the directory
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
346 ;; names too many times
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
347 (sort entries
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
348 (lambda (entry1 entry2)
104615
6915f976dcd2 (vc-dir-node-directory, vc-dir-update): Get the parent
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104051
diff changeset
349 (let ((dir1 (file-name-directory
6915f976dcd2 (vc-dir-node-directory, vc-dir-update): Get the parent
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104051
diff changeset
350 (directory-file-name (expand-file-name (car entry1)))))
6915f976dcd2 (vc-dir-node-directory, vc-dir-update): Get the parent
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104051
diff changeset
351 (dir2 (file-name-directory
6915f976dcd2 (vc-dir-node-directory, vc-dir-update): Get the parent
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104051
diff changeset
352 (directory-file-name (expand-file-name (car entry2))))))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
353 (cond
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
354 ((string< dir1 dir2) t)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
355 ((not (string= dir1 dir2)) nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
356 ((string< (car entry1) (car entry2))))))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
357 ;; Insert directory entries in the right places.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
358 (let ((entry (car entries))
102260
a52c9332c41c (vc-dir-update): Make sure ./ is always first in the listing.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101940
diff changeset
359 (node (ewoc-nth vc-ewoc 0))
a52c9332c41c (vc-dir-update): Make sure ./ is always first in the listing.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101940
diff changeset
360 (dotname (file-relative-name default-directory)))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
361 ;; Insert . if it is not present.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
362 (unless node
102260
a52c9332c41c (vc-dir-update): Make sure ./ is always first in the listing.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101940
diff changeset
363 (ewoc-enter-last
a52c9332c41c (vc-dir-update): Make sure ./ is always first in the listing.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101940
diff changeset
364 vc-ewoc (vc-dir-create-fileinfo
105293
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
365 dotname nil nil nil default-directory))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
366 (setq node (ewoc-nth vc-ewoc 0)))
96388
7ed97437d100 * vc-dir.el (vc-dir): Complete only directory names.
Juanma Barranquero <lekktu@gmail.com>
parents: 96310
diff changeset
367
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
368 (while (and entry node)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
369 (let* ((entryfile (car entry))
104615
6915f976dcd2 (vc-dir-node-directory, vc-dir-update): Get the parent
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104051
diff changeset
370 (entrydir (file-name-directory (directory-file-name
6915f976dcd2 (vc-dir-node-directory, vc-dir-update): Get the parent
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104051
diff changeset
371 (expand-file-name entryfile))))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
372 (nodedir (vc-dir-node-directory node)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
373 (cond
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
374 ;; First try to find the directory.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
375 ((string-lessp nodedir entrydir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
376 (setq node (ewoc-next vc-ewoc node)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
377 ((string-equal nodedir entrydir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
378 ;; Found the directory, find the place for the file name.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
379 (let ((nodefile (vc-dir-fileinfo->name (ewoc-data node))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
380 (cond
102260
a52c9332c41c (vc-dir-update): Make sure ./ is always first in the listing.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101940
diff changeset
381 ((string= nodefile dotname)
a52c9332c41c (vc-dir-update): Make sure ./ is always first in the listing.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101940
diff changeset
382 (setq node (ewoc-next vc-ewoc node)))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
383 ((string-lessp nodefile entryfile)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
384 (setq node (ewoc-next vc-ewoc node)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
385 ((string-equal nodefile entryfile)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
386 (setf (vc-dir-fileinfo->state (ewoc-data node)) (nth 1 entry))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
387 (setf (vc-dir-fileinfo->extra (ewoc-data node)) (nth 2 entry))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
388 (setf (vc-dir-fileinfo->needs-update (ewoc-data node)) nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
389 (ewoc-invalidate vc-ewoc node)
96388
7ed97437d100 * vc-dir.el (vc-dir): Complete only directory names.
Juanma Barranquero <lekktu@gmail.com>
parents: 96310
diff changeset
390 (setq entries (cdr entries))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
391 (setq entry (car entries))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
392 (setq node (ewoc-next vc-ewoc node)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
393 (t
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
394 (ewoc-enter-before vc-ewoc node
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
395 (apply 'vc-dir-create-fileinfo entry))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
396 (setq entries (cdr entries))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
397 (setq entry (car entries))))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
398 (t
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
399 ;; We might need to insert a directory node if the
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
400 ;; previous node was in a different directory.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
401 (let* ((rd (file-relative-name entrydir))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
402 (prev-node (ewoc-prev vc-ewoc node))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
403 (prev-dir (vc-dir-node-directory prev-node)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
404 (unless (string-equal entrydir prev-dir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
405 (ewoc-enter-before
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
406 vc-ewoc node (vc-dir-create-fileinfo rd nil nil nil entrydir))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
407 ;; Now insert the node itself.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
408 (ewoc-enter-before vc-ewoc node
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
409 (apply 'vc-dir-create-fileinfo entry))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
410 (setq entries (cdr entries) entry (car entries))))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
411 ;; We're past the last node, all remaining entries go to the end.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
412 (unless (or node noinsert)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
413 (let ((lastdir (vc-dir-node-directory (ewoc-nth vc-ewoc -1))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
414 (dolist (entry entries)
104615
6915f976dcd2 (vc-dir-node-directory, vc-dir-update): Get the parent
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104051
diff changeset
415 (let ((entrydir (file-name-directory
6915f976dcd2 (vc-dir-node-directory, vc-dir-update): Get the parent
Dan Nicolaescu <dann@ics.uci.edu>
parents: 104051
diff changeset
416 (directory-file-name (expand-file-name (car entry))))))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
417 ;; Insert a directory node if needed.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
418 (unless (string-equal lastdir entrydir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
419 (setq lastdir entrydir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
420 (let ((rd (file-relative-name entrydir)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
421 (ewoc-enter-last
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
422 vc-ewoc (vc-dir-create-fileinfo rd nil nil nil entrydir))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
423 ;; Now insert the node itself.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
424 (ewoc-enter-last vc-ewoc
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
425 (apply 'vc-dir-create-fileinfo entry)))))))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
426
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
427 (defun vc-dir-busy ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
428 (and (buffer-live-p vc-dir-process-buffer)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
429 (get-buffer-process vc-dir-process-buffer)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
430
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
431 (defun vc-dir-kill-dir-status-process ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
432 "Kill the temporary buffer and associated process."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
433 (interactive)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
434 (when (buffer-live-p vc-dir-process-buffer)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
435 (let ((proc (get-buffer-process vc-dir-process-buffer)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
436 (when proc (delete-process proc))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
437 (setq vc-dir-process-buffer nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
438 (setq mode-line-process nil))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
439
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
440 (defun vc-dir-kill-query ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
441 ;; Make sure that when the status buffer is killed the update
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
442 ;; process running in background is also killed.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
443 (if (vc-dir-busy)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
444 (when (y-or-n-p "Status update process running, really kill status buffer? ")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
445 (vc-dir-kill-dir-status-process)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
446 t)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
447 t))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
448
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
449 (defun vc-dir-next-line (arg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
450 "Go to the next line.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
451 If a prefix argument is given, move by that many lines."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
452 (interactive "p")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
453 (with-no-warnings
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
454 (ewoc-goto-next vc-ewoc arg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
455 (vc-dir-move-to-goal-column)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
456
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
457 (defun vc-dir-previous-line (arg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
458 "Go to the previous line.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
459 If a prefix argument is given, move by that many lines."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
460 (interactive "p")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
461 (ewoc-goto-prev vc-ewoc arg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
462 (vc-dir-move-to-goal-column))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
463
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
464 (defun vc-dir-next-directory ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
465 "Go to the next directory."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
466 (interactive)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
467 (let ((orig (point)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
468 (if
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
469 (catch 'foundit
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
470 (while t
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
471 (let* ((next (ewoc-next vc-ewoc (ewoc-locate vc-ewoc))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
472 (cond ((not next)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
473 (throw 'foundit t))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
474 (t
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
475 (progn
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
476 (ewoc-goto-node vc-ewoc next)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
477 (vc-dir-move-to-goal-column)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
478 (if (vc-dir-fileinfo->directory (ewoc-data next))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
479 (throw 'foundit nil))))))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
480 (goto-char orig))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
481
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
482 (defun vc-dir-previous-directory ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
483 "Go to the previous directory."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
484 (interactive)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
485 (let ((orig (point)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
486 (if
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
487 (catch 'foundit
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
488 (while t
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
489 (let* ((prev (ewoc-prev vc-ewoc (ewoc-locate vc-ewoc))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
490 (cond ((not prev)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
491 (throw 'foundit t))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
492 (t
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
493 (progn
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
494 (ewoc-goto-node vc-ewoc prev)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
495 (vc-dir-move-to-goal-column)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
496 (if (vc-dir-fileinfo->directory (ewoc-data prev))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
497 (throw 'foundit nil))))))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
498 (goto-char orig))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
499
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
500 (defun vc-dir-mark-unmark (mark-unmark-function)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
501 (if (use-region-p)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
502 (let ((firstl (line-number-at-pos (region-beginning)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
503 (lastl (line-number-at-pos (region-end))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
504 (save-excursion
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
505 (goto-char (region-beginning))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
506 (while (<= (line-number-at-pos) lastl)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
507 (funcall mark-unmark-function))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
508 (funcall mark-unmark-function)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
509
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
510 (defun vc-dir-parent-marked-p (arg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
511 ;; Return nil if none of the parent directories of arg is marked.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
512 (let* ((argdir (vc-dir-node-directory arg))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
513 (arglen (length argdir))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
514 (crt arg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
515 data dir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
516 ;; Go through the predecessors, checking if any directory that is
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
517 ;; a parent is marked.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
518 (while (setq crt (ewoc-prev vc-ewoc crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
519 (setq data (ewoc-data crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
520 (setq dir (vc-dir-node-directory crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
521 (when (and (vc-dir-fileinfo->directory data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
522 (vc-string-prefix-p dir argdir))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
523 (when (vc-dir-fileinfo->marked data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
524 (error "Cannot mark `%s', parent directory `%s' marked"
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
525 (vc-dir-fileinfo->name (ewoc-data arg))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
526 (vc-dir-fileinfo->name data)))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
527 nil))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
528
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
529 (defun vc-dir-children-marked-p (arg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
530 ;; Return nil if none of the children of arg is marked.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
531 (let* ((argdir-re (concat "\\`" (regexp-quote (vc-dir-node-directory arg))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
532 (is-child t)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
533 (crt arg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
534 data dir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
535 (while (and is-child (setq crt (ewoc-next vc-ewoc crt)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
536 (setq data (ewoc-data crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
537 (setq dir (vc-dir-node-directory crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
538 (if (string-match argdir-re dir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
539 (when (vc-dir-fileinfo->marked data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
540 (error "Cannot mark `%s', child `%s' marked"
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
541 (vc-dir-fileinfo->name (ewoc-data arg))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
542 (vc-dir-fileinfo->name data)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
543 ;; We are done, we got to an entry that is not a child of `arg'.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
544 (setq is-child nil)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
545 nil))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
546
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
547 (defun vc-dir-mark-file (&optional arg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
548 ;; Mark ARG or the current file and move to the next line.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
549 (let* ((crt (or arg (ewoc-locate vc-ewoc)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
550 (file (ewoc-data crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
551 (isdir (vc-dir-fileinfo->directory file)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
552 (when (or (and isdir (not (vc-dir-children-marked-p crt)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
553 (and (not isdir) (not (vc-dir-parent-marked-p crt))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
554 (setf (vc-dir-fileinfo->marked file) t)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
555 (ewoc-invalidate vc-ewoc crt)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
556 (unless (or arg (mouse-event-p last-command-event))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
557 (vc-dir-next-line 1)))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
558
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
559 (defun vc-dir-mark ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
560 "Mark the current file or all files in the region.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
561 If the region is active, mark all the files in the region.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
562 Otherwise mark the file on the current line and move to the next
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
563 line."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
564 (interactive)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
565 (vc-dir-mark-unmark 'vc-dir-mark-file))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
566
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
567 (defun vc-dir-mark-all-files (arg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
568 "Mark all files with the same state as the current one.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
569 With a prefix argument mark all files.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
570 If the current entry is a directory, mark all child files.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
571
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
572 The commands operate on files that are on the same state.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
573 This command is intended to make it easy to select all files that
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
574 share the same state."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
575 (interactive "P")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
576 (if arg
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
577 ;; Mark all files.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
578 (progn
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
579 ;; First check that no directory is marked, we can't mark
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
580 ;; files in that case.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
581 (ewoc-map
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
582 (lambda (filearg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
583 (when (and (vc-dir-fileinfo->directory filearg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
584 (vc-dir-fileinfo->marked filearg))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
585 (error "Cannot mark all files, directory `%s' marked"
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
586 (vc-dir-fileinfo->name filearg))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
587 vc-ewoc)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
588 (ewoc-map
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
589 (lambda (filearg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
590 (unless (vc-dir-fileinfo->marked filearg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
591 (setf (vc-dir-fileinfo->marked filearg) t)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
592 t))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
593 vc-ewoc))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
594 (let ((data (ewoc-data (ewoc-locate vc-ewoc))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
595 (if (vc-dir-fileinfo->directory data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
596 ;; It's a directory, mark child files.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
597 (let ((crt (ewoc-locate vc-ewoc)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
598 (unless (vc-dir-children-marked-p crt)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
599 (while (setq crt (ewoc-next vc-ewoc crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
600 (let ((crt-data (ewoc-data crt)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
601 (unless (vc-dir-fileinfo->directory crt-data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
602 (setf (vc-dir-fileinfo->marked crt-data) t)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
603 (ewoc-invalidate vc-ewoc crt))))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
604 ;; It's a file
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
605 (let ((state (vc-dir-fileinfo->state data))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
606 (crt (ewoc-nth vc-ewoc 0)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
607 (while crt
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
608 (let ((crt-data (ewoc-data crt)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
609 (when (and (not (vc-dir-fileinfo->marked crt-data))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
610 (eq (vc-dir-fileinfo->state crt-data) state)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
611 (not (vc-dir-fileinfo->directory crt-data)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
612 (vc-dir-mark-file crt)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
613 (setq crt (ewoc-next vc-ewoc crt))))))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
614
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
615 (defun vc-dir-unmark-file ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
616 ;; Unmark the current file and move to the next line.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
617 (let* ((crt (ewoc-locate vc-ewoc))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
618 (file (ewoc-data crt)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
619 (setf (vc-dir-fileinfo->marked file) nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
620 (ewoc-invalidate vc-ewoc crt)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
621 (unless (mouse-event-p last-command-event)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
622 (vc-dir-next-line 1))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
623
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
624 (defun vc-dir-unmark ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
625 "Unmark the current file or all files in the region.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
626 If the region is active, unmark all the files in the region.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
627 Otherwise mark the file on the current line and move to the next
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
628 line."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
629 (interactive)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
630 (vc-dir-mark-unmark 'vc-dir-unmark-file))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
631
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
632 (defun vc-dir-unmark-file-up ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
633 "Move to the previous line and unmark the file."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
634 (interactive)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
635 ;; If we're on the first line, we won't move up, but we will still
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
636 ;; remove the mark. This seems a bit odd but it is what buffer-menu
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
637 ;; does.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
638 (let* ((prev (ewoc-goto-prev vc-ewoc 1))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
639 (file (ewoc-data prev)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
640 (setf (vc-dir-fileinfo->marked file) nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
641 (ewoc-invalidate vc-ewoc prev)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
642 (vc-dir-move-to-goal-column)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
643
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
644 (defun vc-dir-unmark-all-files (arg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
645 "Unmark all files with the same state as the current one.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
646 With a prefix argument unmark all files.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
647 If the current entry is a directory, unmark all the child files.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
648
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
649 The commands operate on files that are on the same state.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
650 This command is intended to make it easy to deselect all files
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
651 that share the same state."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
652 (interactive "P")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
653 (if arg
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
654 (ewoc-map
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
655 (lambda (filearg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
656 (when (vc-dir-fileinfo->marked filearg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
657 (setf (vc-dir-fileinfo->marked filearg) nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
658 t))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
659 vc-ewoc)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
660 (let* ((crt (ewoc-locate vc-ewoc))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
661 (data (ewoc-data crt)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
662 (if (vc-dir-fileinfo->directory data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
663 ;; It's a directory, unmark child files.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
664 (while (setq crt (ewoc-next vc-ewoc crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
665 (let ((crt-data (ewoc-data crt)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
666 (unless (vc-dir-fileinfo->directory crt-data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
667 (setf (vc-dir-fileinfo->marked crt-data) nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
668 (ewoc-invalidate vc-ewoc crt))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
669 ;; It's a file
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
670 (let ((crt-state (vc-dir-fileinfo->state (ewoc-data crt))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
671 (ewoc-map
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
672 (lambda (filearg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
673 (when (and (vc-dir-fileinfo->marked filearg)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
674 (eq (vc-dir-fileinfo->state filearg) crt-state))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
675 (setf (vc-dir-fileinfo->marked filearg) nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
676 t))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
677 vc-ewoc))))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
678
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
679 (defun vc-dir-toggle-mark-file ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
680 (let* ((crt (ewoc-locate vc-ewoc))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
681 (file (ewoc-data crt)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
682 (if (vc-dir-fileinfo->marked file)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
683 (vc-dir-unmark-file)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
684 (vc-dir-mark-file))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
685
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
686 (defun vc-dir-toggle-mark (e)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
687 (interactive "e")
100483
15455ea10b4a (vc-dir-at-event): Rename from vc-at-event. Change
Dan Nicolaescu <dann@ics.uci.edu>
parents: 100475
diff changeset
688 (vc-dir-at-event e (vc-dir-mark-unmark 'vc-dir-toggle-mark-file)))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
689
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
690 (defun vc-dir-delete-file ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
691 "Delete the marked files, or the current file if no marks."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
692 (interactive)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
693 (mapc 'vc-delete-file (or (vc-dir-marked-files)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
694 (list (vc-dir-current-file)))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
695
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
696 (defun vc-dir-find-file ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
697 "Find the file on the current line."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
698 (interactive)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
699 (find-file (vc-dir-current-file)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
700
101924
c1950714465b (vc-dir-find-file-other-window): Allow mouse events.
Nick Roberts <nickrob@snap.net.nz>
parents: 101718
diff changeset
701 (defun vc-dir-find-file-other-window (&optional event)
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
702 "Find the file on the current line, in another window."
101924
c1950714465b (vc-dir-find-file-other-window): Allow mouse events.
Nick Roberts <nickrob@snap.net.nz>
parents: 101718
diff changeset
703 (interactive (list last-nonmenu-event))
c1950714465b (vc-dir-find-file-other-window): Allow mouse events.
Nick Roberts <nickrob@snap.net.nz>
parents: 101718
diff changeset
704 (if event (posn-set-point (event-end event)))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
705 (find-file-other-window (vc-dir-current-file)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
706
96964
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
707 (defun vc-dir-isearch ()
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
708 "Search for a string through all marked buffers using Isearch."
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
709 (interactive)
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
710 (multi-isearch-files
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
711 (mapcar 'car (vc-dir-marked-only-files-and-states))))
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
712
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
713 (defun vc-dir-isearch-regexp ()
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
714 "Search for a regexp through all marked buffers using Isearch."
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
715 (interactive)
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
716 (multi-isearch-files-regexp
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
717 (mapcar 'car (vc-dir-marked-only-files-and-states))))
bd2850789ce2 (vc-dir-search, vc-dir-isearch)
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96963
diff changeset
718
96963
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
719 (defun vc-dir-search (regexp)
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
720 "Search through all marked files for a match for REGEXP.
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
721 For marked directories, use the files displayed from those directories.
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
722 Stops when a match is found.
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
723 To continue searching for next match, use command \\[tags-loop-continue]."
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
724 (interactive "sSearch marked files (regexp): ")
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
725 (tags-search regexp '(mapcar 'car (vc-dir-marked-only-files-and-states))))
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
726
96500
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
727 (defun vc-dir-query-replace-regexp (from to &optional delimited)
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
728 "Do `query-replace-regexp' of FROM with TO, on all marked files.
96963
4abff057d348 (vc-dir-search): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96888
diff changeset
729 For marked directories, use the files displayed from those directories.
96500
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
730 If a directory is marked, then use the files displayed for that directory.
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
731 Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
732 If you exit (\\[keyboard-quit], RET or q), you can resume the query replace
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
733 with the command \\[tags-loop-continue]."
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
734 ;; FIXME: this is almost a copy of `dired-do-replace-regexp'. This
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
735 ;; should probably be made generic and used in both places instead of
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
736 ;; duplicating it here.
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
737 (interactive
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
738 (let ((common
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
739 (query-replace-read-args
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
740 "Query replace regexp in marked files" t t)))
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
741 (list (nth 0 common) (nth 1 common) (nth 2 common))))
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
742 (dolist (file (mapcar 'car (vc-dir-marked-only-files-and-states)))
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
743 (let ((buffer (get-file-buffer file)))
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
744 (if (and buffer (with-current-buffer buffer
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
745 buffer-read-only))
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
746 (error "File `%s' is visited read-only" file))))
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
747 (tags-query-replace from to delimited
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
748 '(mapcar 'car (vc-dir-marked-only-files-and-states))))
4c68d664c39b (vc-dir-query-replace-regexp): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96474
diff changeset
749
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
750 (defun vc-dir-current-file ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
751 (let ((node (ewoc-locate vc-ewoc)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
752 (unless node
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
753 (error "No file available"))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
754 (expand-file-name (vc-dir-fileinfo->name (ewoc-data node)))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
755
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
756 (defun vc-dir-marked-files ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
757 "Return the list of marked files."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
758 (mapcar
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
759 (lambda (elem) (expand-file-name (vc-dir-fileinfo->name elem)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
760 (ewoc-collect vc-ewoc 'vc-dir-fileinfo->marked)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
761
96256
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
762 (defun vc-dir-marked-only-files-and-states ()
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
763 "Return the list of conses (FILE . STATE) for the marked files.
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
764 For marked directories return the corresponding conses for the
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
765 child files."
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
766 (let ((crt (ewoc-nth vc-ewoc 0))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
767 result)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
768 (while crt
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
769 (let ((crt-data (ewoc-data crt)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
770 (if (vc-dir-fileinfo->marked crt-data)
96256
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
771 ;; FIXME: use vc-dir-child-files-and-states here instead of duplicating it.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
772 (if (vc-dir-fileinfo->directory crt-data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
773 (let* ((dir (vc-dir-fileinfo->directory crt-data))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
774 (dirlen (length dir))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
775 data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
776 (while
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
777 (and (setq crt (ewoc-next vc-ewoc crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
778 (vc-string-prefix-p dir
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
779 (progn
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
780 (setq data (ewoc-data crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
781 (vc-dir-node-directory crt))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
782 (unless (vc-dir-fileinfo->directory data)
96388
7ed97437d100 * vc-dir.el (vc-dir): Complete only directory names.
Juanma Barranquero <lekktu@gmail.com>
parents: 96310
diff changeset
783 (push
96256
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
784 (cons (expand-file-name (vc-dir-fileinfo->name data))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
785 (vc-dir-fileinfo->state data))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
786 result))))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
787 (push (cons (expand-file-name (vc-dir-fileinfo->name crt-data))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
788 (vc-dir-fileinfo->state crt-data))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
789 result)
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
790 (setq crt (ewoc-next vc-ewoc crt)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
791 (setq crt (ewoc-next vc-ewoc crt)))))
97696
5d466e3c0ab7 (vc-dir-marked-only-files-and-states):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 97660
diff changeset
792 (nreverse result)))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
793
96256
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
794 (defun vc-dir-child-files-and-states ()
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
795 "Return the list of conses (FILE . STATE) for child files of the current entry if it's a directory.
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
796 If it is a file, return the corresponding cons for the file itself."
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
797 (let* ((crt (ewoc-locate vc-ewoc))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
798 (crt-data (ewoc-data crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
799 result)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
800 (if (vc-dir-fileinfo->directory crt-data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
801 (let* ((dir (vc-dir-fileinfo->directory crt-data))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
802 (dirlen (length dir))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
803 data)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
804 (while
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
805 (and (setq crt (ewoc-next vc-ewoc crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
806 (vc-string-prefix-p dir (progn
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
807 (setq data (ewoc-data crt))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
808 (vc-dir-node-directory crt))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
809 (unless (vc-dir-fileinfo->directory data)
96388
7ed97437d100 * vc-dir.el (vc-dir): Complete only directory names.
Juanma Barranquero <lekktu@gmail.com>
parents: 96310
diff changeset
810 (push
96256
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
811 (cons (expand-file-name (vc-dir-fileinfo->name data))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
812 (vc-dir-fileinfo->state data))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
813 result))))
96388
7ed97437d100 * vc-dir.el (vc-dir): Complete only directory names.
Juanma Barranquero <lekktu@gmail.com>
parents: 96310
diff changeset
814 (push
96256
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
815 (cons (expand-file-name (vc-dir-fileinfo->name crt-data))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
816 (vc-dir-fileinfo->state crt-data)) result))
97696
5d466e3c0ab7 (vc-dir-marked-only-files-and-states):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 97660
diff changeset
817 (nreverse result)))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
818
96520
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
819 (defun vc-dir-recompute-file-state (fname def-dir)
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
820 (let* ((file-short (file-relative-name fname def-dir))
96880
938dd02137bc (vc-dir-recompute-file-state): Add workaround for CVS.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96541
diff changeset
821 (remove-me-when-CVS-works
938dd02137bc (vc-dir-recompute-file-state): Add workaround for CVS.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96541
diff changeset
822 (when (eq vc-dir-backend 'CVS)
938dd02137bc (vc-dir-recompute-file-state): Add workaround for CVS.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96541
diff changeset
823 ;; FIXME: Warning: UGLY HACK. The CVS backend caches the state
938dd02137bc (vc-dir-recompute-file-state): Add workaround for CVS.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96541
diff changeset
824 ;; info, this forces the backend to update it.
96888
32da3745adc8 Fixed mismatched parenthesis in vc-dir.el.
Bastien Guerry <bzg@altern.org>
parents: 96880
diff changeset
825 (vc-call-backend vc-dir-backend 'registered fname)))
96520
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
826 (state (vc-call-backend vc-dir-backend 'state fname))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
827 (extra (vc-call-backend vc-dir-backend
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
828 'status-fileinfo-extra fname)))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
829 (list file-short state extra)))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
830
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
831 (defun vc-dir-find-child-files (dirname)
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
832 ;; Give a DIRNAME string return the list of all child files shown in
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
833 ;; the current *vc-dir* buffer.
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
834 (let ((crt (ewoc-nth vc-ewoc 0))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
835 children
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
836 dname)
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
837 ;; Find DIR
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
838 (while (and crt (not (vc-string-prefix-p
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
839 dirname (vc-dir-node-directory crt))))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
840 (setq crt (ewoc-next vc-ewoc crt)))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
841 (while (and crt (vc-string-prefix-p
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
842 dirname
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
843 (setq dname (vc-dir-node-directory crt))))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
844 (let ((data (ewoc-data crt)))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
845 (unless (vc-dir-fileinfo->directory data)
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
846 (push (expand-file-name (vc-dir-fileinfo->name data)) children)))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
847 (setq crt (ewoc-next vc-ewoc crt)))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
848 children))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
849
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
850 (defun vc-dir-resync-directory-files (dirname)
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
851 ;; Update the entries for all the child files of DIRNAME shown in
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
852 ;; the current *vc-dir* buffer.
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
853 (let ((files (vc-dir-find-child-files dirname))
105293
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
854 (ddir default-directory)
96520
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
855 fileentries)
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
856 (when files
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
857 (dolist (crt files)
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
858 (push (vc-dir-recompute-file-state crt ddir)
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
859 fileentries))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
860 (vc-dir-update fileentries (current-buffer)))))
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
861
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
862 (defun vc-dir-resynch-file (&optional fname)
101642
a2281d8c22e0 * vc-dir.el (vc-dir-menu-map, vc-dir-at-event, vc-dir-resynch-file):
Juanma Barranquero <lekktu@gmail.com>
parents: 100908
diff changeset
863 "Update the entries for FNAME in any directory buffers that list it."
96520
00812d11af93 * vc-dir.el (vc-dir-find-child-files): New function.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96500
diff changeset
864 (let ((file (or fname (expand-file-name buffer-file-name)))
105293
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
865 (drop '()))
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
866 (save-current-buffer
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
867 ;; look for a vc-dir buffer that might show this file.
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
868 (dolist (status-buf vc-dir-buffers)
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
869 (if (not (buffer-live-p status-buf))
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
870 (push status-buf drop)
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
871 (set-buffer status-buf)
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
872 (if (not (derived-mode-p 'vc-dir-mode))
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
873 (push status-buf drop)
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
874 (let ((ddir default-directory))
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
875 (when (vc-string-prefix-p ddir file)
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
876 (if (file-directory-p file)
106887
b9c9ec129ae5 (vc-dir-resynch-file): Update the vc-dir header when
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
877 (progn
b9c9ec129ae5 (vc-dir-resynch-file): Update the vc-dir header when
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
878 (vc-dir-resync-directory-files file)
b9c9ec129ae5 (vc-dir-resynch-file): Update the vc-dir header when
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
879 (ewoc-set-hf vc-ewoc
b9c9ec129ae5 (vc-dir-resynch-file): Update the vc-dir header when
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106815
diff changeset
880 (vc-dir-headers vc-dir-backend default-directory) ""))
105293
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
881 (let ((state (vc-dir-recompute-file-state file ddir)))
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
882 (vc-dir-update
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
883 (list state)
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
884 status-buf (eq (cadr state) 'up-to-date))))))))))
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
885 ;; Remove out-of-date entries from vc-dir-buffers.
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
886 (dolist (b drop) (setq vc-dir-buffers (delq b vc-dir-buffers)))))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
887
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
888 (defvar use-vc-backend) ;; dynamically bound
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
889
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
890 (define-derived-mode vc-dir-mode special-mode "VC dir"
97210
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
891 "Major mode for VC directory buffers.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
892 Marking/Unmarking key bindings and actions:
101718
e5e2e4109ea1 (vc-dir-mode): Fix docstring.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101717
diff changeset
893 m - mark a file/directory
e5e2e4109ea1 (vc-dir-mode): Fix docstring.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101717
diff changeset
894 - if the region is active, mark all the files in region.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
895 Restrictions: - a file cannot be marked if any parent directory is marked
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
896 - a directory cannot be marked if any child file or
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
897 directory is marked
101718
e5e2e4109ea1 (vc-dir-mode): Fix docstring.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101717
diff changeset
898 u - unmark a file/directory
e5e2e4109ea1 (vc-dir-mode): Fix docstring.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101717
diff changeset
899 - if the region is active, unmark all the files in region.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
900 M - if the cursor is on a file: mark all the files with the same state as
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
901 the current file
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
902 - if the cursor is on a directory: mark all child files
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
903 - with a prefix argument: mark all files
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
904 U - if the cursor is on a file: unmark all the files with the same state
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
905 as the current file
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
906 - if the cursor is on a directory: unmark all child files
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
907 - with a prefix argument: unmark all files
101718
e5e2e4109ea1 (vc-dir-mode): Fix docstring.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101717
diff changeset
908 mouse-2 - toggles the mark state
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
909
97210
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
910 VC commands
101718
e5e2e4109ea1 (vc-dir-mode): Fix docstring.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101717
diff changeset
911 VC commands in the `C-x v' prefix can be used.
e5e2e4109ea1 (vc-dir-mode): Fix docstring.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101717
diff changeset
912 VC commands act on the marked entries. If nothing is marked, VC
e5e2e4109ea1 (vc-dir-mode): Fix docstring.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101717
diff changeset
913 commands act on the current entry.
97210
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
914
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
915 Search & Replace
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
916 S - searches the marked files
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
917 Q - does a query replace on the marked files
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
918 M-s a C-s - does an isearch on the marked files
97315
b51913497dd3 (vc-dir-mode): Fix typo.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 97210
diff changeset
919 M-s a C-M-s - does a regexp isearch on the marked files
97210
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
920 If nothing is marked, these commands act on the current entry.
50d4090b5c35 restore 1.17
Sam Steingold <sds@gnu.org>
parents: 97118
diff changeset
921 When a directory is current or marked, the Search & Replace
101718
e5e2e4109ea1 (vc-dir-mode): Fix docstring.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101717
diff changeset
922 commands act on the child files of that directory that are displayed in
e5e2e4109ea1 (vc-dir-mode): Fix docstring.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101717
diff changeset
923 the *vc-dir* buffer.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
924
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
925 \\{vc-dir-mode-map}"
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
926 (set (make-local-variable 'vc-dir-backend) use-vc-backend)
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
927 (setq buffer-read-only t)
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
928 (when (boundp 'tool-bar-map)
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
929 (set (make-local-variable 'tool-bar-map) vc-dir-tool-bar-map))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
930 (let ((buffer-read-only nil))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
931 (erase-buffer)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
932 (set (make-local-variable 'vc-dir-process-buffer) nil)
99159
b0dce7f34dda * vc.el: Rename VC methods that were missed when vc-status was
Dan Nicolaescu <dann@ics.uci.edu>
parents: 99133
diff changeset
933 (set (make-local-variable 'vc-ewoc) (ewoc-create #'vc-dir-printer))
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
934 (set (make-local-variable 'revert-buffer-function)
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
935 'vc-dir-revert-buffer-function)
106759
e778a4a0f821 Fix bug#3224.
Juanma Barranquero <lekktu@gmail.com>
parents: 106412
diff changeset
936 (setq list-buffers-directory (expand-file-name "*vc-dir*" default-directory))
105293
8bfe20e0336c * vc-hooks.el (vc-dir-buffers): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 105196
diff changeset
937 (add-to-list 'vc-dir-buffers (current-buffer))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
938 ;; Make sure that if the directory buffer is killed, the update
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
939 ;; process running in the background is also killed.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
940 (add-hook 'kill-buffer-query-functions 'vc-dir-kill-query nil t)
107374
dc9565b08f10 Add .dir-locals.el support for file-less buffers.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 106887
diff changeset
941 (hack-dir-local-variables-non-file-buffer)
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
942 (vc-dir-refresh)))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
943
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
944 (defun vc-dir-headers (backend dir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
945 "Display the headers in the *VC dir* buffer.
99159
b0dce7f34dda * vc.el: Rename VC methods that were missed when vc-status was
Dan Nicolaescu <dann@ics.uci.edu>
parents: 99133
diff changeset
946 It calls the `dir-extra-headers' backend method to display backend
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
947 specific headers."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
948 (concat
99367
ce0076e88ed4 (vc-dir-headers): Undo previous change.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 99361
diff changeset
949 ;; First layout the common headers.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
950 (propertize "VC backend : " 'face 'font-lock-type-face)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
951 (propertize (format "%s\n" backend) 'face 'font-lock-variable-name-face)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
952 (propertize "Working dir: " 'face 'font-lock-type-face)
107537
7c9abe9e21d1 * vc-dir.el (vc-dir-headers): Abbreviate the working dir.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107374
diff changeset
953 (propertize (format "%s\n" (abbreviate-file-name dir))
7c9abe9e21d1 * vc-dir.el (vc-dir-headers): Abbreviate the working dir.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107374
diff changeset
954 'face 'font-lock-variable-name-face)
99367
ce0076e88ed4 (vc-dir-headers): Undo previous change.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 99361
diff changeset
955 ;; Then the backend specific ones.
ce0076e88ed4 (vc-dir-headers): Undo previous change.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 99361
diff changeset
956 (vc-call-backend backend 'dir-extra-headers dir)
ce0076e88ed4 (vc-dir-headers): Undo previous change.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 99361
diff changeset
957 "\n"))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
958
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
959 (defun vc-dir-refresh-files (files default-state)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
960 "Refresh some files in the *VC-dir* buffer."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
961 (let ((def-dir default-directory)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
962 (backend vc-dir-backend))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
963 (vc-set-mode-line-busy-indicator)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
964 ;; Call the `dir-status-file' backend function.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
965 ;; `dir-status-file' is supposed to be asynchronous.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
966 ;; It should compute the results, and then call the function
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
967 ;; passed as an argument in order to update the vc-dir buffer
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
968 ;; with the results.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
969 (unless (buffer-live-p vc-dir-process-buffer)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
970 (setq vc-dir-process-buffer
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
971 (generate-new-buffer (format " *VC-%s* tmp status" backend))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
972 (lexical-let ((buffer (current-buffer)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
973 (with-current-buffer vc-dir-process-buffer
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
974 (cd def-dir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
975 (erase-buffer)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
976 (vc-call-backend
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
977 backend 'dir-status-files def-dir files default-state
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
978 (lambda (entries &optional more-to-come)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
979 ;; ENTRIES is a list of (FILE VC_STATE EXTRA) items.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
980 ;; If MORE-TO-COME is true, then more updates will come from
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
981 ;; the asynchronous process.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
982 (with-current-buffer buffer
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
983 (vc-dir-update entries buffer)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
984 (unless more-to-come
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
985 (setq mode-line-process nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
986 ;; Remove the ones that haven't been updated at all.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
987 ;; Those not-updated are those whose state is nil because the
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
988 ;; file/dir doesn't exist and isn't versioned.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
989 (ewoc-filter vc-ewoc
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
990 (lambda (info)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
991 ;; The state for directory entries might
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
992 ;; have been changed to 'up-to-date,
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
993 ;; reset it, othewise it will be removed when doing 'x'
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
994 ;; next time.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
995 ;; FIXME: There should be a more elegant way to do this.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
996 (when (and (vc-dir-fileinfo->directory info)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
997 (eq (vc-dir-fileinfo->state info)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
998 'up-to-date))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
999 (setf (vc-dir-fileinfo->state info) nil))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1000
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1001 (not (vc-dir-fileinfo->needs-update info))))))))))))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1002
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1003 (defun vc-dir-revert-buffer-function (&optional ignore-auto noconfirm)
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1004 (vc-dir-refresh))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1005
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1006 (defun vc-dir-refresh ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1007 "Refresh the contents of the *VC-dir* buffer.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1008 Throw an error if another update process is in progress."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1009 (interactive)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1010 (if (vc-dir-busy)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1011 (error "Another update process is in progress, cannot run two at a time")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1012 (let ((def-dir default-directory)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1013 (backend vc-dir-backend))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1014 (vc-set-mode-line-busy-indicator)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1015 ;; Call the `dir-status' backend function.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1016 ;; `dir-status' is supposed to be asynchronous.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1017 ;; It should compute the results, and then call the function
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1018 ;; passed as an argument in order to update the vc-dir buffer
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1019 ;; with the results.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1020
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1021 ;; Create a buffer that can be used by `dir-status' and call
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1022 ;; `dir-status' with this buffer as the current buffer. Use
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1023 ;; `vc-dir-process-buffer' to remember this buffer, so that
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1024 ;; it can be used later to kill the update process in case it
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1025 ;; takes too long.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1026 (unless (buffer-live-p vc-dir-process-buffer)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1027 (setq vc-dir-process-buffer
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1028 (generate-new-buffer (format " *VC-%s* tmp status" backend))))
96541
d39625535543 (vc-dir-refresh): Only update files.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96520
diff changeset
1029 ;; set the needs-update flag on all non-directory entries
d39625535543 (vc-dir-refresh): Only update files.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96520
diff changeset
1030 (ewoc-map (lambda (info)
d39625535543 (vc-dir-refresh): Only update files.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96520
diff changeset
1031 (unless (vc-dir-fileinfo->directory info)
d39625535543 (vc-dir-refresh): Only update files.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96520
diff changeset
1032 (setf (vc-dir-fileinfo->needs-update info) t) nil))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1033 vc-ewoc)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1034 (lexical-let ((buffer (current-buffer)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1035 (with-current-buffer vc-dir-process-buffer
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1036 (cd def-dir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1037 (erase-buffer)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1038 (vc-call-backend
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1039 backend 'dir-status def-dir
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1040 (lambda (entries &optional more-to-come)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1041 ;; ENTRIES is a list of (FILE VC_STATE EXTRA) items.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1042 ;; If MORE-TO-COME is true, then more updates will come from
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1043 ;; the asynchronous process.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1044 (with-current-buffer buffer
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1045 (vc-dir-update entries buffer)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1046 (unless more-to-come
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1047 (let ((remaining
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1048 (ewoc-collect
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1049 vc-ewoc 'vc-dir-fileinfo->needs-update)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1050 (if remaining
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1051 (vc-dir-refresh-files
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1052 (mapcar 'vc-dir-fileinfo->name remaining)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1053 'up-to-date)
98471
497018549116 (vc-dir-mode): Don't create the ewoc header here.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 97696
diff changeset
1054 (setq mode-line-process nil)))))))))
497018549116 (vc-dir-mode): Don't create the ewoc header here.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 97696
diff changeset
1055 (ewoc-set-hf vc-ewoc (vc-dir-headers backend def-dir) ""))))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1056
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1057 (defun vc-dir-show-fileentry (file)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1058 "Insert an entry for a specific file into the current *VC-dir* listing.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1059 This is typically used if the file is up-to-date (or has been added
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1060 outside of VC) and one wants to do some operation on it."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1061 (interactive "fShow file: ")
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1062 (vc-dir-update (list (list (file-relative-name file) (vc-state file))) (current-buffer)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1063
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1064 (defun vc-dir-hide-up-to-date ()
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1065 "Hide up-to-date items from display."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1066 (interactive)
96390
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1067 (let ((crt (ewoc-nth vc-ewoc -1))
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1068 (first (ewoc-nth vc-ewoc 0)))
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1069 ;; Go over from the last item to the first and remove the
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1070 ;; up-to-date files and directories with no child files.
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1071 (while (not (eq crt first))
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1072 (let* ((data (ewoc-data crt))
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1073 (dir (vc-dir-fileinfo->directory data))
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1074 (next (ewoc-next vc-ewoc crt))
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1075 (prev (ewoc-prev vc-ewoc crt))
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1076 ;; ewoc-delete does not work without this...
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1077 (inhibit-read-only t))
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1078 (when (or
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1079 ;; Remove directories with no child files.
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1080 (and dir
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1081 (or
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1082 ;; Nothing follows this directory.
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1083 (not next)
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1084 ;; Next item is a directory.
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1085 (vc-dir-fileinfo->directory (ewoc-data next))))
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1086 ;; Remove files in the up-to-date state.
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1087 (eq (vc-dir-fileinfo->state data) 'up-to-date))
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1088 (ewoc-delete vc-ewoc crt))
02d657f45045 * vc-dir.el (vc-dir-hide-up-to-date): Also hide empty directories.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96388
diff changeset
1089 (setq crt prev)))))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1090
99159
b0dce7f34dda * vc.el: Rename VC methods that were missed when vc-status was
Dan Nicolaescu <dann@ics.uci.edu>
parents: 99133
diff changeset
1091 (defun vc-dir-printer (fileentry)
b0dce7f34dda * vc.el: Rename VC methods that were missed when vc-status was
Dan Nicolaescu <dann@ics.uci.edu>
parents: 99133
diff changeset
1092 (vc-call-backend vc-dir-backend 'dir-printer fileentry))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1093
96256
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1094 (defun vc-dir-deduce-fileset (&optional state-model-only-files)
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1095 (let ((marked (vc-dir-marked-files))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1096 files
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1097 only-files-list
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1098 state
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1099 model)
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1100 (if marked
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1101 (progn
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1102 (setq files marked)
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1103 (when state-model-only-files
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1104 (setq only-files-list (vc-dir-marked-only-files-and-states))))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1105 (let ((crt (vc-dir-current-file)))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1106 (setq files (list crt))
96388
7ed97437d100 * vc-dir.el (vc-dir): Complete only directory names.
Juanma Barranquero <lekktu@gmail.com>
parents: 96310
diff changeset
1107 (when state-model-only-files
96256
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1108 (setq only-files-list (vc-dir-child-files-and-states)))))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1109
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1110 (when state-model-only-files
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1111 (setq state (cdar only-files-list))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1112 ;; Check that all files are in a consistent state, since we use that
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1113 ;; state to decide which operation to perform.
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1114 (dolist (crt (cdr only-files-list))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1115 (unless (vc-compatible-state (cdr crt) state)
102660
ab984696947f (vc-dir-deduce-fileset): Make the error message more explicit.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 102260
diff changeset
1116 (error "When applying VC operations to multiple files, the files are required\nto be in similar VC states.\n%s in state %s clashes with %s in state %s"
96256
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1117 (car crt) (cdr crt) (caar only-files-list) state)))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1118 (setq only-files-list (mapcar 'car only-files-list))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1119 (when (and state (not (eq state 'unregistered)))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1120 (setq model (vc-checkout-model vc-dir-backend only-files-list))))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1121 (list vc-dir-backend files only-files-list state model)))
a56e02fe83fc * vc-dir.el (vc-dir-marked-only-files-and-states): Rename from
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96216
diff changeset
1122
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1123 ;;;###autoload
96411
31e595cb6c02 (vc-dir): Make backend argument optional and use
Andreas Schwab <schwab@suse.de>
parents: 96390
diff changeset
1124 (defun vc-dir (dir &optional backend)
102929
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1125 "Show the VC status for \"interesting\" files in and below DIR.
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1126 This allows you to mark files and perform VC operations on them.
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1127 The list omits files which are up to date, with no changes in your copy
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1128 or the repository, if there is nothing in particular to say about them.
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1129
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1130 Preparing the list of file status takes time; when the buffer
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1131 first appears, it has only the first few lines of summary information.
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1132 The file lines appear later.
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1133
96411
31e595cb6c02 (vc-dir): Make backend argument optional and use
Andreas Schwab <schwab@suse.de>
parents: 96390
diff changeset
1134 Optional second argument BACKEND specifies the VC backend to use.
102929
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1135 Interactively, a prefix argument means to ask for the backend.
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1136
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1137 These are the commands available for use in the file status buffer:
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1138
106412
3fea95b17dfa (vc-dir): Use the correct markup for showing keymaps
Dan Nicolaescu <dann@ics.uci.edu>
parents: 105424
diff changeset
1139 \\{vc-dir-mode-map}"
102929
6be674ea734e * vc-dir.el (vc-dir): Dox fix.
Richard M. Stallman <rms@gnu.org>
parents: 102660
diff changeset
1140
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1141 (interactive
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1142 (list
97118
48b4d1b43ea2 (vc-dir): Call file-truename on the dir argument.
Sam Steingold <sds@gnu.org>
parents: 97117
diff changeset
1143 ;; When you hit C-x v d in a visited VC file,
48b4d1b43ea2 (vc-dir): Call file-truename on the dir argument.
Sam Steingold <sds@gnu.org>
parents: 97117
diff changeset
1144 ;; the *vc-dir* buffer visits the directory under its truename;
48b4d1b43ea2 (vc-dir): Call file-truename on the dir argument.
Sam Steingold <sds@gnu.org>
parents: 97117
diff changeset
1145 ;; therefore it makes sense to always do that.
48b4d1b43ea2 (vc-dir): Call file-truename on the dir argument.
Sam Steingold <sds@gnu.org>
parents: 97117
diff changeset
1146 ;; Otherwise if you do C-x v d -> C-x C-f -> C-c v d
48b4d1b43ea2 (vc-dir): Call file-truename on the dir argument.
Sam Steingold <sds@gnu.org>
parents: 97117
diff changeset
1147 ;; you may get a new *vc-dir* buffer, different from the original
48b4d1b43ea2 (vc-dir): Call file-truename on the dir argument.
Sam Steingold <sds@gnu.org>
parents: 97117
diff changeset
1148 (file-truename (read-file-name "VC status for directory: "
48b4d1b43ea2 (vc-dir): Call file-truename on the dir argument.
Sam Steingold <sds@gnu.org>
parents: 97117
diff changeset
1149 default-directory default-directory t
48b4d1b43ea2 (vc-dir): Call file-truename on the dir argument.
Sam Steingold <sds@gnu.org>
parents: 97117
diff changeset
1150 nil #'file-directory-p))
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1151 (if current-prefix-arg
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1152 (intern
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1153 (completing-read
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1154 "Use VC backend: "
96411
31e595cb6c02 (vc-dir): Make backend argument optional and use
Andreas Schwab <schwab@suse.de>
parents: 96390
diff changeset
1155 (mapcar (lambda (b) (list (symbol-name b)))
31e595cb6c02 (vc-dir): Make backend argument optional and use
Andreas Schwab <schwab@suse.de>
parents: 96390
diff changeset
1156 vc-handled-backends)
31e595cb6c02 (vc-dir): Make backend argument optional and use
Andreas Schwab <schwab@suse.de>
parents: 96390
diff changeset
1157 nil t nil nil)))))
31e595cb6c02 (vc-dir): Make backend argument optional and use
Andreas Schwab <schwab@suse.de>
parents: 96390
diff changeset
1158 (unless backend
31e595cb6c02 (vc-dir): Make backend argument optional and use
Andreas Schwab <schwab@suse.de>
parents: 96390
diff changeset
1159 (setq backend (vc-responsible-backend dir)))
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1160 (pop-to-buffer (vc-dir-prepare-status-buffer "*vc-dir*" dir backend))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1161 (if (derived-mode-p 'vc-dir-mode)
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1162 (vc-dir-refresh)
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1163 ;; FIXME: find a better way to pass the backend to `vc-dir-mode'.
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1164 (let ((use-vc-backend backend))
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1165 (vc-dir-mode))))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1166
99159
b0dce7f34dda * vc.el: Rename VC methods that were missed when vc-status was
Dan Nicolaescu <dann@ics.uci.edu>
parents: 99133
diff changeset
1167 (defun vc-default-dir-extra-headers (backend dir)
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1168 ;; Be loud by default to remind people to add code to display
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1169 ;; backend specific headers.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1170 ;; XXX: change this to return nil before the release.
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1171 (concat
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1172 (propertize "Extra : " 'face 'font-lock-type-face)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1173 (propertize "Please add backend specific headers here. It's easy!"
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1174 'face 'font-lock-warning-face)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1175
101940
dea4466580a6 * vc-dir.el (vc-dir-filename-mouse-map): Rename from vc-dir-mouse-map.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101924
diff changeset
1176 (defvar vc-dir-filename-mouse-map
101924
c1950714465b (vc-dir-find-file-other-window): Allow mouse events.
Nick Roberts <nickrob@snap.net.nz>
parents: 101718
diff changeset
1177 (let ((map (make-sparse-keymap)))
c1950714465b (vc-dir-find-file-other-window): Allow mouse events.
Nick Roberts <nickrob@snap.net.nz>
parents: 101718
diff changeset
1178 (define-key map [mouse-2] 'vc-dir-find-file-other-window)
c1950714465b (vc-dir-find-file-other-window): Allow mouse events.
Nick Roberts <nickrob@snap.net.nz>
parents: 101718
diff changeset
1179 map)
c1950714465b (vc-dir-find-file-other-window): Allow mouse events.
Nick Roberts <nickrob@snap.net.nz>
parents: 101718
diff changeset
1180 "Local keymap for visiting a file.")
c1950714465b (vc-dir-find-file-other-window): Allow mouse events.
Nick Roberts <nickrob@snap.net.nz>
parents: 101718
diff changeset
1181
99159
b0dce7f34dda * vc.el: Rename VC methods that were missed when vc-status was
Dan Nicolaescu <dann@ics.uci.edu>
parents: 99133
diff changeset
1182 (defun vc-default-dir-printer (backend fileentry)
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1183 "Pretty print FILEENTRY."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1184 ;; If you change the layout here, change vc-dir-move-to-goal-column.
101940
dea4466580a6 * vc-dir.el (vc-dir-filename-mouse-map): Rename from vc-dir-mouse-map.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101924
diff changeset
1185 ;; VC backends can implement backend specific versions of this
dea4466580a6 * vc-dir.el (vc-dir-filename-mouse-map): Rename from vc-dir-mouse-map.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101924
diff changeset
1186 ;; function. Changes here might need to be reflected in the
dea4466580a6 * vc-dir.el (vc-dir-filename-mouse-map): Rename from vc-dir-mouse-map.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101924
diff changeset
1187 ;; vc-BACKEND-dir-printer functions.
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1188 (let* ((isdir (vc-dir-fileinfo->directory fileentry))
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1189 (state (if isdir "" (vc-dir-fileinfo->state fileentry)))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1190 (filename (vc-dir-fileinfo->name fileentry)))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1191 (insert
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1192 (propertize
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1193 (format "%c" (if (vc-dir-fileinfo->marked fileentry) ?* ? ))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1194 'face 'font-lock-type-face)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1195 " "
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1196 (propertize
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1197 (format "%-20s" state)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1198 'face (cond ((eq state 'up-to-date) 'font-lock-builtin-face)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1199 ((memq state '(missing conflict)) 'font-lock-warning-face)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1200 (t 'font-lock-variable-name-face))
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1201 'mouse-face 'highlight)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1202 " "
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1203 (propertize
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1204 (format "%s" filename)
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1205 'face
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1206 (if isdir 'font-lock-comment-delimiter-face 'font-lock-function-name-face)
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1207 'help-echo
96388
7ed97437d100 * vc-dir.el (vc-dir): Complete only directory names.
Juanma Barranquero <lekktu@gmail.com>
parents: 96310
diff changeset
1208 (if isdir
7ed97437d100 * vc-dir.el (vc-dir): Complete only directory names.
Juanma Barranquero <lekktu@gmail.com>
parents: 96310
diff changeset
1209 "Directory\nVC operations can be applied to it\nmouse-3: Pop-up menu"
96216
0c3be806e711 (vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 96204
diff changeset
1210 "File\nmouse-3: Pop-up menu")
101924
c1950714465b (vc-dir-find-file-other-window): Allow mouse events.
Nick Roberts <nickrob@snap.net.nz>
parents: 101718
diff changeset
1211 'mouse-face 'highlight
101940
dea4466580a6 * vc-dir.el (vc-dir-filename-mouse-map): Rename from vc-dir-mouse-map.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 101924
diff changeset
1212 'keymap vc-dir-filename-mouse-map))))
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1213
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1214 (defun vc-default-extra-status-menu (backend)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1215 nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1216
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1217 (defun vc-default-status-fileinfo-extra (backend file)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1218 "Default absence of extra information returned for a file."
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1219 nil)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1220
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1221 (provide 'vc-dir)
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1222
96204
d4a46d5d6f08 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 96203
diff changeset
1223 ;; arch-tag: 0274a2e3-e8e9-4b1a-a73c-e8b9129d5d15
96203
30bbe1648bcf * vc.el:
Dan Nicolaescu <dann@ics.uci.edu>
parents:
diff changeset
1224 ;;; vc-dir.el ends here