1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

VC: New support for other working trees

* lisp/vc/vc-git.el (vc-git--read-start-point): New function,
factored out of vc-git-create-tag.
(vc-git-create-tag): Use it.
(vc-git--worktrees, vc-git-known-other-working-trees)
(vc-git-add-working-tree, vc-git-delete-working-tree)
(vc-git-move-working-tree):
* lisp/vc/vc-hg.el (vc-hg-known-other-working-trees)
(vc-hg-add-working-tree, vc-hg--shared-p)
(vc-hg-delete-working-tree, vc-hg-move-working-tree): New
functions.
* lisp/vc/vc.el: Define API for known-other-working-tree,
add-working-tree, delete-working-tree and move-working-tree
backend functions.
(vc-dir-status-files): New function.
(project-current-directory-override): Declare.
(dired-rename-subdir): Autoload.
(vc-add-working-tree, vc-switch-working-tree)
(vc-delete-working-tree, vc-move-working-tree): New commands.
* lisp/vc/vc-hooks.el (vc-prefix-map): Bind them under C-x v.

* doc/emacs/vc1-xtra.texi (Other Working Trees): New node.
* etc/NEWS: Announce the new commands.

* test/lisp/vc/vc-tests/vc-tests.el
(vc-test--other-working-trees): New function.
(vc-test-git07-other-working-trees)
(vc-test-hg07-other-working-trees): New tests.

* lisp/ldefs-boot.el: Regenerate.
This commit is contained in:
Sean Whitton 2025-07-25 19:34:04 +01:00
parent 08ca6caa0a
commit 50ffb29d0b
10 changed files with 637 additions and 147 deletions

View file

@ -868,6 +868,7 @@ Miscellaneous Commands and Features of VC
* Change Logs and VC:: Generating a change log file from log entries. * Change Logs and VC:: Generating a change log file from log entries.
* VC Delete/Rename:: Deleting and renaming version-controlled files. * VC Delete/Rename:: Deleting and renaming version-controlled files.
* Revision Tags:: Symbolic names for revisions. * Revision Tags:: Symbolic names for revisions.
* Other Working Trees:: Multiple sets of workfiles.
* Version Headers:: Inserting version control headers into working files. * Version Headers:: Inserting version control headers into working files.
* Editing VC Commands:: Editing the VC shell commands that Emacs will run. * Editing VC Commands:: Editing the VC shell commands that Emacs will run.
* Preparing Patches:: Preparing and composing patches from within VC. * Preparing Patches:: Preparing and composing patches from within VC.

View file

@ -14,6 +14,7 @@
* Change Logs and VC:: Generating a change log file from log entries. * Change Logs and VC:: Generating a change log file from log entries.
* VC Delete/Rename:: Deleting and renaming version-controlled files. * VC Delete/Rename:: Deleting and renaming version-controlled files.
* Revision Tags:: Symbolic names for revisions. * Revision Tags:: Symbolic names for revisions.
* Other Working Trees:: Multiple sets of workfiles.
* Version Headers:: Inserting version control headers into working files. * Version Headers:: Inserting version control headers into working files.
* Editing VC Commands:: Editing the VC shell commands that Emacs will run. * Editing VC Commands:: Editing the VC shell commands that Emacs will run.
* Preparing Patches:: Preparing and composing patches from within VC. * Preparing Patches:: Preparing and composing patches from within VC.
@ -226,6 +227,70 @@ an old tag, the renamed file is retrieved under its new name, which is
not the name that the makefile expects. So the program won't really not the name that the makefile expects. So the program won't really
work as retrieved. work as retrieved.
@node Other Working Trees
@subsubsection Multiple Working Trees for One Repository
@cindex other working trees
@cindex multiple working trees
Some VCS support more than one working tree with the same backing
repository or revisions store. This means that you can have different
revisions or branches (@pxref{Branches}) checked out simultaneously, in
different working trees, but with all revision history, branches, tags
and other metadata shared. The following commands let you switch
between and modify different working trees.
@table @kbd
@item C-x v w c
Add a new working tree.
@item C-x v w w
Visit this file in another working tree.
@item C-x v w x
Delete a working tree you no longer need.
@item C-x v w R
Relocate a working tree to another file name.
@end table
@kindex C-x v w c
@findex vc-add-working-tree
You can start using multiple working trees by using the command
@w{@kbd{C-x v w c}} (@code{vc-add-working-tree}) to create a new working
tree. This prompts you to specify a destination directory, which
identifies the working tree, and which will hold the new set of
workfiles.
Different VCS have different rules about what may and must be checked
out in other working trees, so there may be additional prompts depending
on the VCS in use. For example, Git requires that each branch be
checked out in only one working tree at a time, so when using Git, Emacs
will also prompt you for the name of the branch to be checked out in the
new working tree.
@kindex C-x v w w
@findex vc-switch-working-tree
Once your repository has other working trees, you can use the command
@kbd{C-x v w w} (@code{vc-switch-working-tree}) to switch between them.
It tries to find the analogue of the current buffer's file
under another working tree. Typically the sets of workfiles
under different working trees differ more in file contents than in which
files do and do not exist. In other words, the file the
current buffer visits probably exists in other working trees too, and
this command lets you switch to those versions of the file.
@kindex C-x v w x
@kindex C-x v w R
@findex vc-delete-working-tree
@findex vc-move-working-tree
The commands @kbd{C-x v w x} (@code{vc-delete-working-tree}) and
@kbd{C-x v w R} (@code{vc-move-working-tree}) are for performing
maintenance tasks on other working trees, letting you delete, move and
rename them. Deleting other working trees is particular useful because
a common use for multiple working trees is to create throwaway copies of
the repository to quickly test changes, without interfering with any
work-in-progress you may have in your primary working trees.
@node Version Headers @node Version Headers
@subsubsection Inserting Version Control Headers @subsubsection Inserting Version Control Headers

View file

@ -1843,6 +1843,22 @@ appearance of the list can be customized with the new faces
** VC ** VC
+++
*** New commands to handle repositories with multiple working trees.
Some VCS support more than one working tree with the same backing
revisions store, such as with Git's 'worktree' subcommand and
Mercurial's 'share' extension. Emacs now has some commands to manage
other working trees:
- 'C-x v w c': Add a new working tree.
- 'C-x v w w': Visit this file in another working tree.
- 'C-x v w x': Delete a working tree you no longer need.
- 'C-x v w R': Relocate a working tree to another file name.
In addition, Lisp programs that extend VC can invoke the new backend
functions to obtain a list of other working trees, and to add, remove
and relocate them.
--- ---
*** Using 'e' from Log View mode to modify change comments now works for Git. *** Using 'e' from Log View mode to modify change comments now works for Git.

View file

