Mercurial > emacs
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 |
rev | line source |
---|---|
96203 | 1 ;;; vc-dir.el --- Directory status display under VC |
2 | |
106815 | 3 ;; Copyright (C) 2007, 2008, 2009, 2010 |
96203 | 4 ;; Free Software Foundation, Inc. |
5 | |
6 ;; Author: Dan Nicolaescu <dann@ics.uci.edu> | |
7 ;; Keywords: tools | |
8 | |
9 ;; This file is part of GNU Emacs. | |
10 | |
11 ;; GNU Emacs is free software: you can redistribute it and/or modify | |
12 ;; it under the terms of the GNU General Public License as published by | |
13 ;; the Free Software Foundation, either version 3 of the License, or | |
14 ;; (at your option) any later version. | |
15 | |
16 ;; GNU Emacs is distributed in the hope that it will be useful, | |
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 ;; GNU General Public License for more details. | |
20 | |
21 ;; You should have received a copy of the GNU General Public License | |
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. | |
23 | |
24 ;;; Credits: | |
25 | |
26 ;; The original VC directory status implementation was based on dired. | |
27 ;; This implementation was inspired by PCL-CVS. | |
28 ;; Many people contributed comments, ideas and code to this | |
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 | 31 ;; Alexandre Julliard <julliard@winehq.org> |
32 ;; Stefan Monnier <monnier@iro.umontreal.ca> | |
33 ;; Tom Tromey <tromey@redhat.com> | |
34 | |
35 ;;; Commentary: | |
96388
7ed97437d100
* vc-dir.el (vc-dir): Complete only directory names.
Juanma Barranquero <lekktu@gmail.com>
parents:
96310
diff
changeset
|
36 ;; |
96203 | 37 |
38 ;;; Todo: see vc.el. | |
39 | |
40 (require 'vc-hooks) | |
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 | 43 (require 'ewoc) |
44 | |
45 ;;; Code: | |
46 (eval-when-compile | |
47 (require 'cl)) | |
48 | |
49 (defcustom vc-dir-mode-hook nil | |
50 "Normal hook run by `vc-dir-mode'. | |
51 See `run-hooks'." | |
52 :type 'hook | |
53 :group 'vc) | |
54 | |
55 ;; Used to store information for the files displayed in the directory buffer. | |
56 ;; Each item displayed corresponds to one of these defstructs. | |
57 (defstruct (vc-dir-fileinfo | |
58 (:copier nil) | |
59 (:type list) ;So we can use `member' on lists of FIs. | |
60 (:constructor | |
61 ;; We could define it as an alias for `list'. | |
62 vc-dir-create-fileinfo (name state &optional extra marked directory)) | |
63 (:conc-name vc-dir-fileinfo->)) | |
64 name ;Keep it as first, for `member'. | |
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 | 67 extra |
68 marked | |
69 ;; To keep track of not updated files during a global refresh | |
70 needs-update | |
71 ;; To distinguish files and directories. | |
72 directory) | |
73 | |
96216
0c3be806e711
(vc-client-object): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
96204
diff
changeset
|
74 (defvar vc-ewoc nil) |
96203 | 75 |
76 (defvar vc-dir-process-buffer nil | |
77 "The buffer used for the asynchronous call that computes status.") | |
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 | 82 (defun vc-dir-move-to-goal-column () |
83 ;; Used to keep the cursor on the file name column. | |
84 (beginning-of-line) | |
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 | 87 (forward-char 25))) |
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 | 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 | 102 (or buf |
103 ;; Create a new buffer named BNAME. | |
106759 | 104 ;; We pass a filename to create-file-buffer because it is what |
105 ;; the function expects, and also what uniquify needs (if active) | |
106 (with-current-buffer (create-file-buffer (expand-file-name bname dir)) | |
96203 | 107 (cd dir) |
108 (vc-setup-buffer (current-buffer)) | |
109 ;; Reset the vc-parent-buffer-name so that it does not appear | |
110 ;; in the mode-line. | |
111 (setq vc-parent-buffer-name nil) | |
112 (current-buffer))))) | |
113 | |
114 (defvar vc-dir-menu-map | |
115 (let ((map (make-sparse-keymap "VC-dir"))) | |
116 (define-key map [quit] | |
117 '(menu-item "Quit" quit-window | |
118 :help "Quit")) | |
119 (define-key map [kill] | |
120 '(menu-item "Kill Update Command" vc-dir-kill-dir-status-process | |
121 :enable (vc-dir-busy) | |
122 :help "Kill the command that updates the directory buffer")) | |
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 | 125 :enable (not (vc-dir-busy)) |
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 | 130 ;; Movement. |
131 (define-key map [sepmv] '("--")) | |
132 (define-key map [next-line] | |
133 '(menu-item "Next line" vc-dir-next-line | |
134 :help "Go to the next line" :keys "n")) | |
135 (define-key map [previous-line] | |
136 '(menu-item "Previous line" vc-dir-previous-line | |
137 :help "Go to the previous line")) | |
138 ;; Marking. | |
139 (define-key map [sepmrk] '("--")) | |
140 (define-key map [unmark-all] | |
141 '(menu-item "Unmark All" vc-dir-unmark-all-files | |
142 :help "Unmark all files that are in the same state as the current file\ | |
143 \nWith prefix argument unmark all files")) | |
144 (define-key map [unmark-previous] | |
145 '(menu-item "Unmark previous " vc-dir-unmark-file-up | |
146 :help "Move to the previous line and unmark the file")) | |
147 | |
148 (define-key map [mark-all] | |
149 '(menu-item "Mark All" vc-dir-mark-all-files | |
150 :help "Mark all files that are in the same state as the current file\ | |
151 \nWith prefix argument mark all files")) | |
152 (define-key map [unmark] | |
153 '(menu-item "Unmark" vc-dir-unmark | |
154 :help "Unmark the current file or all files in the region")) | |
155 | |
156 (define-key map [mark] | |
157 '(menu-item "Mark" vc-dir-mark | |
158 :help "Mark the current file or all files in the region")) | |
159 | |
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 | 173 (define-key map [open-other] |
174 '(menu-item "Open in other window" vc-dir-find-file-other-window | |
175 :help "Find the file on the current line, in another window")) | |
176 (define-key map [open] | |
177 '(menu-item "Open file" vc-dir-find-file | |
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 | 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 | 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 | 215 (defun vc-dir-menu-map-filter (orig-binding) |
216 (when (and (symbolp orig-binding) (fboundp orig-binding)) | |
217 (setq orig-binding (indirect-function orig-binding))) | |
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 | 221 (if (null ext-binding) |
222 orig-binding | |
223 (append orig-binding | |
224 '("----") | |
225 ext-binding)))) | |
226 | |
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 | 236 ;;(define-key map "R" 'vc-revert) ;; u is taken by vc-dir-unmark. |
237 ;;(define-key map "A" 'vc-annotate) ;; g is taken by revert-buffer | |
238 ;; bound by `special-mode'. | |
96203 | 239 ;; Marking. |
240 (define-key map "m" 'vc-dir-mark) | |
241 (define-key map "M" 'vc-dir-mark-all-files) | |
242 (define-key map "u" 'vc-dir-unmark) | |
243 (define-key map "U" 'vc-dir-unmark-all-files) | |
244 (define-key map "\C-?" 'vc-dir-unmark-file-up) | |
245 (define-key map "\M-\C-?" 'vc-dir-unmark-all-files) | |
246 ;; Movement. | |
247 (define-key map "n" 'vc-dir-next-line) | |
248 (define-key map " " 'vc-dir-next-line) | |
249 (define-key map "\t" 'vc-dir-next-directory) | |
250 (define-key map "p" 'vc-dir-previous-line) | |
251 (define-key map [backtab] 'vc-dir-previous-directory) | |
252 ;;; Rebind paragraph-movement commands. | |
253 (define-key map "\M-}" 'vc-dir-next-directory) | |
254 (define-key map "\M-{" 'vc-dir-previous-directory) | |
255 (define-key map [C-down] 'vc-dir-next-directory) | |
256 (define-key map [C-up] 'vc-dir-previous-directory) | |
257 ;; The remainder. | |
258 (define-key map "f" 'vc-dir-find-file) | |
259 (define-key map "\C-m" 'vc-dir-find-file) | |
260 (define-key map "o" 'vc-dir-find-file-other-window) | |
261 (define-key map "\C-c\C-c" 'vc-dir-kill-dir-status-process) | |
262 (define-key map [down-mouse-3] 'vc-dir-menu) | |
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 | 270 |
271 ;; Hook up the menu. | |
272 (define-key map [menu-bar vc-dir-mode] | |
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 | 276 "VC-dir" ,vc-dir-menu-map :filter vc-dir-menu-map-filter)) |
277 map) | |
278 "Keymap for directory buffer.") | |
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 | 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 | 291 |
292 (defun vc-dir-menu (e) | |
97210 | 293 "Popup the VC dir menu." |
96203 | 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 | 296 |
297 (defvar vc-dir-tool-bar-map | |
298 (let ((map (make-sparse-keymap))) | |
299 (tool-bar-local-item-from-menu 'vc-dir-find-file "open" | |
300 map vc-dir-mode-map) | |
301 (tool-bar-local-item "bookmark_add" | |
302 'vc-dir-toggle-mark 'vc-dir-toggle-mark map | |
303 :help "Toggle mark on current item") | |
304 (tool-bar-local-item-from-menu 'vc-dir-previous-line "left-arrow" | |
305 map vc-dir-mode-map | |
306 :rtl "right-arrow") | |
307 (tool-bar-local-item-from-menu 'vc-dir-next-line "right-arrow" | |
308 map vc-dir-mode-map | |
309 :rtl "left-arrow") | |
310 (tool-bar-local-item-from-menu 'vc-print-log "info" | |
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 | 313 map vc-dir-mode-map) |
314 (tool-bar-local-item-from-menu 'nonincremental-search-forward | |
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 | 318 (tool-bar-local-item-from-menu 'vc-dir-kill-dir-status-process "cancel" |
319 map vc-dir-mode-map) | |
320 (tool-bar-local-item-from-menu 'quit-window "exit" | |
321 map vc-dir-mode-map) | |
322 map)) | |
323 | |
324 (defun vc-dir-node-directory (node) | |
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 | 327 (let ((data (ewoc-data node))) |
328 (or (vc-dir-fileinfo->directory data) | |
329 ;; Otherwise compute it from the file name. | |
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 | 334 |
335 (defun vc-dir-update (entries buffer &optional noinsert) | |
336 "Update BUFFER's ewoc from the list of ENTRIES. | |
337 If NOINSERT, ignore elements on ENTRIES which are not in the ewoc." | |
338 ;; Add ENTRIES to the vc-dir buffer BUFFER. | |
339 (with-current-buffer buffer | |
340 ;; Insert the entries sorted by name into the ewoc. | |
341 ;; We assume the ewoc is sorted too, which should be the | |
342 ;; case if we always add entries with vc-dir-update. | |
343 (setq entries | |
344 ;; Sort: first files and then subdirectories. | |
345 ;; XXX: this is VERY inefficient, it computes the directory | |
346 ;; names too many times | |
347 (sort entries | |
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 | 353 (cond |
354 ((string< dir1 dir2) t) | |
355 ((not (string= dir1 dir2)) nil) | |
356 ((string< (car entry1) (car entry2)))))))) | |
357 ;; Insert directory entries in the right places. | |
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 | 361 ;; Insert . if it is not present. |
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 | 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 | 368 (while (and entry node) |
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 | 372 (nodedir (vc-dir-node-directory node))) |
373 (cond | |
374 ;; First try to find the directory. | |
375 ((string-lessp nodedir entrydir) | |
376 (setq node (ewoc-next vc-ewoc node))) | |
377 ((string-equal nodedir entrydir) | |
378 ;; Found the directory, find the place for the file name. | |
379 (let ((nodefile (vc-dir-fileinfo->name (ewoc-data node)))) | |
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 | 383 ((string-lessp nodefile entryfile) |
384 (setq node (ewoc-next vc-ewoc node))) | |
385 ((string-equal nodefile entryfile) | |
386 (setf (vc-dir-fileinfo->state (ewoc-data node)) (nth 1 entry)) | |
387 (setf (vc-dir-fileinfo->extra (ewoc-data node)) (nth 2 entry)) | |
388 (setf (vc-dir-fileinfo->needs-update (ewoc-data node)) nil) | |
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 | 391 (setq entry (car entries)) |
392 (setq node (ewoc-next vc-ewoc node))) | |
393 (t | |
394 (ewoc-enter-before vc-ewoc node | |
395 (apply 'vc-dir-create-fileinfo entry)) | |
396 (setq entries (cdr entries)) | |
397 (setq entry (car entries)))))) | |
398 (t | |
399 ;; We might need to insert a directory node if the | |
400 ;; previous node was in a different directory. | |
401 (let* ((rd (file-relative-name entrydir)) | |
402 (prev-node (ewoc-prev vc-ewoc node)) | |
403 (prev-dir (vc-dir-node-directory prev-node))) | |
404 (unless (string-equal entrydir prev-dir) | |
405 (ewoc-enter-before | |
406 vc-ewoc node (vc-dir-create-fileinfo rd nil nil nil entrydir)))) | |
407 ;; Now insert the node itself. | |
408 (ewoc-enter-before vc-ewoc node | |
409 (apply 'vc-dir-create-fileinfo entry)) | |
410 (setq entries (cdr entries) entry (car entries)))))) | |
411 ;; We're past the last node, all remaining entries go to the end. | |
412 (unless (or node noinsert) | |
413 (let ((lastdir (vc-dir-node-directory (ewoc-nth vc-ewoc -1)))) | |
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 | 417 ;; Insert a directory node if needed. |
418 (unless (string-equal lastdir entrydir) | |
419 (setq lastdir entrydir) | |
420 (let ((rd (file-relative-name entrydir))) | |
421 (ewoc-enter-last | |
422 vc-ewoc (vc-dir-create-fileinfo rd nil nil nil entrydir)))) | |
423 ;; Now insert the node itself. | |
424 (ewoc-enter-last vc-ewoc | |
425 (apply 'vc-dir-create-fileinfo entry))))))))) | |
426 | |
427 (defun vc-dir-busy () | |
428 (and (buffer-live-p vc-dir-process-buffer) | |
429 (get-buffer-process vc-dir-process-buffer))) | |
430 | |
431 (defun vc-dir-kill-dir-status-process () | |
432 "Kill the temporary buffer and associated process." | |
433 (interactive) | |
434 (when (buffer-live-p vc-dir-process-buffer) | |
435 (let ((proc (get-buffer-process vc-dir-process-buffer))) | |
436 (when proc (delete-process proc)) | |
437 (setq vc-dir-process-buffer nil) | |
438 (setq mode-line-process nil)))) | |
439 | |
440 (defun vc-dir-kill-query () | |
441 ;; Make sure that when the status buffer is killed the update | |
442 ;; process running in background is also killed. | |
443 (if (vc-dir-busy) | |
444 (when (y-or-n-p "Status update process running, really kill status buffer? ") | |
445 (vc-dir-kill-dir-status-process) | |
446 t) | |
447 t)) | |
448 | |
449 (defun vc-dir-next-line (arg) | |
450 "Go to the next line. | |
451 If a prefix argument is given, move by that many lines." | |
452 (interactive "p") | |
453 (with-no-warnings | |
454 (ewoc-goto-next vc-ewoc arg) | |
455 (vc-dir-move-to-goal-column))) | |
456 | |
457 (defun vc-dir-previous-line (arg) | |
458 "Go to the previous line. | |
459 If a prefix argument is given, move by that many lines." | |
460 (interactive "p") | |
461 (ewoc-goto-prev vc-ewoc arg) | |
462 (vc-dir-move-to-goal-column)) | |
463 | |
464 (defun vc-dir-next-directory () | |
465 "Go to the next directory." | |
466 (interactive) | |
467 (let ((orig (point))) | |
468 (if | |
469 (catch 'foundit | |
470 (while t | |
471 (let* ((next (ewoc-next vc-ewoc (ewoc-locate vc-ewoc)))) | |
472 (cond ((not next) | |
473 (throw 'foundit t)) | |
474 (t | |
475 (progn | |
476 (ewoc-goto-node vc-ewoc next) | |
477 (vc-dir-move-to-goal-column) | |
478 (if (vc-dir-fileinfo->directory (ewoc-data next)) | |
479 (throw 'foundit nil)))))))) | |
480 (goto-char orig)))) | |
481 | |
482 (defun vc-dir-previous-directory () | |
483 "Go to the previous directory." | |
484 (interactive) | |
485 (let ((orig (point))) | |
486 (if | |
487 (catch 'foundit | |
488 (while t | |
489 (let* ((prev (ewoc-prev vc-ewoc (ewoc-locate vc-ewoc)))) | |
490 (cond ((not prev) | |
491 (throw 'foundit t)) | |
492 (t | |
493 (progn | |
494 (ewoc-goto-node vc-ewoc prev) | |
495 (vc-dir-move-to-goal-column) | |
496 (if (vc-dir-fileinfo->directory (ewoc-data prev)) | |
497 (throw 'foundit nil)))))))) | |
498 (goto-char orig)))) | |
499 | |
500 (defun vc-dir-mark-unmark (mark-unmark-function) | |
501 (if (use-region-p) | |
502 (let ((firstl (line-number-at-pos (region-beginning))) | |
503 (lastl (line-number-at-pos (region-end)))) | |
504 (save-excursion | |
505 (goto-char (region-beginning)) | |
506 (while (<= (line-number-at-pos) lastl) | |
507 (funcall mark-unmark-function)))) | |
508 (funcall mark-unmark-function))) | |
509 | |
510 (defun vc-dir-parent-marked-p (arg) | |
511 ;; Return nil if none of the parent directories of arg is marked. | |
512 (let* ((argdir (vc-dir-node-directory arg)) | |
513 (arglen (length argdir)) | |
514 (crt arg) | |
515 data dir) | |
516 ;; Go through the predecessors, checking if any directory that is | |
517 ;; a parent is marked. | |
518 (while (setq crt (ewoc-prev vc-ewoc crt)) | |
519 (setq data (ewoc-data crt)) | |
520 (setq dir (vc-dir-node-directory crt)) | |
521 (when (and (vc-dir-fileinfo->directory data) | |
522 (vc-string-prefix-p dir argdir)) | |
523 (when (vc-dir-fileinfo->marked data) | |
524 (error "Cannot mark `%s', parent directory `%s' marked" | |
525 (vc-dir-fileinfo->name (ewoc-data arg)) | |
526 (vc-dir-fileinfo->name data))))) | |
527 nil)) | |
528 | |
529 (defun vc-dir-children-marked-p (arg) | |
530 ;; Return nil if none of the children of arg is marked. | |
531 (let* ((argdir-re (concat "\\`" (regexp-quote (vc-dir-node-directory arg)))) | |
532 (is-child t) | |
533 (crt arg) | |
534 data dir) | |
535 (while (and is-child (setq crt (ewoc-next vc-ewoc crt))) | |
536 (setq data (ewoc-data crt)) | |
537 (setq dir (vc-dir-node-directory crt)) | |
538 (if (string-match argdir-re dir) | |
539 (when (vc-dir-fileinfo->marked data) | |
540 (error "Cannot mark `%s', child `%s' marked" | |
541 (vc-dir-fileinfo->name (ewoc-data arg)) | |
542 (vc-dir-fileinfo->name data))) | |
543 ;; We are done, we got to an entry that is not a child of `arg'. | |
544 (setq is-child nil))) | |
545 nil)) | |
546 | |
547 (defun vc-dir-mark-file (&optional arg) | |
548 ;; Mark ARG or the current file and move to the next line. | |
549 (let* ((crt (or arg (ewoc-locate vc-ewoc))) | |
550 (file (ewoc-data crt)) | |
551 (isdir (vc-dir-fileinfo->directory file))) | |
552 (when (or (and isdir (not (vc-dir-children-marked-p crt))) | |
553 (and (not isdir) (not (vc-dir-parent-marked-p crt)))) | |
554 (setf (vc-dir-fileinfo->marked file) t) | |
555 (ewoc-invalidate vc-ewoc crt) | |
556 (unless (or arg (mouse-event-p last-command-event)) | |
557 (vc-dir-next-line 1))))) | |
558 | |
559 (defun vc-dir-mark () | |
560 "Mark the current file or all files in the region. | |
561 If the region is active, mark all the files in the region. | |
562 Otherwise mark the file on the current line and move to the next | |
563 line." | |
564 (interactive) | |
565 (vc-dir-mark-unmark 'vc-dir-mark-file)) | |
566 | |
567 (defun vc-dir-mark-all-files (arg) | |
568 "Mark all files with the same state as the current one. | |
569 With a prefix argument mark all files. | |
570 If the current entry is a directory, mark all child files. | |
571 | |
572 The commands operate on files that are on the same state. | |
573 This command is intended to make it easy to select all files that | |
574 share the same state." | |
575 (interactive "P") | |
576 (if arg | |
577 ;; Mark all files. | |
578 (progn | |
579 ;; First check that no directory is marked, we can't mark | |
580 ;; files in that case. | |
581 (ewoc-map | |
582 (lambda (filearg) | |
583 (when (and (vc-dir-fileinfo->directory filearg) | |
584 (vc-dir-fileinfo->marked filearg)) | |
585 (error "Cannot mark all files, directory `%s' marked" | |
586 (vc-dir-fileinfo->name filearg)))) | |
587 vc-ewoc) | |
588 (ewoc-map | |
589 (lambda (filearg) | |
590 (unless (vc-dir-fileinfo->marked filearg) | |
591 (setf (vc-dir-fileinfo->marked filearg) t) | |
592 t)) | |
593 vc-ewoc)) | |
594 (let ((data (ewoc-data (ewoc-locate vc-ewoc)))) | |
595 (if (vc-dir-fileinfo->directory data) | |
596 ;; It's a directory, mark child files. | |
597 (let ((crt (ewoc-locate vc-ewoc))) | |
598 (unless (vc-dir-children-marked-p crt) | |
599 (while (setq crt (ewoc-next vc-ewoc crt)) | |
600 (let ((crt-data (ewoc-data crt))) | |
601 (unless (vc-dir-fileinfo->directory crt-data) | |
602 (setf (vc-dir-fileinfo->marked crt-data) t) | |
603 (ewoc-invalidate vc-ewoc crt)))))) | |
604 ;; It's a file | |
605 (let ((state (vc-dir-fileinfo->state data)) | |
606 (crt (ewoc-nth vc-ewoc 0))) | |
607 (while crt | |
608 (let ((crt-data (ewoc-data crt))) | |
609 (when (and (not (vc-dir-fileinfo->marked crt-data)) | |
610 (eq (vc-dir-fileinfo->state crt-data) state) | |
611 (not (vc-dir-fileinfo->directory crt-data))) | |
612 (vc-dir-mark-file crt))) | |
613 (setq crt (ewoc-next vc-ewoc crt)))))))) | |
614 | |
615 (defun vc-dir-unmark-file () | |
616 ;; Unmark the current file and move to the next line. | |
617 (let* ((crt (ewoc-locate vc-ewoc)) | |
618 (file (ewoc-data crt))) | |
619 (setf (vc-dir-fileinfo->marked file) nil) | |
620 (ewoc-invalidate vc-ewoc crt) | |
621 (unless (mouse-event-p last-command-event) | |
622 (vc-dir-next-line 1)))) | |
623 | |
624 (defun vc-dir-unmark () | |
625 "Unmark the current file or all files in the region. | |
626 If the region is active, unmark all the files in the region. | |
627 Otherwise mark the file on the current line and move to the next | |
628 line." | |
629 (interactive) | |
630 (vc-dir-mark-unmark 'vc-dir-unmark-file)) | |
631 | |
632 (defun vc-dir-unmark-file-up () | |
633 "Move to the previous line and unmark the file." | |
634 (interactive) | |
635 ;; If we're on the first line, we won't move up, but we will still | |
636 ;; remove the mark. This seems a bit odd but it is what buffer-menu | |
637 ;; does. | |
638 (let* ((prev (ewoc-goto-prev vc-ewoc 1)) | |
639 (file (ewoc-data prev))) | |
640 (setf (vc-dir-fileinfo->marked file) nil) | |
641 (ewoc-invalidate vc-ewoc prev) | |
642 (vc-dir-move-to-goal-column))) | |
643 | |
644 (defun vc-dir-unmark-all-files (arg) | |
645 "Unmark all files with the same state as the current one. | |
646 With a prefix argument unmark all files. | |
647 If the current entry is a directory, unmark all the child files. | |
648 | |
649 The commands operate on files that are on the same state. | |
650 This command is intended to make it easy to deselect all files | |
651 that share the same state." | |
652 (interactive "P") | |
653 (if arg | |
654 (ewoc-map | |
655 (lambda (filearg) | |
656 (when (vc-dir-fileinfo->marked filearg) | |
657 (setf (vc-dir-fileinfo->marked filearg) nil) | |
658 t)) | |
659 vc-ewoc) | |
660 (let* ((crt (ewoc-locate vc-ewoc)) | |
661 (data (ewoc-data crt))) | |
662 (if (vc-dir-fileinfo->directory data) | |
663 ;; It's a directory, unmark child files. | |
664 (while (setq crt (ewoc-next vc-ewoc crt)) | |
665 (let ((crt-data (ewoc-data crt))) | |
666 (unless (vc-dir-fileinfo->directory crt-data) | |
667 (setf (vc-dir-fileinfo->marked crt-data) nil) | |
668 (ewoc-invalidate vc-ewoc crt)))) | |
669 ;; It's a file | |
670 (let ((crt-state (vc-dir-fileinfo->state (ewoc-data crt)))) | |
671 (ewoc-map | |
672 (lambda (filearg) | |
673 (when (and (vc-dir-fileinfo->marked filearg) | |
674 (eq (vc-dir-fileinfo->state filearg) crt-state)) | |
675 (setf (vc-dir-fileinfo->marked filearg) nil) | |
676 t)) | |
677 vc-ewoc)))))) | |
678 | |
679 (defun vc-dir-toggle-mark-file () | |
680 (let* ((crt (ewoc-locate vc-ewoc)) | |
681 (file (ewoc-data crt))) | |
682 (if (vc-dir-fileinfo->marked file) | |
683 (vc-dir-unmark-file) | |
684 (vc-dir-mark-file)))) | |
685 | |
686 (defun vc-dir-toggle-mark (e) | |
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 | 689 |
690 (defun vc-dir-delete-file () | |
691 "Delete the marked files, or the current file if no marks." | |
692 (interactive) | |
693 (mapc 'vc-delete-file (or (vc-dir-marked-files) | |
694 (list (vc-dir-current-file))))) | |
695 | |
696 (defun vc-dir-find-file () | |
697 "Find the file on the current line." | |
698 (interactive) | |
699 (find-file (vc-dir-current-file))) | |
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 | 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 | 705 (find-file-other-window (vc-dir-current-file))) |
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 | 750 (defun vc-dir-current-file () |
751 (let ((node (ewoc-locate vc-ewoc))) | |
752 (unless node | |
753 (error "No file available")) | |
754 (expand-file-name (vc-dir-fileinfo->name (ewoc-data node))))) | |
755 | |
756 (defun vc-dir-marked-files () | |
757 "Return the list of marked files." | |
758 (mapcar | |
759 (lambda (elem) (expand-file-name (vc-dir-fileinfo->name elem))) | |
760 (ewoc-collect vc-ewoc 'vc-dir-fileinfo->marked))) | |
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 | 766 (let ((crt (ewoc-nth vc-ewoc 0)) |
767 result) | |
768 (while crt | |
769 (let ((crt-data (ewoc-data crt))) | |
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 | 772 (if (vc-dir-fileinfo->directory crt-data) |
773 (let* ((dir (vc-dir-fileinfo->directory crt-data)) | |
774 (dirlen (length dir)) | |
775 data) | |
776 (while | |
777 (and (setq crt (ewoc-next vc-ewoc crt)) | |
778 (vc-string-prefix-p dir | |
779 (progn | |
780 (setq data (ewoc-data crt)) | |
781 (vc-dir-node-directory crt)))) | |
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 | 790 (setq crt (ewoc-next vc-ewoc crt))) |
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 | 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 | 797 (let* ((crt (ewoc-locate vc-ewoc)) |
798 (crt-data (ewoc-data crt)) | |
799 result) | |
800 (if (vc-dir-fileinfo->directory crt-data) | |
801 (let* ((dir (vc-dir-fileinfo->directory crt-data)) | |
802 (dirlen (length dir)) | |
803 data) | |
804 (while | |
805 (and (setq crt (ewoc-next vc-ewoc crt)) | |
806 (vc-string-prefix-p dir (progn | |
807 (setq data (ewoc-data crt)) | |
808 (vc-dir-node-directory crt)))) | |
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 | 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 | 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 | 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 | 891 "Major mode for VC directory buffers. |
96203 | 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 | 895 Restrictions: - a file cannot be marked if any parent directory is marked |
896 - a directory cannot be marked if any child file or | |
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 | 900 M - if the cursor is on a file: mark all the files with the same state as |
901 the current file | |
902 - if the cursor is on a directory: mark all child files | |
903 - with a prefix argument: mark all files | |
904 U - if the cursor is on a file: unmark all the files with the same state | |
905 as the current file | |
906 - if the cursor is on a directory: unmark all child files | |
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 | 909 |
97210 | 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 | 914 |
915 Search & Replace | |
916 S - searches the marked files | |
917 Q - does a query replace on the marked files | |
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 | 920 If nothing is marked, these commands act on the current entry. |
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 | 924 |
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 | 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 | 930 (let ((buffer-read-only nil)) |
931 (erase-buffer) | |
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 | 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 | 938 ;; Make sure that if the directory buffer is killed, the update |
939 ;; process running in the background is also killed. | |
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 | 943 |
944 (defun vc-dir-headers (backend dir) | |
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 | 947 specific headers." |
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 | 950 (propertize "VC backend : " 'face 'font-lock-type-face) |
951 (propertize (format "%s\n" backend) 'face 'font-lock-variable-name-face) | |
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 | 958 |
959 (defun vc-dir-refresh-files (files default-state) | |
960 "Refresh some files in the *VC-dir* buffer." | |
961 (let ((def-dir default-directory) | |
962 (backend vc-dir-backend)) | |
963 (vc-set-mode-line-busy-indicator) | |
964 ;; Call the `dir-status-file' backend function. | |
965 ;; `dir-status-file' is supposed to be asynchronous. | |
966 ;; It should compute the results, and then call the function | |
967 ;; passed as an argument in order to update the vc-dir buffer | |
968 ;; with the results. | |
969 (unless (buffer-live-p vc-dir-process-buffer) | |
970 (setq vc-dir-process-buffer | |
971 (generate-new-buffer (format " *VC-%s* tmp status" backend)))) | |
972 (lexical-let ((buffer (current-buffer))) | |
973 (with-current-buffer vc-dir-process-buffer | |
974 (cd def-dir) | |
975 (erase-buffer) | |
976 (vc-call-backend | |
977 backend 'dir-status-files def-dir files default-state | |
978 (lambda (entries &optional more-to-come) | |
979 ;; ENTRIES is a list of (FILE VC_STATE EXTRA) items. | |
980 ;; If MORE-TO-COME is true, then more updates will come from | |
981 ;; the asynchronous process. | |
982 (with-current-buffer buffer | |
983 (vc-dir-update entries buffer) | |
984 (unless more-to-come | |
985 (setq mode-line-process nil) | |
986 ;; Remove the ones that haven't been updated at all. | |
987 ;; Those not-updated are those whose state is nil because the | |
988 ;; file/dir doesn't exist and isn't versioned. | |
989 (ewoc-filter vc-ewoc | |
990 (lambda (info) | |
991 ;; The state for directory entries might | |
992 ;; have been changed to 'up-to-date, | |
993 ;; reset it, othewise it will be removed when doing 'x' | |
994 ;; next time. | |
995 ;; FIXME: There should be a more elegant way to do this. | |
996 (when (and (vc-dir-fileinfo->directory info) | |
997 (eq (vc-dir-fileinfo->state info) | |
998 'up-to-date)) | |
999 (setf (vc-dir-fileinfo->state info) nil)) | |
1000 | |
1001 (not (vc-dir-fileinfo->needs-update info)))))))))))) | |
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 | 1006 (defun vc-dir-refresh () |
1007 "Refresh the contents of the *VC-dir* buffer. | |
1008 Throw an error if another update process is in progress." | |
1009 (interactive) | |
1010 (if (vc-dir-busy) | |
1011 (error "Another update process is in progress, cannot run two at a time") | |
1012 (let ((def-dir default-directory) | |
1013 (backend vc-dir-backend)) | |
1014 (vc-set-mode-line-busy-indicator) | |
1015 ;; Call the `dir-status' backend function. | |
1016 ;; `dir-status' is supposed to be asynchronous. | |
1017 ;; It should compute the results, and then call the function | |
1018 ;; passed as an argument in order to update the vc-dir buffer | |
1019 ;; with the results. | |
1020 | |
1021 ;; Create a buffer that can be used by `dir-status' and call | |
1022 ;; `dir-status' with this buffer as the current buffer. Use | |
1023 ;; `vc-dir-process-buffer' to remember this buffer, so that | |
1024 ;; it can be used later to kill the update process in case it | |
1025 ;; takes too long. | |
1026 (unless (buffer-live-p vc-dir-process-buffer) | |
1027 (setq vc-dir-process-buffer | |
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 | 1033 vc-ewoc) |
1034 (lexical-let ((buffer (current-buffer))) | |
1035 (with-current-buffer vc-dir-process-buffer | |
1036 (cd def-dir) | |
1037 (erase-buffer) | |
1038 (vc-call-backend | |
1039 backend 'dir-status def-dir | |
1040 (lambda (entries &optional more-to-come) | |
1041 ;; ENTRIES is a list of (FILE VC_STATE EXTRA) items. | |
1042 ;; If MORE-TO-COME is true, then more updates will come from | |
1043 ;; the asynchronous process. | |
1044 (with-current-buffer buffer | |
1045 (vc-dir-update entries buffer) | |
1046 (unless more-to-come | |
1047 (let ((remaining | |
1048 (ewoc-collect | |
1049 vc-ewoc 'vc-dir-fileinfo->needs-update))) | |
1050 (if remaining | |
1051 (vc-dir-refresh-files | |
1052 (mapcar 'vc-dir-fileinfo->name remaining) | |
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 | 1056 |
1057 (defun vc-dir-show-fileentry (file) | |
1058 "Insert an entry for a specific file into the current *VC-dir* listing. | |
1059 This is typically used if the file is up-to-date (or has been added | |
1060 outside of VC) and one wants to do some operation on it." | |
1061 (interactive "fShow file: ") | |
1062 (vc-dir-update (list (list (file-relative-name file) (vc-state file))) (current-buffer))) | |
1063 | |
1064 (defun vc-dir-hide-up-to-date () | |
1065 "Hide up-to-date items from display." | |
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 | 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 | 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 | 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 | 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 | 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 | 1168 ;; Be loud by default to remind people to add code to display |
1169 ;; backend specific headers. | |
1170 ;; XXX: change this to return nil before the release. | |
1171 (concat | |
1172 (propertize "Extra : " 'face 'font-lock-type-face) | |
1173 (propertize "Please add backend specific headers here. It's easy!" | |
1174 'face 'font-lock-warning-face))) | |
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 | 1183 "Pretty print FILEENTRY." |
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 | 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 | 1190 (filename (vc-dir-fileinfo->name fileentry))) |
1191 (insert | |
1192 (propertize | |
1193 (format "%c" (if (vc-dir-fileinfo->marked fileentry) ?* ? )) | |
1194 'face 'font-lock-type-face) | |
1195 " " | |
1196 (propertize | |
1197 (format "%-20s" state) | |
1198 'face (cond ((eq state 'up-to-date) 'font-lock-builtin-face) | |
1199 ((memq state '(missing conflict)) 'font-lock-warning-face) | |
1200 (t 'font-lock-variable-name-face)) | |
1201 'mouse-face 'highlight) | |
1202 " " | |
1203 (propertize | |
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 | 1213 |
1214 (defun vc-default-extra-status-menu (backend) | |
1215 nil) | |
1216 | |
1217 (defun vc-default-status-fileinfo-extra (backend file) | |
1218 "Default absence of extra information returned for a file." | |
1219 nil) | |
1220 | |
1221 (provide 'vc-dir) | |
1222 | |
96204 | 1223 ;; arch-tag: 0274a2e3-e8e9-4b1a-a73c-e8b9129d5d15 |
96203 | 1224 ;;; vc-dir.el ends here |