@ -5234,8 +5234,6 @@ evaluate the variable `compilation-shell-minor-mode'.
The mode's hook is called both when the mode is enabled and when it is The mode's hook is called both when the mode is enabled and when it is
disabled. disabled.
\\{compilation-shell-minor-mode-map}
(fn &optional ARG)" t) (fn &optional ARG)" t)
(autoload 'compilation-minor-mode "compile" "\ (autoload 'compilation-minor-mode "compile" "\
Toggle Compilation minor mode. Toggle Compilation minor mode.
@ -5258,8 +5256,6 @@ evaluate the variable `compilation-minor-mode'.
The mode's hook is called both when the mode is enabled and when it is The mode's hook is called both when the mode is enabled and when it is
disabled. disabled.
\\{compilation-minor-mode-map}
(fn &optional ARG)" t) (fn &optional ARG)" t)
(autoload 'compilation-next-error-function "compile" "\ (autoload 'compilation-next-error-function "compile" "\
Advance to the next error message and visit the file where the error was. Advance to the next error message and visit the file where the error was.
@ -5372,7 +5368,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-completion-preview-mode'.") or call the function `global-completion-preview-mode'.")
(custom-autoload 'global-completion-preview-mode "completion-preview" nil) (custom-autoload 'global-completion-preview-mode "completion-preview" nil)
(autoload 'global-completion-preview-mode "completion-preview" "\ (autoload 'global-completion-preview-mode "completion-preview" "\
Toggle Completion-Preview mode in all buffers. Toggle Completion-Preview mode in many buffers.
Specifically, Completion-Preview mode is enabled in all buffers where
`completion-preview-mode' would do it.
With prefix ARG, enable Global Completion-Preview mode if ARG is With prefix ARG, enable Global Completion-Preview mode if ARG is
positive; otherwise, disable it. positive; otherwise, disable it.
@ -5380,9 +5379,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Completion-Preview mode is enabled in all buffers where
`completion-preview-mode' would do it.
See `completion-preview-mode' for more information on See `completion-preview-mode' for more information on
Completion-Preview mode. Completion-Preview mode.
@ -6539,7 +6535,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-cwarn-mode'.") or call the function `global-cwarn-mode'.")
(custom-autoload 'global-cwarn-mode "cwarn" nil) (custom-autoload 'global-cwarn-mode "cwarn" nil)
(autoload 'global-cwarn-mode "cwarn" "\ (autoload 'global-cwarn-mode "cwarn" "\
Toggle Cwarn mode in all buffers. Toggle Cwarn mode in many buffers.
Specifically, Cwarn mode is enabled in all buffers where
`turn-on-cwarn-mode-if-enabled' would do it.
With prefix ARG, enable Global Cwarn mode if ARG is positive; With prefix ARG, enable Global Cwarn mode if ARG is positive;
otherwise, disable it. otherwise, disable it.
@ -6547,9 +6546,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Cwarn mode is enabled in all buffers where
`turn-on-cwarn-mode-if-enabled' would do it.
See `cwarn-mode' for more information on Cwarn mode. See `cwarn-mode' for more information on Cwarn mode.
(fn &optional ARG)" t) (fn &optional ARG)" t)
@ -7653,18 +7649,18 @@ Also see the `diff-entire-buffers' variable.
(autoload 'diff-mode "diff-mode" "\ (autoload 'diff-mode "diff-mode" "\
Major mode for viewing/editing context diffs. Major mode for viewing/editing context diffs.
Supports unified and context diffs as well as (to a lesser extent) Supports unified and context diffs as well as, to a lesser extent, diffs
normal diffs. in the old \"normal\" format. (Unified diffs have become the standard,
most commonly encountered format.) If you edit the buffer manually,
When the buffer is read-only, the ESC prefix is not necessary. `diff-mode' will try to update the hunk headers for you on-the-fly.
If you edit the buffer manually, `diff-mode' will try to update the hunk
headers for you on-the-fly.
You can also switch between context diff and unified diff with \\[diff-context->unified], You can also switch between context diff and unified diff with \\[diff-context->unified],
or vice versa with \\[diff-unified->context] and you can also reverse the direction of or vice versa with \\[diff-unified->context] and you can also reverse the direction of
a diff with \\[diff-reverse-direction]. a diff with \\[diff-reverse-direction].
\\{diff-mode-map} \\{diff-mode-map}
In read-only buffers the following bindings are also available:
\\{diff-read-only-map}
(fn)" t) (fn)" t)
(autoload 'diff-minor-mode "diff-mode" "\ (autoload 'diff-minor-mode "diff-mode" "\
@ -8114,7 +8110,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-display-fill-column-indicator-mode'.") or call the function `global-display-fill-column-indicator-mode'.")
(custom-autoload 'global-display-fill-column-indicator-mode "display-fill-column-indicator" nil) (custom-autoload 'global-display-fill-column-indicator-mode "display-fill-column-indicator" nil)
(autoload 'global-display-fill-column-indicator-mode "display-fill-column-indicator" "\ (autoload 'global-display-fill-column-indicator-mode "display-fill-column-indicator" "\
Toggle Display-Fill-Column-Indicator mode in all buffers. Toggle Display-Fill-Column-Indicator mode in many buffers.
Specifically, Display-Fill-Column-Indicator mode is enabled in all
buffers where `display-fill-column-indicator--turn-on' would do it.
With prefix ARG, enable Global Display-Fill-Column-Indicator mode if With prefix ARG, enable Global Display-Fill-Column-Indicator mode if
ARG is positive; otherwise, disable it. ARG is positive; otherwise, disable it.
@ -8122,9 +8121,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Display-Fill-Column-Indicator mode is enabled in all buffers where
`display-fill-column-indicator--turn-on' would do it.
See `display-fill-column-indicator-mode' for more information on See `display-fill-column-indicator-mode' for more information on
Display-Fill-Column-Indicator mode. Display-Fill-Column-Indicator mode.
@ -8185,7 +8181,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-display-line-numbers-mode'.") or call the function `global-display-line-numbers-mode'.")
(custom-autoload 'global-display-line-numbers-mode "display-line-numbers" nil) (custom-autoload 'global-display-line-numbers-mode "display-line-numbers" nil)
(autoload 'global-display-line-numbers-mode "display-line-numbers" "\ (autoload 'global-display-line-numbers-mode "display-line-numbers" "\
Toggle Display-Line-Numbers mode in all buffers. Toggle Display-Line-Numbers mode in many buffers.
Specifically, Display-Line-Numbers mode is enabled in all buffers
where `display-line-numbers--turn-on' would do it.
With prefix ARG, enable Global Display-Line-Numbers mode if ARG is With prefix ARG, enable Global Display-Line-Numbers mode if ARG is
positive; otherwise, disable it. positive; otherwise, disable it.
@ -8193,9 +8192,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Display-Line-Numbers mode is enabled in all buffers where
`display-line-numbers--turn-on' would do it.
See `display-line-numbers-mode' for more information on See `display-line-numbers-mode' for more information on
Display-Line-Numbers mode. Display-Line-Numbers mode.
@ -8550,8 +8546,8 @@ switch on the minor mode in all major modes), nil (meaning don't
switch on in any major mode), a list of modes (meaning switch on only switch on in any major mode), a list of modes (meaning switch on only
in those modes and their descendants), or a list (not MODES...), in those modes and their descendants), or a list (not MODES...),
meaning switch on in any major mode except MODES. The value can also meaning switch on in any major mode except MODES. The value can also
mix all of these forms, see the info node `Defining Minor Modes' for mix all of these forms, see the Info node `(elisp)Defining Minor Modes'
details. The :predicate key causes the macro to create a user option for details. The :predicate key causes the macro to create a user option
named the same as MODE, but ending with \"-modes\" instead of \"-mode\". named the same as MODE, but ending with \"-modes\" instead of \"-mode\".
That user option can then be used to customize in which modes this That user option can then be used to customize in which modes this
globalized minor mode will be switched on. globalized minor mode will be switched on.
@ -8929,7 +8925,7 @@ A second call of this function without changing point inserts the next match.
A call with prefix PREFIX reads the symbol to insert from the minibuffer with A call with prefix PREFIX reads the symbol to insert from the minibuffer with
completion. completion.
(fn PREFIX)" t) (fn PREFIX)" '("P"))
(autoload 'ebrowse-tags-loop-continue "ebrowse" "\ (autoload 'ebrowse-tags-loop-continue "ebrowse" "\
Repeat last operation on files in tree. Repeat last operation on files in tree.
FIRST-TIME non-nil means this is not a repetition, but the first time. FIRST-TIME non-nil means this is not a repetition, but the first time.
@ -9851,7 +9847,7 @@ Describe CTR if it is a class constructor.
;;; Generated autoloads from emacs-lisp/eldoc.el ;;; Generated autoloads from emacs-lisp/eldoc.el
(push '(eldoc 1 15 0) package--builtin-versions) (push '(eldoc 1 16 0) package--builtin-versions)
;;; Generated autoloads from elec-pair.el ;;; Generated autoloads from elec-pair.el
@ -9950,32 +9946,6 @@ mode hooks.
(make-obsolete 'elide-head 'elide-head-mode "29.1") (make-obsolete 'elide-head 'elide-head-mode "29.1")
(register-definition-prefixes "elide-head" '("elide-head-")) (register-definition-prefixes "elide-head" '("elide-head-"))
;;; Generated autoloads from emacs-lisp/elint.el
(autoload 'elint-file "elint" "\
Lint the file FILE.
(fn FILE)" t)
(autoload 'elint-directory "elint" "\
Lint all the .el files in DIRECTORY.
A complicated directory may require a lot of memory.
(fn DIRECTORY)" t)
(autoload 'elint-current-buffer "elint" "\
Lint the current buffer.
If necessary, this first calls `elint-initialize'." t)
(autoload 'elint-defun "elint" "\
Lint the function at point.
If necessary, this first calls `elint-initialize'." t)
(autoload 'elint-initialize "elint" "\
Initialize elint.
If elint is already initialized, this does nothing, unless
optional prefix argument REINIT is non-nil.
(fn &optional REINIT)" t)
(register-definition-prefixes "elint" '("elint-"))
;;; Generated autoloads from progmodes/elixir-ts-mode.el ;;; Generated autoloads from progmodes/elixir-ts-mode.el
@ -10721,7 +10691,7 @@ ERC assigns SERVER and FULL-NAME the associated keyword values
and defers to `erc-compute-port', `erc-compute-user', and and defers to `erc-compute-port', `erc-compute-user', and
`erc-compute-nick' for those respective parameters. `erc-compute-nick' for those respective parameters.
(fn &key SERVER PORT NICK USER PASSWORD FULL-NAME ID)" t) (fn &key SERVER PORT NICK USER PASSWORD FULL-NAME ID)" '((let ((erc--display-context `((erc-interactive-display . erc) ,@erc--display-context))) (erc-select-read-args))))
(defalias 'erc-select #'erc) (defalias 'erc-select #'erc)
(autoload 'erc-tls "erc" "\ (autoload 'erc-tls "erc" "\
Connect to an IRC server over a TLS-encrypted connection. Connect to an IRC server over a TLS-encrypted connection.
@ -10744,7 +10714,7 @@ See the alternative entry-point command `erc' as well as Info
node `(erc) Connecting' for a fuller description of the various node `(erc) Connecting' for a fuller description of the various
parameters, like ID. parameters, like ID.
(fn &key SERVER PORT NICK USER PASSWORD FULL-NAME CLIENT-CERTIFICATE ID)" t) (fn &key SERVER PORT NICK USER PASSWORD FULL-NAME CLIENT-CERTIFICATE ID)" '((let ((erc-default-port erc-default-port-tls) (erc--display-context `((erc-interactive-display . erc-tls) ,@erc--display-context))) (erc-select-read-args))))
(autoload 'erc-handle-irc-url "erc" "\ (autoload 'erc-handle-irc-url "erc" "\
Use ERC to IRC on HOST:PORT in CHANNEL. Use ERC to IRC on HOST:PORT in CHANNEL.
If ERC is already connected to HOST:PORT, simply /join CHANNEL. If ERC is already connected to HOST:PORT, simply /join CHANNEL.
@ -10976,9 +10946,7 @@ it has to be wrapped in `(eval (quote ...))'.
If NAME is already defined as a test and Emacs is running If NAME is already defined as a test and Emacs is running
in batch mode, an error is signaled. in batch mode, an error is signaled.
(fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] BODY...)" nil t) (fn NAME () [DOCSTRING] [:expected-result RESULT-TYPE] [:tags \\='(TAG...)] BODY...)" nil 'macro)
(function-put 'ert-deftest 'doc-string-elt 3)
(function-put 'ert-deftest 'lisp-indent-function 2)
(autoload 'ert-run-tests-batch "ert" "\ (autoload 'ert-run-tests-batch "ert" "\
Run the tests specified by SELECTOR, printing results to the terminal. Run the tests specified by SELECTOR, printing results to the terminal.
@ -12830,6 +12798,8 @@ value is the default binding of the variable.
The connection-local value of `path-separator'.") The connection-local value of `path-separator'.")
(autoload 'null-device "files-x" "\ (autoload 'null-device "files-x" "\
The connection-local value of `null-device'.") The connection-local value of `null-device'.")
(autoload 'exec-suffixes "files-x" "\
The connection-local value of `exec-suffixes'.")
(register-definition-prefixes "files-x" '("connection-local-" "dir-locals-to-string" "modify-" "read-")) (register-definition-prefixes "files-x" '("connection-local-" "dir-locals-to-string" "modify-" "read-"))
@ -13399,8 +13369,6 @@ evaluate the variable `flymake-mode'.
The mode's hook is called both when the mode is enabled and when it is The mode's hook is called both when the mode is enabled and when it is
disabled. disabled.
\\{flymake-mode-map}
(fn &optional ARG)" t) (fn &optional ARG)" t)
(autoload 'flymake-mode-on "flymake" "\ (autoload 'flymake-mode-on "flymake" "\
Turn Flymake mode on.") Turn Flymake mode on.")
@ -15232,7 +15200,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-goto-address-mode'.") or call the function `global-goto-address-mode'.")
(custom-autoload 'global-goto-address-mode "goto-addr" nil) (custom-autoload 'global-goto-address-mode "goto-addr" nil)
(autoload 'global-goto-address-mode "goto-addr" "\ (autoload 'global-goto-address-mode "goto-addr" "\
Toggle Goto-Address mode in all buffers. Toggle Goto-Address mode in many buffers.
Specifically, Goto-Address mode is enabled in all buffers where
`goto-addr-mode--turn-on' would do it.
With prefix ARG, enable Global Goto-Address mode if ARG is positive; With prefix ARG, enable Global Goto-Address mode if ARG is positive;
otherwise, disable it. otherwise, disable it.
@ -15240,9 +15211,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Goto-Address mode is enabled in all buffers where
`goto-addr-mode--turn-on' would do it.
See `goto-address-mode' for more information on Goto-Address mode. See `goto-address-mode' for more information on Goto-Address mode.
(fn &optional ARG)" t) (fn &optional ARG)" t)
@ -16433,7 +16401,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-hi-lock-mode'.") or call the function `global-hi-lock-mode'.")
(custom-autoload 'global-hi-lock-mode "hi-lock" nil) (custom-autoload 'global-hi-lock-mode "hi-lock" nil)
(autoload 'global-hi-lock-mode "hi-lock" "\ (autoload 'global-hi-lock-mode "hi-lock" "\
Toggle Hi-Lock mode in all buffers. Toggle Hi-Lock mode in many buffers.
Specifically, Hi-Lock mode is enabled in all buffers where
`turn-on-hi-lock-if-enabled' would do it.
With prefix ARG, enable Global Hi-Lock mode if ARG is positive; With prefix ARG, enable Global Hi-Lock mode if ARG is positive;
otherwise, disable it. otherwise, disable it.
@ -16441,9 +16412,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Hi-Lock mode is enabled in all buffers where
`turn-on-hi-lock-if-enabled' would do it.
See `hi-lock-mode' for more information on Hi-Lock mode. See `hi-lock-mode' for more information on Hi-Lock mode.
(fn &optional ARG)" t) (fn &optional ARG)" t)
@ -16812,7 +16780,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-highlight-changes-mode'.") or call the function `global-highlight-changes-mode'.")
(custom-autoload 'global-highlight-changes-mode "hilit-chg" nil) (custom-autoload 'global-highlight-changes-mode "hilit-chg" nil)
(autoload 'global-highlight-changes-mode "hilit-chg" "\ (autoload 'global-highlight-changes-mode "hilit-chg" "\
Toggle Highlight-Changes mode in all buffers. Toggle Highlight-Changes mode in many buffers.
Specifically, Highlight-Changes mode is enabled in all buffers where
`highlight-changes-mode-turn-on' would do it.
With prefix ARG, enable Global Highlight-Changes mode if ARG is With prefix ARG, enable Global Highlight-Changes mode if ARG is
positive; otherwise, disable it. positive; otherwise, disable it.
@ -16820,9 +16791,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Highlight-Changes mode is enabled in all buffers where
`highlight-changes-mode-turn-on' would do it.
See `highlight-changes-mode' for more information on Highlight-Changes See `highlight-changes-mode' for more information on Highlight-Changes
mode. mode.
@ -17102,8 +17070,7 @@ inlined into the compiled format versions. This means that if you
change its definition, you should explicitly call change its definition, you should explicitly call
`ibuffer-recompile-formats'. `ibuffer-recompile-formats'.
(fn SYMBOL (&key NAME INLINE PROPS SUMMARIZER) &rest BODY)" nil t) (fn SYMBOL (&key NAME INLINE PROPS SUMMARIZER) &rest BODY)" nil 'macro)
(function-put 'define-ibuffer-column 'lisp-indent-function 'defun)
(autoload 'define-ibuffer-sorter "ibuf-macs" "\ (autoload 'define-ibuffer-sorter "ibuf-macs" "\
Define a method of sorting named NAME. Define a method of sorting named NAME.
DOCUMENTATION is the documentation of the function, which will be called DOCUMENTATION is the documentation of the function, which will be called
@ -17114,9 +17081,7 @@ For sorting, the forms in BODY will be evaluated with `a' bound to one
buffer object, and `b' bound to another. BODY should return a non-nil buffer object, and `b' bound to another. BODY should return a non-nil
value if and only if `a' is \"less than\" `b'. value if and only if `a' is \"less than\" `b'.
(fn NAME DOCUMENTATION (&key DESCRIPTION) &rest BODY)" nil t) (fn NAME DOCUMENTATION (&key DESCRIPTION) &rest BODY)" nil 'macro)
(function-put 'define-ibuffer-sorter 'lisp-indent-function 1)
(function-put 'define-ibuffer-sorter 'doc-string-elt 2)
(autoload 'define-ibuffer-op "ibuf-macs" "\ (autoload 'define-ibuffer-op "ibuf-macs" "\
Generate a function which operates on a buffer. Generate a function which operates on a buffer.
OP becomes the name of the function; if it doesn't begin with OP becomes the name of the function; if it doesn't begin with
@ -17159,9 +17124,7 @@ BODY define the operation; they are forms to evaluate per each
marked buffer. BODY is evaluated with `buf' bound to the marked buffer. BODY is evaluated with `buf' bound to the
buffer object. buffer object.
(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING ACTIVE-OPSTRING BEFORE AFTER COMPLEX) &rest BODY)" nil t) (fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING ACTIVE-OPSTRING BEFORE AFTER COMPLEX) &rest BODY)" nil 'macro)
(function-put 'define-ibuffer-op 'lisp-indent-function 2)
(function-put 'define-ibuffer-op 'doc-string-elt 3)
(autoload 'define-ibuffer-filter "ibuf-macs" "\ (autoload 'define-ibuffer-filter "ibuf-macs" "\
Define a filter named NAME. Define a filter named NAME.
DOCUMENTATION is the documentation of the function. DOCUMENTATION is the documentation of the function.
@ -17176,9 +17139,7 @@ not a particular buffer should be displayed or not. The forms in BODY
will be evaluated with BUF bound to the buffer object, and QUALIFIER will be evaluated with BUF bound to the buffer object, and QUALIFIER
bound to the current value of the filter. bound to the current value of the filter.
(fn NAME DOCUMENTATION (&key READER DESCRIPTION) &rest BODY)" nil t) (fn NAME DOCUMENTATION (&key READER DESCRIPTION) &rest BODY)" nil 'macro)
(function-put 'define-ibuffer-filter 'lisp-indent-function 2)
(function-put 'define-ibuffer-filter 'doc-string-elt 2)
(register-definition-prefixes "ibuf-macs" '("ibuffer-")) (register-definition-prefixes "ibuf-macs" '("ibuffer-"))
@ -18088,8 +18049,9 @@ Toggle thumbnails in front of marked file names in the Dired buffer.
If no file is marked, toggle display of thumbnail on the current file's line. If no file is marked, toggle display of thumbnail on the current file's line.
ARG, if non-nil (interactively, the prefix argument), specifies the files ARG, if non-nil (interactively, the prefix argument), specifies the files
whose thumbnail display to toggle instead of the marked files: if ARG is an whose thumbnail display to toggle instead of the marked files: if ARG is an
integer, use the next ARG (or previous -ARG, if ARG<0) files; any other integer, use the next ARG (or previous -ARG, if ARG<0) files; if ARG is
value of ARG means toggle thumbnail display of the current line's file. the symbol `marked', use only the marked files, if any; any other value of
ARG means toggle thumbnail display of the current line's file.
(fn &optional ARG)" '(dired-mode)) (fn &optional ARG)" '(dired-mode))
(autoload 'image-dired-jump-thumbnail-buffer "image-dired-dired" "\ (autoload 'image-dired-jump-thumbnail-buffer "image-dired-dired" "\
@ -20017,7 +19979,9 @@ keys and associated values are:
files that are concerned by the current operation (using relative names); files that are concerned by the current operation (using relative names);
`log-edit-diff-function' -- function taking no arguments that `log-edit-diff-function' -- function taking no arguments that
displays a diff of the files concerned by the current operation. displays a diff of the files concerned by the current operation.
`vc-log-fileset' -- the VC fileset to be committed (if any). `vc-log-fileset' -- list of files to be committed, if any
(not a true VC fileset structure as returned by
`vc-deduce-fileset', but only the second element).
If BUFFER is non-nil, `log-edit' will switch to that buffer, use it If BUFFER is non-nil, `log-edit' will switch to that buffer, use it
to edit the log message and go back to the current buffer when to edit the log message and go back to the current buffer when
@ -27204,8 +27168,6 @@ evaluate the variable `rectangle-mark-mode'.
The mode's hook is called both when the mode is enabled and when it is The mode's hook is called both when the mode is enabled and when it is
disabled. disabled.
\\{rectangle-mark-mode-map}
(fn &optional ARG)" t) (fn &optional ARG)" t)
(register-definition-prefixes "rect" '("apply-on-rectangle" "clear-rectangle-line" "delete-" "extract-rectangle-" "killed-rectangle" "ope" "rectangle-" "spaces-string" "string-rectangle-")) (register-definition-prefixes "rect" '("apply-on-rectangle" "clear-rectangle-line" "delete-" "extract-rectangle-" "killed-rectangle" "ope" "rectangle-" "spaces-string" "string-rectangle-"))
@ -29003,6 +28965,22 @@ disabled.
(register-definition-prefixes "semantic/senator" '("semantic-up-reference" "senator-")) (register-definition-prefixes "semantic/senator" '("semantic-up-reference" "senator-"))
;;; Generated autoloads from send-to.el
(autoload 'send-to-supported-p "send-to" "\
Return non-nil for platforms where `send-to' is supported.")
(autoload 'send-to "send-to" "\
Send file(s) or region text to (non-Emacs) applications or services.
Sending is handled by the first supported handler from `send-to-handlers'.
ITEMS list is also populated by the resolved handler, but can be
explicitly overridden.
(fn &optional ITEMS)" t)
(register-definition-prefixes "send-to" '("send-to-"))
;;; Generated autoloads from mail/sendmail.el ;;; Generated autoloads from mail/sendmail.el
@ -31509,7 +31487,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-subword-mode'.") or call the function `global-subword-mode'.")
(custom-autoload 'global-subword-mode "subword" nil) (custom-autoload 'global-subword-mode "subword" nil)
(autoload 'global-subword-mode "subword" "\ (autoload 'global-subword-mode "subword" "\
Toggle Subword mode in all buffers. Toggle Subword mode in many buffers.
Specifically, Subword mode is enabled in all buffers where `(lambda
nil (subword-mode 1))' would do it.
With prefix ARG, enable Global Subword mode if ARG is positive; With prefix ARG, enable Global Subword mode if ARG is positive;
otherwise, disable it. otherwise, disable it.
@ -31517,9 +31498,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Subword mode is enabled in all buffers where `(lambda nil
(subword-mode 1))' would do it.
See `subword-mode' for more information on Subword mode. See `subword-mode' for more information on Subword mode.
(fn &optional ARG)" t) (fn &optional ARG)" t)
@ -31558,7 +31536,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-superword-mode'.") or call the function `global-superword-mode'.")
(custom-autoload 'global-superword-mode "subword" nil) (custom-autoload 'global-superword-mode "subword" nil)
(autoload 'global-superword-mode "subword" "\ (autoload 'global-superword-mode "subword" "\
Toggle Superword mode in all buffers. Toggle Superword mode in many buffers.
Specifically, Superword mode is enabled in all buffers where `(lambda
nil (superword-mode 1))' would do it.
With prefix ARG, enable Global Superword mode if ARG is positive; With prefix ARG, enable Global Superword mode if ARG is positive;
otherwise, disable it. otherwise, disable it.
@ -31566,9 +31547,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Superword mode is enabled in all buffers where `(lambda nil
(superword-mode 1))' would do it.
See `superword-mode' for more information on Superword mode. See `superword-mode' for more information on Superword mode.
(fn &optional ARG)" t) (fn &optional ARG)" t)
@ -31693,7 +31671,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-tab-line-mode'.") or call the function `global-tab-line-mode'.")
(custom-autoload 'global-tab-line-mode "tab-line" nil) (custom-autoload 'global-tab-line-mode "tab-line" nil)
(autoload 'global-tab-line-mode "tab-line" "\ (autoload 'global-tab-line-mode "tab-line" "\
Toggle Tab-Line mode in all buffers. Toggle Tab-Line mode in many buffers.
Specifically, Tab-Line mode is enabled in all buffers where
`tab-line-mode--turn-on' would do it.
With prefix ARG, enable Global Tab-Line mode if ARG is positive; With prefix ARG, enable Global Tab-Line mode if ARG is positive;
otherwise, disable it. otherwise, disable it.
@ -31701,9 +31682,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Tab-Line mode is enabled in all buffers where `tab-line-mode--turn-on'
would do it.
See `tab-line-mode' for more information on Tab-Line mode. See `tab-line-mode' for more information on Tab-Line mode.
(fn &optional ARG)" t) (fn &optional ARG)" t)
@ -33980,7 +33958,7 @@ If the buffer runs `dired', the buffer is reverted." t)
Visit the file or directory named on this line as the superuser. Visit the file or directory named on this line as the superuser.
By default this is done using the \"sudo\" Tramp method. By default this is done using the \"sudo\" Tramp method.
YOu can customize `tramp-file-name-with-method' to change this. You can customize `tramp-file-name-with-method' to change this.
Interactively, with a prefix argument, prompt for a different method." t) Interactively, with a prefix argument, prompt for a different method." t)
(register-definition-prefixes "tramp-cmds" '("tramp-" "with-tramp-file-name-with-method")) (register-definition-prefixes "tramp-cmds" '("tramp-" "with-tramp-file-name-with-method"))
@ -34058,7 +34036,7 @@ Interactively, with a prefix argument, prompt for a different method." t)
;;; Generated autoloads from net/trampver.el ;;; Generated autoloads from net/trampver.el
(push '(tramp 2 8 0) package--builtin-versions) (push '(tramp 2 8 1 -1) package--builtin-versions)
(register-definition-prefixes "trampver" '("tramp-")) (register-definition-prefixes "trampver" '("tramp-"))
@ -35627,6 +35605,7 @@ The merge base is a common ancestor between REV1 and REV2 revisions.
(fn FILES REV1 REV2)" t) (fn FILES REV1 REV2)" t)
(autoload 'vc-root-diff-incoming "vc" "\ (autoload 'vc-root-diff-incoming "vc" "\
Report diff of all changes that would be pulled from REMOTE-LOCATION. Report diff of all changes that would be pulled from REMOTE-LOCATION.
When unspecified REMOTE-LOCATION is the place \\[vc-update] would pull from.
When called interactively with a prefix argument, prompt for REMOTE-LOCATION. When called interactively with a prefix argument, prompt for REMOTE-LOCATION.
In some version control systems REMOTE-LOCATION can be a remote branch name. In some version control systems REMOTE-LOCATION can be a remote branch name.
@ -35636,6 +35615,7 @@ global binding.
(fn &optional REMOTE-LOCATION)" t) (fn &optional REMOTE-LOCATION)" t)
(autoload 'vc-root-diff-outgoing "vc" "\ (autoload 'vc-root-diff-outgoing "vc" "\
Report diff of all changes that would be pushed to REMOTE-LOCATION. Report diff of all changes that would be pushed to REMOTE-LOCATION.
When unspecified REMOTE-LOCATION is the place \\[vc-push] would push to.
When called interactively with a prefix argument, prompt for REMOTE-LOCATION. When called interactively with a prefix argument, prompt for REMOTE-LOCATION.
In some version control systems REMOTE-LOCATION can be a remote branch name. In some version control systems REMOTE-LOCATION can be a remote branch name.
@ -35752,12 +35732,12 @@ locked files at or below DIR (but if NAME is empty, locked files are
allowed and simply skipped). allowed and simply skipped).
If BRANCHP is non-nil (interactively, the prefix argument), switch to the If BRANCHP is non-nil (interactively, the prefix argument), switch to the
branch and check out and update the files to their version on that branch. branch and check out and update the files to their version on that branch.
In this case NAME may not be empty.
This function runs the hook `vc-retrieve-tag-hook' when finished. This function runs the hook `vc-retrieve-tag-hook' when finished.
(fn DIR NAME &optional BRANCHP)" t) (fn DIR NAME &optional BRANCHP)" t)
(autoload 'vc-switch-branch "vc" "\ (autoload 'vc-switch-branch "vc" "\
Switch to the branch NAME in the directory DIR. Switch to the branch NAME in the directory DIR.
If NAME is empty, it refers to the latest revision of the current branch.
Interactively, prompt for DIR only for VCS that works at file level; Interactively, prompt for DIR only for VCS that works at file level;
otherwise use the root directory of the current buffer's VC tree. otherwise use the root directory of the current buffer's VC tree.
Interactively, prompt for the NAME of the branch. Interactively, prompt for the NAME of the branch.
@ -35801,12 +35781,14 @@ The command prompts for the branch whose change log to show.
(fn BRANCH)" t) (fn BRANCH)" t)
(autoload 'vc-log-incoming "vc" "\ (autoload 'vc-log-incoming "vc" "\
Show log of changes that will be received with pull from REMOTE-LOCATION. Show log of changes that will be received with pull from REMOTE-LOCATION.
When unspecified REMOTE-LOCATION is the place \\[vc-update] would pull from.
When called interactively with a prefix argument, prompt for REMOTE-LOCATION. When called interactively with a prefix argument, prompt for REMOTE-LOCATION.
In some version control systems REMOTE-LOCATION can be a remote branch name. In some version control systems REMOTE-LOCATION can be a remote branch name.
(fn &optional REMOTE-LOCATION)" t) (fn &optional REMOTE-LOCATION)" t)
(autoload 'vc-log-outgoing "vc" "\ (autoload 'vc-log-outgoing "vc" "\
Show log of changes that will be sent with a push operation to REMOTE-LOCATION. Show log of changes that will be sent with a push operation to REMOTE-LOCATION.
When unspecified REMOTE-LOCATION is the place \\[vc-push] would push to.
When called interactively with a prefix argument, prompt for REMOTE-LOCATION. When called interactively with a prefix argument, prompt for REMOTE-LOCATION.
In some version control systems REMOTE-LOCATION can be a remote branch name. In some version control systems REMOTE-LOCATION can be a remote branch name.
@ -35953,6 +35935,34 @@ When invoked interactively in a Log View buffer with
marked revisions, use those. marked revisions, use those.
(fn ADDRESSEE SUBJECT REVISIONS)" t) (fn ADDRESSEE SUBJECT REVISIONS)" t)
(autoload 'vc-add-working-tree "vc" "\
Create working tree DIRECTORY with same backing repository as this tree.
See Info node `(emacs)Other Working Trees' regarding VCS repositories
with multiple working trees.
(fn BACKEND DIRECTORY)" t)
(autoload 'vc-switch-working-tree "vc" "\
Switch to this file or directory's analogue in working tree DIRECTORY.
This command switches to the file or directory which has the same path
relative to DIRECTORY that this buffer's file or directory has relative
to the root of this working tree.
DIRECTORY names another working tree with the same backing repository as
this tree; see Info node `(emacs)Other Working Trees' for general
information regarding VCS repositories with multiple working trees.
(fn DIRECTORY)" t)
(autoload 'vc-delete-working-tree "vc" "\
Delete working tree DIRECTORY with same backing repository as this tree.
See Info node `(emacs)Other Working Trees' regarding VCS repositories
with multiple working trees.
(fn BACKEND DIRECTORY)" t)
(autoload 'vc-move-working-tree "vc" "\
Relocate a working tree from FROM to TO.
See Info node `(emacs)Other Working Trees' regarding VCS repositories
with multiple working trees.
(fn BACKEND FROM TO)" t)
(register-definition-prefixes "vc" '("log-view-vc-prev-" "vc-" "with-vc-properties")) (register-definition-prefixes "vc" '("log-view-vc-prev-" "vc-" "with-vc-properties"))
@ -37300,7 +37310,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-visual-wrap-prefix-mode'.") or call the function `global-visual-wrap-prefix-mode'.")
(custom-autoload 'global-visual-wrap-prefix-mode "visual-wrap" nil) (custom-autoload 'global-visual-wrap-prefix-mode "visual-wrap" nil)
(autoload 'global-visual-wrap-prefix-mode "visual-wrap" "\ (autoload 'global-visual-wrap-prefix-mode "visual-wrap" "\
Toggle Visual-Wrap-Prefix mode in all buffers. Toggle Visual-Wrap-Prefix mode in many buffers.
Specifically, Visual-Wrap-Prefix mode is enabled in all buffers where
`visual-wrap-prefix-mode' would do it.
With prefix ARG, enable Global Visual-Wrap-Prefix mode if ARG is With prefix ARG, enable Global Visual-Wrap-Prefix mode if ARG is
positive; otherwise, disable it. positive; otherwise, disable it.
@ -37308,9 +37321,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Visual-Wrap-Prefix mode is enabled in all buffers where
`visual-wrap-prefix-mode' would do it.
See `visual-wrap-prefix-mode' for more information on See `visual-wrap-prefix-mode' for more information on
Visual-Wrap-Prefix mode. Visual-Wrap-Prefix mode.
@ -37757,7 +37767,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-whitespace-mode'.") or call the function `global-whitespace-mode'.")
(custom-autoload 'global-whitespace-mode "whitespace" nil) (custom-autoload 'global-whitespace-mode "whitespace" nil)
(autoload 'global-whitespace-mode "whitespace" "\ (autoload 'global-whitespace-mode "whitespace" "\
Toggle Whitespace mode in all buffers. Toggle Whitespace mode in many buffers.
Specifically, Whitespace mode is enabled in all buffers where
`whitespace-turn-on-if-enabled' would do it.
With prefix ARG, enable Global Whitespace mode if ARG is positive; With prefix ARG, enable Global Whitespace mode if ARG is positive;
otherwise, disable it. otherwise, disable it.
@ -37765,9 +37778,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Whitespace mode is enabled in all buffers where
`whitespace-turn-on-if-enabled' would do it.
See `whitespace-mode' for more information on Whitespace mode. See `whitespace-mode' for more information on Whitespace mode.
(fn &optional ARG)" t) (fn &optional ARG)" t)
@ -38414,7 +38424,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-window-tool-bar-mode'.") or call the function `global-window-tool-bar-mode'.")
(custom-autoload 'global-window-tool-bar-mode "window-tool-bar" nil) (custom-autoload 'global-window-tool-bar-mode "window-tool-bar" nil)
(autoload 'global-window-tool-bar-mode "window-tool-bar" "\ (autoload 'global-window-tool-bar-mode "window-tool-bar" "\
Toggle Window-Tool-Bar mode in all buffers. Toggle Window-Tool-Bar mode in many buffers.
Specifically, Window-Tool-Bar mode is enabled in all buffers where
`window-tool-bar--turn-on' would do it.
With prefix ARG, enable Global Window-Tool-Bar mode if ARG is With prefix ARG, enable Global Window-Tool-Bar mode if ARG is
positive; otherwise, disable it. positive; otherwise, disable it.
@ -38422,9 +38435,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Window-Tool-Bar mode is enabled in all buffers where
`window-tool-bar--turn-on' would do it.
See `window-tool-bar-mode' for more information on Window-Tool-Bar See `window-tool-bar-mode' for more information on Window-Tool-Bar
mode. mode.
@ -38643,7 +38653,10 @@ either customize it (see the info node `Easy Customization')
or call the function `global-word-wrap-whitespace-mode'.") or call the function `global-word-wrap-whitespace-mode'.")
(custom-autoload 'global-word-wrap-whitespace-mode "word-wrap-mode" nil) (custom-autoload 'global-word-wrap-whitespace-mode "word-wrap-mode" nil)
(autoload 'global-word-wrap-whitespace-mode "word-wrap-mode" "\ (autoload 'global-word-wrap-whitespace-mode "word-wrap-mode" "\
Toggle Word-Wrap-Whitespace mode in all buffers. Toggle Word-Wrap-Whitespace mode in many buffers.
Specifically, Word-Wrap-Whitespace mode is enabled in all buffers
where `word-wrap-whitespace-mode' would do it.
With prefix ARG, enable Global Word-Wrap-Whitespace mode if ARG is With prefix ARG, enable Global Word-Wrap-Whitespace mode if ARG is
positive; otherwise, disable it. positive; otherwise, disable it.
@ -38651,9 +38664,6 @@ If called from Lisp, toggle the mode if ARG is `toggle'.
Enable the mode if ARG is nil, omitted, or is a positive number. Enable the mode if ARG is nil, omitted, or is a positive number.
Disable the mode if ARG is a negative number. Disable the mode if ARG is a negative number.
Word-Wrap-Whitespace mode is enabled in all buffers where
`word-wrap-whitespace-mode' would do it.
See `word-wrap-whitespace-mode' for more information on See `word-wrap-whitespace-mode' for more information on
Word-Wrap-Whitespace mode. Word-Wrap-Whitespace mode.
@ -38990,9 +39000,9 @@ run a specific program. The program must be a member of
(provide 'loaddefs) (provide 'loaddefs)
;; Local Variables: ;; Local Variables:
;; no-byte-compile: t
;; version-control: never ;; version-control: never
;; no-update-autoloads: t ;; no-update-autoloads: t
;; no-byte-compile: t
;; no-native-compile: t ;; no-native-compile: t
;; coding: utf-8-emacs-unix ;; coding: utf-8-emacs-unix
;; End: ;; End:

View file

@ -1415,7 +1415,7 @@ Throw an error if another update process is in progress."
(vc-call-backend (vc-call-backend
backend 'dir-status-files def-dir nil backend 'dir-status-files def-dir nil
(lambda (entries &optional more-to-come) (lambda (entries &optional more-to-come)
;; ENTRIES is a list of (FILE VC_STATE EXTRA) items. ;; ENTRIES is a list of (FILE VC-STATE EXTRA) items.
;; If MORE-TO-COME is true, then more updates will come from ;; If MORE-TO-COME is true, then more updates will come from
;; the asynchronous process. ;; the asynchronous process.
(with-current-buffer buffer (with-current-buffer buffer
@ -1520,7 +1520,7 @@ not under version control, prompt for a directory."
(interactive) (interactive)
(let ((root-dir (vc-root-dir))) (let ((root-dir (vc-root-dir)))
(if root-dir (vc-dir root-dir) (if root-dir (vc-dir root-dir)
(call-interactively 'vc-dir)))) (call-interactively #'vc-dir))))
;;;###autoload ;;;###autoload
(defun vc-dir (dir &optional backend) (defun vc-dir (dir &optional backend)

View file

@ -1913,12 +1913,15 @@ This requires git 1.8.4 or later, for the \"-L\" option of \"git log\"."
(declare-function vc-read-revision "vc" (declare-function vc-read-revision "vc"
(prompt &optional files backend default initial-input)) (prompt &optional files backend default initial-input))
(defun vc-git--read-start-point (&optional dir)
(let ((branch (car (vc-git-branches))))
(vc-read-revision (format-prompt "Start point" branch)
(list (or dir (vc-git-root default-directory)))
'Git branch)))
(defun vc-git-create-tag (dir name branchp) (defun vc-git-create-tag (dir name branchp)
(let ((default-directory dir) (let ((default-directory dir)
(start-point (when branchp (vc-read-revision (start-point (and branchp (vc-git--read-start-point dir))))
(format-prompt "Start point"
(car (vc-git-branches)))
(list dir) 'Git (car (vc-git-branches))))))
(and (or (zerop (vc-git-command nil t nil "update-index" "--refresh")) (and (or (zerop (vc-git-command nil t nil "update-index" "--refresh"))
(y-or-n-p "Modified files exist. Proceed? ") (y-or-n-p "Modified files exist. Proceed? ")
(user-error (format "Can't create %s with modified files" (user-error (format "Can't create %s with modified files"
@ -2340,7 +2343,7 @@ In other modes, call `vc-deduce-fileset' to determine files to stash."
(vc-resynch-buffer (vc-git-root default-directory) t t)) (vc-resynch-buffer (vc-git-root default-directory) t t))
(defun vc-git-stash-list () (defun vc-git-stash-list ()
(when-let* ((out (vc-git--run-command-string nil "stash" "list"))) (and-let* ((out (vc-git--run-command-string nil "stash" "list")))
(split-string (split-string
(replace-regexp-in-string (replace-regexp-in-string
"^stash@" " " out) "^stash@" " " out)
@ -2389,6 +2392,63 @@ In other modes, call `vc-deduce-fileset' to determine files to stash."
(interactive "e") (interactive "e")
(vc-dir-at-event e (popup-menu vc-git-stash-menu-map e))) (vc-dir-at-event e (popup-menu vc-git-stash-menu-map e)))
(defun vc-git--worktrees ()
"Return an alist of alists regarding this repository's worktrees."
(with-temp-buffer
(vc-git-command nil 0 nil "worktree" "prune")
(vc-git-command t 0 nil "worktree" "list" "--porcelain" "-z")
(let (worktrees current-root current-rest)
(goto-char (point-min))
(while
(re-search-forward "\\=\\(\\([a-zA-Z]+\\)\\(?: \\([^\0]+\\)\\)?\\)?\0"
nil t)
(if (match-string 1)
(let ((k (intern (match-string 2)))
(v (or (match-string 3) t)))
(cond ((and (not current-root) (eq k 'worktree))
(setq current-root (file-name-as-directory v)))
((not (eq k 'worktree))
(push (cons k v) current-rest))
(t
(error "'git worktree' output parse error"))))
(push (cons current-root current-rest) worktrees)
(setq current-root nil current-rest nil)))
(or worktrees
(error "'git worktree' output parse error")))))
(defun vc-git-known-other-working-trees ()
(cl-loop with root = (expand-file-name (vc-git-root default-directory))
for (worktree) in (vc-git--worktrees)
unless (equal worktree root)
collect (abbreviate-file-name worktree)))
(defun vc-git-add-working-tree (directory)
(letrec ((dir (expand-file-name directory))
(vc-filter-command-function #'list) ; see `vc-read-revision'
(revs (vc-git-revision-table nil))
(table (lazy-completion-table table (lambda () revs)))
(branch (completing-read (format-prompt "New or existing branch"
"latest revision, detached")
table nil nil nil 'vc-revision-history))
(args (cond ((string-empty-p branch)
(list "--detach" dir))
((member branch revs)
(list dir branch))
(t
(list "-b" branch dir (vc-git--read-start-point))))))
(apply #'vc-git-command nil 0 nil "worktree" "add" args)))
(defun vc-git-delete-working-tree (directory)
(vc-git-command nil 0 nil "worktree" "remove" "-f"
(expand-file-name directory)))
(defun vc-git-move-working-tree (from to)
;; 'git worktree move' can't move the main worktree, but moving and
;; then repairing like this can.
(rename-file from (directory-file-name to) 1)
(let ((default-directory to))
(vc-git-command nil 0 nil "worktree" "repair")))
;;; Internal commands ;;; Internal commands

View file

@ -1217,7 +1217,7 @@ It is based on `log-edit-mode', and has Hg-specific extensions.")
(defalias 'vc-hg-async-checkins #'always) (defalias 'vc-hg-async-checkins #'always)
(defun vc-hg-checkin (files comment &optional _rev) (defun vc-hg-checkin (files comment &optional _rev)
"Hg-specific version of `vc-backend-checkin'. "Hg-specific version of `vc-BACKEND-checkin'.
REV is ignored." REV is ignored."
(let ((args (nconc (list "commit" "-m") (let ((args (nconc (list "commit" "-m")
(vc-hg--extract-headers comment)))) (vc-hg--extract-headers comment))))
@ -1681,6 +1681,57 @@ Intended for use via the `vc-hg--async-command' wrapper."
(concat "paths." (or remote-name "default"))) (concat "paths." (or remote-name "default")))
(buffer-substring-no-properties (point-min) (1- (point-max)))))) (buffer-substring-no-properties (point-min) (1- (point-max))))))
(defun vc-hg-known-other-working-trees ()
;; Mercurial doesn't maintain records of shared repositories.
;; The first repository knows nothing about shares created from it,
;; and each share only has a reference back to the first repository.
;;
;; Therefore, to support the VC API for other working trees, Emacs
;; needs to maintain records of its own about other working trees.
;; Rather than create something new our strategy is to rely on
;; project.el's knowledge of existing projects.
;; Note that this relies on code calling `vc-hg-add-working-tree'
;; registering the resultant working tree with project.el.
(let* ((our-root (vc-hg-root default-directory))
(our-sp (expand-file-name ".hg/sharedpath" our-root))
our-store shares)
(if (file-exists-p our-sp)
(with-temp-buffer
(insert-file-contents-literally our-sp)
(setq our-store (string-trim (buffer-string)))
(push (abbreviate-file-name (file-name-directory our-store))
shares))
(setq our-store (expand-file-name ".hg" our-root)))
(dolist (root (project-known-project-roots))
(when-let* (((not (equal root our-root)))
(sp (expand-file-name ".hg/sharedpath" root))
((file-exists-p sp)))
(with-temp-buffer
(insert-file-contents-literally sp)
(when (equal our-store (buffer-string))
(push root shares)))))
shares))
(defun vc-hg-add-working-tree (directory)
(vc-hg-command nil 0 nil "share"
(vc-hg-root default-directory)
(expand-file-name directory)))
(defun vc-hg--shared-p (directory)
(file-exists-p (expand-file-name ".hg/sharedpath" directory)))
(defun vc-hg-delete-working-tree (directory)
(if (vc-hg--shared-p directory)
(delete-directory directory t t)
(user-error "\
Cannot delete first working tree because this would break other working trees")))
(defun vc-hg-move-working-tree (from to)
(if (vc-hg--shared-p from)
(rename-file from (directory-file-name to) 1)
(user-error "\
Cannot relocate first working tree because this would break other working trees")))
(provide 'vc-hg) (provide 'vc-hg)
;;; vc-hg.el ends here ;;; vc-hg.el ends here

View file

@ -965,7 +965,11 @@ In the latter case, VC mode is deactivated for this buffer."
"~" #'vc-revision-other-window "~" #'vc-revision-other-window
"R" #'vc-rename-file "R" #'vc-rename-file
"x" #'vc-delete-file "x" #'vc-delete-file
"!" #'vc-edit-next-command) "!" #'vc-edit-next-command
"w c" #'vc-add-working-tree
"w w" #'vc-switch-working-tree
"w x" #'vc-delete-working-tree
"w R" #'vc-move-working-tree)
(fset 'vc-prefix-map vc-prefix-map) (fset 'vc-prefix-map vc-prefix-map)
(define-key ctl-x-map "v" 'vc-prefix-map) (define-key ctl-x-map "v" 'vc-prefix-map)

View file

@ -207,6 +207,17 @@
;; The default implementation deals well with all states that ;; The default implementation deals well with all states that
;; `vc-state' can return. ;; `vc-state' can return.
;; ;;
;; - known-other-working-trees ()
;;
;; Return a list of all other working trees known to use the same
;; backing repository as this working tree. The members of the list
;; are the abbreviated (with `abbreviate-file-name') absolute file
;; names of the root directories of the other working trees.
;; For some VCS, the known working trees will not be all the other
;; working trees, because other working trees can share the same
;; backing repository in a way that's transparent to the original
;; working tree (Mercurial is like this).
;;
;; STATE-CHANGING FUNCTIONS ;; STATE-CHANGING FUNCTIONS
;; ;;
;; * create-repo () ;; * create-repo ()
@ -342,6 +353,31 @@
;; - find-admin-dir (file) ;; - find-admin-dir (file)
;; ;;
;; Return the administrative directory of FILE. ;; Return the administrative directory of FILE.
;;
;; - add-working-tree (directory)
;;
;; Create a new working tree at DIRECTORY that uses the same backing
;; repository as this working tree.
;; What gets checked out in DIRECTORY is left to the backend because
;; while some VCS can check out the same branch in multiple working
;; trees (e.g. Mercurial), others allow each branch to be checked out
;; in only one working tree (e.g. Git).
;; If a new branch should be created then the backend should handle
;; prompting for this, including prompting for a branch or tag from
;; which to start/fork the new branch, like `vc-create-branch'.
;;
;; - delete-working-tree (directory)
;;
;; Remove the working tree, assumed to be one that uses the same
;; backing repository as this working tree, at DIRECTORY.
;; This removal should be unconditional with respect to the state of
;; the working tree: the caller is responsible for checking for
;; uncommitted work in DIRECTORY.
;;
;; - move-working-tree (from to)
;;
;; Relocate the working tree, assumed to be one that uses the same
;; backing repository as this working tree, at FROM to TO.
;; HISTORY FUNCTIONS ;; HISTORY FUNCTIONS
;; ;;
@ -4178,24 +4214,24 @@ to provide the `find-revision' operation instead."
t) t)
(defun vc-default-retrieve-tag (backend dir name update) (defun vc-default-retrieve-tag (backend dir name update)
(if (string= name "") (if (string-empty-p name)
(progn (vc-file-tree-walk dir
(vc-file-tree-walk (lambda (f)
dir (and (vc-up-to-date-p f)
(lambda (f) (and (vc-error-occurred
(vc-up-to-date-p f) (vc-call-backend backend 'checkout f nil "")
(vc-error-occurred (when update
(vc-call-backend backend 'checkout f nil "") (vc-resynch-buffer f t t))))))
(when update (vc-resynch-buffer f t t)))))))
(let ((result (vc-tag-precondition dir))) (let ((result (vc-tag-precondition dir)))
(if (stringp result) (if (stringp result)
(error "File %s is locked" result) (error "File %s is locked" result)
(setq update (and (eq result 'visited) update)) (setq update (and (eq result 'visited) update))
(vc-file-tree-walk (vc-file-tree-walk dir
dir (lambda (f)
(lambda (f) (vc-error-occurred (vc-error-occurred
(vc-call-backend backend 'checkout f nil name) (vc-call-backend backend 'checkout f nil name)
(when update (vc-resynch-buffer f t t))))))))) (when update
(vc-resynch-buffer f t t)))))))))
(defun vc-default-revert (backend file contents-done) (defun vc-default-revert (backend file contents-done)
(unless contents-done (unless contents-done
@ -4301,6 +4337,136 @@ It returns the last revision that changed LINE number in FILE."
(let ((rev (vc-call annotate-extract-revision-at-line file))) (let ((rev (vc-call annotate-extract-revision-at-line file)))
(if (consp rev) (car rev) rev)))) (if (consp rev) (car rev) rev))))
(defun vc-dir-status-files (directory &optional files backend)
"Synchronously run `dir-status-files' VC backend function for DIRECTORY.
FILES is passed to the VC backend function.
BACKEND is defaulted by calling `vc-responsible-backend' on DIRECTORY."
;; The `dir-status-files' API was designed for asynchronous use to
;; populate *vc-dir* buffers; see `vc-dir-refresh'.
;; This function provides Lisp programs with synchronous access to the
;; same information without touching the user's *vc-dir* buffers and
;; without having to add a new VC backend function.
;; It is considerably faster than using `vc-file-tree-walk'
;; (like `vc-tag-precondition' does).
;; This function is in this file despite its `vc-dir-' prefix to avoid
;; having to load `vc-dir' just to get access to this simple wrapper.
(let ((morep t) results)
(with-temp-buffer
(setq default-directory directory)
(vc-call-backend (or backend (vc-responsible-backend directory))
'dir-status-files directory files
(lambda (entries &optional more-to-come)
(let (entry)
(while (setq entry (pop entries))
;; We shouldn't actually get any
;; `up-to-date' or `ignored' entries back,
;; but just in case, pass through a filter.
(unless (memq (cadr entry)
'(up-to-date ignored))
(push entry results))))
(setq morep more-to-come)))
(while morep (accept-process-output)))
(nreverse results)))
;;;###autoload
(defun vc-add-working-tree (backend directory)
"Create working tree DIRECTORY with same backing repository as this tree.
See Info node `(emacs)Other Working Trees' regarding VCS repositories
with multiple working trees."
(interactive
(list
(vc-responsible-backend default-directory)
(read-directory-name "Location for new working tree: "
(file-name-parent-directory
(or (vc-root-dir)
(error "File is not under version control"))))))
(vc-call-backend backend 'add-working-tree directory)
;; `vc-switch-working-tree' relies on project.el registration so try
;; to ensure that both the old and new working trees are registered.
;; `project-current' should not return nil in either case, but don't
;; signal an error if it does.
(when-let* ((p (project-current)))
(project-remember-project p))
(when-let* ((p (project-current nil directory)))
(project-remember-project p))
(vc-dir directory backend))
(defvar project-current-directory-override)
;;;###autoload
(defun vc-switch-working-tree (directory)
"Switch to this file's analogue in working tree DIRECTORY.
This command switches to the file which has the same path
relative to DIRECTORY that this buffer's file has relative
to the root of this working tree.
DIRECTORY names another working tree with the same backing repository as
this tree; see Info node `(emacs)Other Working Trees' for general
information regarding VCS repositories with multiple working trees."
;; FIXME: Switch between directory analogues, too, in Dired buffers.
(interactive
(list
;; FIXME: This should respect `project-prompter'. See bug#79024.
(completing-read "Other working tree to visit: "
(vc-call-backend (vc-responsible-backend default-directory)
'known-other-working-trees)
nil t)))
(let ((project-current-directory-override directory))
(project-find-matching-file)))
;;;###autoload
(defun vc-delete-working-tree (backend directory)
"Delete working tree DIRECTORY with same backing repository as this tree.
See Info node `(emacs)Other Working Trees' regarding VCS repositories
with multiple working trees."
(interactive
(let ((backend (vc-responsible-backend default-directory)))
(list backend
;; FIXME: This should respect `project-prompter'. See bug#79024.
(completing-read "Delete working tree: "
(vc-call-backend backend 'known-other-working-trees)
nil t))))
;; We could consider not prompting here, thus always failing when
;; there is uncommitted work, and requiring the user to review and
;; revert the uncommitted changes before invoking this command again.
;; But other working trees are often created as throwaways to quickly
;; test some changes, so it is more useful to offer to recursively
;; delete them on the user's behalf.
(when (and (vc-dir-status-files directory nil backend)
(not (yes-or-no-p (format "\
%s contains uncommitted work. Continue to recursively delete it?" directory))))
(user-error "Aborted due to uncommitted work in %s" directory))
(project-forget-project directory)
(vc-call-backend backend 'delete-working-tree directory))
(autoload 'dired-rename-subdir "dired-aux")
;;;###autoload
(defun vc-move-working-tree (backend from to)
"Relocate a working tree from FROM to TO.
See Info node `(emacs)Other Working Trees' regarding VCS repositories
with multiple working trees."
(interactive
(let ((backend (vc-responsible-backend default-directory)))
(list backend
;; FIXME: This should respect `project-prompter'. See bug#79024.
(completing-read "Relocate working tree: "
(vc-call-backend backend 'known-other-working-trees)
nil t)
(read-directory-name "New location for working tree: "
(file-name-parent-directory (vc-root-dir))))))
(let ((inhibit-message t))
(project-forget-project from))
(vc-call-backend backend 'move-working-tree from to)
;; Update visited file names for buffers visiting files under FROM.
;; FIXME: Also update VC-Dir buffers.
(dired-rename-subdir (expand-file-name from) (expand-file-name to))
(when-let* ((p (project-current nil to)))
(project-remember-project p)))
;; These things should probably be generally available ;; These things should probably be generally available

View file

@ -44,6 +44,7 @@
;; - latest-on-branch-p (file) ;; - latest-on-branch-p (file)
;; * checkout-model (files) DONE ;; * checkout-model (files) DONE
;; - mode-line-string (file) ;; - mode-line-string (file)
;; - other-working-trees () DONE
;; STATE-CHANGING FUNCTIONS ;; STATE-CHANGING FUNCTIONS
;; ;;
@ -65,6 +66,9 @@
;; - modify-change-comment (files rev comment) ;; - modify-change-comment (files rev comment)
;; - mark-resolved (files) ;; - mark-resolved (files)
;; - find-admin-dir (file) ;; - find-admin-dir (file)
;; - add-working-tree (directory) DONE
;; - delete-working-tree (directory) DONE
;; - move-working-tree (from to) DONE
;; HISTORY FUNCTIONS ;; HISTORY FUNCTIONS
;; ;;
@ -656,6 +660,103 @@ This checks also `vc-backend' and `vc-responsible-backend'."
(ignore-errors (ignore-errors
(run-hooks 'vc-test--cleanup-hook)))))) (run-hooks 'vc-test--cleanup-hook))))))
(defun vc-test--other-working-trees (backend)
"Test other working trees actions."
(ert-with-temp-directory tempdir
(let ((vc-handled-backends `(,backend))
(default-directory
(file-name-as-directory
(expand-file-name
(make-temp-name "vc-test") temporary-file-directory)))
(process-environment process-environment)
vc-test--cleanup-hook)
(unwind-protect
(progn
;; Cleanup.
(add-hook
'vc-test--cleanup-hook
(let ((dir default-directory))
(lambda ()
(delete-directory dir 'recursive)
(dolist (name '("first" "second" "first"))
(project-forget-project
(expand-file-name name default-directory))))))
(let* ((first (file-name-as-directory
(expand-file-name "first" default-directory)))
(second (file-name-as-directory
(expand-file-name "second" default-directory)))
(third (file-name-as-directory
(expand-file-name "third" default-directory)))
(tmp-name (expand-file-name "foo" first)))
;; Set up the first working tree.
(make-directory first t)
(let ((default-directory first))
(vc-test--create-repo-function backend)
(write-region "foo" nil tmp-name nil 'nomessage)
(vc-register `(,backend (,(file-name-nondirectory tmp-name)))))
(with-current-buffer (find-file-noselect tmp-name)
(vc-checkin (list (file-name-nondirectory tmp-name)) backend)
(insert "Testing other working trees")
(let (vc-async-checkin)
(log-edit-done))
;; Set up the second working tree.
;; For the backends which do additional prompting (as
;; specified in the API for this backend function) we
;; need to stub that out.
(cl-ecase backend
(Git (cl-letf (((symbol-function 'completing-read)
(lambda (&rest _ignore) "")))
(vc-add-working-tree backend second)))
(Hg (vc-add-working-tree backend second))))
;; Test `known-other-working-trees'.
(with-current-buffer (find-file-noselect tmp-name)
(should
(equal (list second)
(vc-call-backend backend 'known-other-working-trees)))
(let ((default-directory second))
(should
(equal (list first)
(vc-call-backend backend 'known-other-working-trees))))
;; Test `move-working-tree'.
(vc-move-working-tree backend second third)
(should
(equal (list third)
(vc-call-backend backend 'known-other-working-trees)))
(should-not (file-directory-p second))
(should (file-directory-p third))
;; Moving the first working tree is only supported
;; for some backends.
(cl-ecase backend
(Git
(let ((default-directory third))
(vc-move-working-tree backend first second))
(let ((default-directory third))
(should
(equal (list second)
(vc-call-backend backend
'known-other-working-trees))))
(should-not (file-directory-p first))
(should (file-directory-p second))
(vc-move-working-tree backend second first))
(Hg
(let ((default-directory third))
(should-error (vc-move-working-tree backend
first second)))))
;; Test `delete-working-tree'.
(let ((default-directory first))
(vc-delete-working-tree backend third)
(should-not (file-directory-p third))))))
;; Save exit.
(ignore-errors
(run-hooks 'vc-test--cleanup-hook))))))
;; Create the test cases. ;; Create the test cases.
(defun vc-test--rcs-enabled () (defun vc-test--rcs-enabled ()
@ -794,7 +895,23 @@ This checks also `vc-backend' and `vc-responsible-backend'."
(eq system-type 'windows-nt) (eq system-type 'windows-nt)
noninteractive)) noninteractive))
(vc-test--version-diff ',backend)) (vc-test--version-diff ',backend))
))))
(ert-deftest
,(intern (format "vc-test-%s07-other-working-trees" backend-string)) ()
,(format "Check other working trees functions for the %s backend."
backend-string)
(skip-unless
(ert-test-passed-p
(ert-test-most-recent-result
(ert-get-test
',(intern
(format "vc-test-%s01-register" backend-string))))))
(skip-unless (memq ',backend '(Git Hg)))
(skip-when
(and (eq ',backend 'Hg)
(equal (car (process-lines-ignore-status "hg" "share"))
"hg: unknown command 'share'")))
(vc-test--other-working-trees ',backend))))))
(provide 'vc-tests) (provide 'vc-tests)
;;; vc-tests.el ends here ;;; vc-tests.el ends here