emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/magit 8b1f599de4: Provide set of recommended global key bi


From: ELPA Syncer
Subject: [nongnu] elpa/magit 8b1f599de4: Provide set of recommended global key bindings
Date: Fri, 2 Jun 2023 16:01:54 -0400 (EDT)

branch: elpa/magit
commit 8b1f599de4c54957d7dfbd2bc0fed2d9e04760a0
Author: Jonas Bernoulli <jonas@bernoul.li>
Commit: Jonas Bernoulli <jonas@bernoul.li>

    Provide set of recommended global key bindings
    
    Also update related parts of the manual that were very outdated.
---
 docs/magit.org  | 323 +++++++++++++++++++++++++++--------------
 docs/magit.texi | 441 +++++++++++++++++++++++++++++++++++++++++---------------
 lisp/magit.el   |  93 +++++++-----
 3 files changed, 587 insertions(+), 270 deletions(-)

diff --git a/docs/magit.org b/docs/magit.org
index d58d3a8fae..2ac450c8c7 100644
--- a/docs/magit.org
+++ b/docs/magit.org
@@ -348,17 +348,25 @@ commands" or just "transients".)
 The key bindings in that menu correspond to the bindings in Magit
 buffers, including but not limited to the status buffer.  So you could
 type ~h d~ to bring up the diff menu, but once you remember that "d"
-stands for "diff", you would usually do so by just typing ~d~.  But this
-"prefix of prefixes" is useful even once you have memorized all the
-bindings, as it can provide easy access to Magit commands from
-non-Magit buffers.  The global binding is ~C-x M-g~.
+stands for "diff", you would usually do so by just typing ~d~.
 
-In file visiting buffers ~C-c M-g~ brings up a similar menu featuring
-commands that act on just the visited file, see [[*Commands for Buffers
-Visiting Files]].
+This "prefix of prefixes" is useful even once you have memorized all
+the bindings, as it can provide easy access to Magit commands from
+non-Magit buffers.  So, by default, it is globally bound to ~C-x M-g~.
 
-Magit also provides a context menu and other mouse commands, see
-[[*Mouse Support]].
+A similar menu featuring (for the most part) commands that act on just
+the file being visited in the current buffer, is globally bound to ~C-c
+M-g~.  That binding can also be used in buffers, which do not visit a
+file, but then only a subset of the commands is available.
+
+The global key bindings mentioned in the previous two paragraphs are
+quite inconvenient.  We recommend using ~C-c g~ and ~C-c f~ instead, but
+cannot use those key sequences by default because they are strickly
+reserved for bindings added by the user.  See [[*Global Bindings]], if you
+want to explicitly opt-in to the recommended key bindings.
+
+Magit also provides context menus and other mouse commands, see [[*Mouse
+Support]].
 
 It is not necessary that you do so now, but if you stick with Magit,
 then it is highly recommended that you read the next section too.
@@ -1242,7 +1250,8 @@ used the package ~magit-popup~ and even earlier versions 
library
 
 Transient is documented in [[info:transient]].
 
-- Key: C-c C-c (magit-dispatch) ::
+- Key: C-x M-g (magit-dispatch) ::
+- Key: C-c g (magit-dispatch) ::
 
   This transient prefix command binds most of Magit's other prefix
   commands as suffix commands and displays them in a temporary buffer
@@ -1250,12 +1259,11 @@ Transient is documented in [[info:transient]].
   suffixes of that command to be bound and displayed instead of those
   of ~magit-dispatch~.
 
-This command is also, or especially, useful outside Magit buffers, so
-you should setup a global binding:
-
-#+begin_src emacs-lisp
-  (global-set-key (kbd "C-x M-g") 'magit-dispatch)
-#+end_src
+  This command is also, or especially, useful outside Magit buffers,
+  so Magit by default binds it to ~C-c M-g~ in the global keymap.
+  ~C-c g~ would be a better binding, but we cannot use that by default,
+  because that key sequence is reserved for the user.  See [[*Global
+  Bindings]] to learn more default and recommended key bindings.
 
 ** Transient Arguments and Buffer Variables
 
@@ -4040,15 +4048,31 @@ argument.
 
 Also see [[man:git-blame]]
 
-To start blaming invoke the ~magit-file-dispatch~ transient prefix
-command by pressing ~C-c M-g~.
-
-The blaming suffix commands can be invoked from the dispatch
-transient.  However if you want to set an infix argument, then you
-have to enter the blaming sub-transient first.
-
-The key bindings shown below assume that you enter the dispatch
-transient using the default binding.
+To start blaming, invoke the ~magit-file-dispatch~ transient prefix
+command.  When using the default key bindings, that can be done
+by pressing ~C-c M-g~.  When using the recommended bindings, this
+command is instead bound to ~C-c f~.  Also see [[*Global Bindings]].
+
+The blaming suffix commands can be invoked directly from the file
+dispatch transient.  However if you want to set an infix argument,
+then you have to enter the blaming sub-prefix first.
+
+- Key: C-c f B (magit-blame) ::
+- Key: C-c f b (magit-blame-addition) ::
+- Key: C-c f B b ::
+- Key: C-c f r (magit-blame-removal) ::
+- Key: C-c f B r ::
+- Key: C-c f f (magit-blame-reverse) ::
+- Key: C-c f B f ::
+- Key: C-c f e (magit-blame-echo) ::
+- Key: C-c f B e ::
+- Key: C-c f q (magit-blame-quit) ::
+- Key: C-c f B q ::
+
+  Each of these commands is documented individually right below,
+  alongside their default key bindings.  The bindings shown above
+  are the recommended bindings, which you can enable by following
+  the instructions in [[*Global Bindings]].
 
 - Key: C-c M-g B (magit-blame) ::
 
@@ -4107,6 +4131,12 @@ enabled and Read-Only mode is not enabled.  These 
commands are also
 available in other buffers; here only the behavior is described that
 is relevant in file-visiting buffers that are being blamed.
 
+- Key: C-c M-g q (magit-blame-quit) ::
+- Key: C-c M-g B q ::
+
+  This command turns off Magit-Blame mode.  If the buffer was created
+  during a recursive blame, then it also kills the buffer.
+
 - Key: RET (magit-show-commit) ::
 
   This command shows the commit that last touched the line at point.
@@ -7517,45 +7547,101 @@ before making changes that could cause the loss of 
earlier changes.
 
 ** Commands for Buffers Visiting Files
 
-Magit defines a few global key bindings unless the user sets
-~magit-define-global-key-bindings~ to ~nil~.  This includes binding ~C-c
-M-g~ to ~magit-file-dispatch~.  ~C-c g~ would be a much better binding
-but the ~C-c <letter>~ namespace is reserved for users, meaning that
-packages are not allowed to use it.  If you want to use ~C-c g~, then
-you have to add that binding yourself.  Also see [[*Default Bindings]]
-and [[info:elisp#Key Binding Conventions]].
+By default Magit defines a few global key bindings.  These bindings
+are a compromise between providing no bindings at all and providing
+the better bindings I would have liked to use instead.  Magit cannot
+provide the set of recommended bindings by default because those key
+sequences are stricktly reserved for bindings added by the user.
+Also see [[*Global Bindings]] and [[info:elisp#Key Binding Conventions]].
+
+To use the recommended bindings, add this to your init file and
+restart Emacs.
+
+#+begin_src emacs-lisp
+  (setq magit-define-global-key-bindings 'recommended)
+#+end_src
 
-If you want a better binding, you have to add it yourself:
+If you don't want Magit to add any bindings to the global keymap at
+all, add this to your init file and restart Emacs.
 
 #+begin_src emacs-lisp
-  (global-set-key (kbd "C-c g") 'magit-file-dispatch)
+  (setq magit-define-global-key-bindings nil)
 #+end_src
 
-The key bindings shown below assume that you have not improved the
-binding for ~magit-file-dispatch~.
+- Key: C-c f (magit-file-dispatch) ::
+- Key: C-c f s (magit-stage-file) ::
+- Key: C-c f s (magit-stage-buffer-file) ::
+- Key: C-c f u (magit-unstage-file) ::
+- Key: C-c f u (magit-unstage-buffer-file) ::
+- Key: C-c f , x (magit-file-untrack) ::
+- Key: C-c f , r (magit-file-rename) ::
+- Key: C-c f , k (magit-file-delete) ::
+- Key: C-c f , c (magit-file-checkout) ::
+- Key: C-c f D (magit-diff) ::
+- Key: C-c f d (magit-diff-buffer-file) ::
+- Key: C-c f L (magit-log) ::
+- Key: C-c f l (magit-log-buffer-file) ::
+- Key: C-c f t (magit-log-trace-definition) ::
+- Key: C-c f M (magit-log-merged) ::
+- Key: C-c f B (magit-blame) ::
+- Key: C-c f b (magit-blame-additions) ::
+- Key: C-c f r (magit-blame-removal) ::
+- Key: C-c f f (magit-blame-reverse) ::
+- Key: C-c f m (magit-blame-echo) ::
+- Key: C-c f q (magit-blame-quit) ::
+- Key: C-c f p (magit-blob-previous) ::
+- Key: C-c f n (magit-blob-next) ::
+- Key: C-c f v (magit-find-file) ::
+- Key: C-c f V (magit-blob-visit-file) ::
+- Key: C-c f g (magit-status-here) ::
+- Key: C-c f G (magit-display-repository-buffer) ::
+- Key: C-c f c (magit-commit) ::
+- Key: C-c f e (magit-edit-line-commit) ::
+
+  Each of these commands is documented individually right below,
+  alongside their default key bindings.  The bindings shown above
+  are the recommended bindings, which you can enable by following
+  the instructions further up.
 
 - Key: C-c M-g (magit-file-dispatch) ::
 
   This transient prefix command binds the following suffix commands
   and displays them in a temporary buffer until a suffix is invoked.
 
-  When invoked in a buffer that does not visit a file, then it falls
-  back to regular ~magit-dispatch~.
-
 - Key: C-c M-g s (magit-stage-file) ::
+- Key: C-c M-g s (magit-stage-buffer-file) ::
 
   Stage all changes to the file being visited in the current buffer.
+  When not visiting a file, then the first command is used, which
+  prompts for a file.
 
 - Key: C-c M-g u (magit-unstage-file) ::
+- Key: C-c M-g u (magit-unstage-buffer-file) ::
 
   Unstage all changes to the file being visited in the current buffer.
+  When not visiting a file, then the first command is used, which
+  prompts for a file.
 
-- Key: C-c M-g c (magit-commit) ::
+- Key: C-c M-g , x (magit-file-untrack) ::
 
-  This transient prefix command binds the following suffix commands
-  along with the appropriate infix arguments and displays them in a
-  temporary buffer until a suffix is invoked.  See [[*Initiating a
-  Commit]].
+  This command untracks a file read from the user, defaulting to the
+  visited file.
+
+- Key: C-c M-g , r (magit-file-rename) ::
+
+  This command renames a file read from the user, defaulting to the
+  visited file.
+
+- Key: C-c M-g , k (magit-file-delete) ::
+
+  This command deletes a file read from the user, defaulting to the
+  visited file.
+
+- Key: C-c M-g , c (magit-file-checkout) ::
+
+  This command updates a file in the working tree and index to the
+  contents from a revision.  Both the revision and file are read
+  from the user.
 
 - Key: C-c M-g D (magit-diff) ::
 
@@ -7596,14 +7682,20 @@ binding for ~magit-file-dispatch~.
   or when ~--follow~ is an active log argument.  When the region is
   active, the log is restricted to the selected line range.
 
+- User Option: magit-log-buffer-file-locked ::
+
+  This option controls whether ~magit-log-buffer-file~ uses a dedicated
+  buffer.  See [[*Modes and Buffers]].
+
 - Key: C-c M-g t (magit-log-trace-definition) ::
 
   This command shows the log for the definition at point.
 
-- User Option: magit-log-buffer-file-locked ::
+- Key: C-c M-g M (magit-log-merged) ::
 
-  This option controls whether ~magit-log-buffer-file~ uses a dedicated
-  buffer.  See [[*Modes and Buffers]].
+  This command reads a commit and a branch in shows a log concerning
+  the merge of the former into the latter.  This shows multiple commits
+  even in case of a fast-forward merge.
 
 - Key: C-c M-g B (magit-blame) ::
 
@@ -7614,48 +7706,59 @@ binding for ~magit-file-dispatch~.
   For more information about this and the following commands also see
   [[*Blaming]].
 
-In addition to the ~magit-blame~ sub-transient, the dispatch transient
-also binds several blaming suffix commands directly.  See [[*Blaming]] for
-information about those commands and bindings.
+  In addition to the ~magit-blame~ sub-transient, the dispatch transient
+  also binds several blaming suffix commands directly.  See [[*Blaming]]
+  for information about those commands and bindings.
 
-- Key: C-c M-g e (magit-edit-line-commit) ::
+- Key: C-c M-g p (magit-blob-previous) ::
 
-  This command makes the commit editable that added the current line.
+  This command visits the previous blob which modified the current
+  file.
 
-  With a prefix argument it makes the commit editable that removes the
-  line, if any.  The commit is determined using ~git blame~ and made
-  editable using ~git rebase --interactive~ if it is reachable from
-  ~HEAD~, or by checking out the commit (or a branch that points at it)
-  otherwise.
+- Key: C-c M-g n (magit-blob-next) ::
 
-- Key: C-c M-g p (magit-blob-previous) ::
+  This command visits the next blob which modified the current file.
 
-  Visit the previous blob which modified the current file.
+- Key: C-c M-g v (magit-find-file) ::
 
-There are a few additional commands that operate on a single file but
-are not enabled in the file transient command by default:
+  This command reads a revision and file and visits the respective
+  blob.
 
-- Command: magit-file-rename ::
+- Key: C-c M-g V (magit-blob-visit-file) ::
 
-  This command renames a file read from the user.
+  This command visits the file from the working tree, corresponding
+  to the current blob.  When visiting a blob or the version from the
+  index, then it goes to the same location in the respective file in
+  the working tree.
 
-- Command: magit-file-delete ::
+- Key: C-c M-g g (magit-status-here) ::
 
-  This command deletes a file read from the user.
+  This command displays the status of the current repository in a
+  buffer, like ~magit-status~ does.  Additionally it tries to go to
+  the position in that buffer, which corresponds to the position
+  in the current file-visiting buffer (if any).
 
-- Command: magit-file-untrack ::
+- Key: C-c M-g G (magit-display-repository-buffer) ::
 
-  This command untracks a file read from the user.
+  This command reads and displays a Magit buffer belonging to the
+  current repository, without refreshing it.
 
-- Command: magit-file-checkout ::
+- Key: C-c M-g c (magit-commit) ::
 
-  This command updates a file in the working tree and index to the
-  contents from a revision.  Both the revision and file are read
-  from the user.
+  This transient prefix command binds the following suffix commands
+  along with the appropriate infix arguments and displays them in a
+  temporary buffer until a suffix is invoked.  See [[*Initiating a
+  Commit]].
 
-To enable them invoke the transient (~C-c M-g~), enter "edit mode" (~C-x
-l~), set the "transient level" (~C-x l~ again), enter ~5~, and leave edit
-mode (~C-g~).  Also see [[info:transient#Enabling and Disabling Suffixes]].
+- Key: C-c M-g e (magit-edit-line-commit) ::
+
+  This command makes the commit editable that added the current line.
+
+  With a prefix argument it makes the commit editable that removes the
+  line, if any.  The commit is determined using ~git blame~ and made
+  editable using ~git rebase --interactive~ if it is reachable from
+  ~HEAD~, or by checking out the commit (or a branch that points at it)
+  otherwise.
 
 ** Minor Mode for Buffers Visiting Blobs
 
@@ -8027,55 +8130,55 @@ you notice a notable difference try using the latter as
 
 [fn:mac1] 
https://lists.gnu.org/archive/html/bug-gnu-emacs/2017-04/msg00201.html
 
-*** Default Bindings
+*** Global Bindings
 
 - User Option: magit-define-global-key-bindings ::
 
-  This option controls whether some Magit commands are automatically
-  bound in the global keymap even before Magit is used for the first
-  time in the current session.
+  This option controls which set of Magit key bindings, if any, may
+  be added to the global keymap, even before Magit is first used in
+  the current Emacs session.
 
-  If this variable is non-nil, which it is by default, then the
-  following bindings may be added to the global keymap.
+  - If the value is ~nil~, no bindings are added.
 
-  | ~C-x g~   | ~magit-status~        |
-  | ~C-x M-g~ | ~magit-dispatch~      |
-  | ~C-c M-g~ | ~magit-file-dispatch~ |
+  - If ~default~, maybe add:
 
-  These bindings may be added when ~after-init-hook~ is run.
-  Each binding is added if and only if at that time no other key
-  is bound to the same command and no other command is bound to
-  the same key.  In other words we try to avoid adding bindings
-  that are unnecessary, as well as bindings that conflict with
-  other bindings.
+    | ~C-x g~   | ~magit-status~        |
+    | ~C-x M-g~ | ~magit-dispatch~      |
+    | ~C-c M-g~ | ~magit-file-dispatch~ |
 
-  Adding the above bindings is delayed until ~after-init-hook~
-  is called to allow users to set the variable anywhere in their
-  init file (without having to make sure to do so before ~magit~
-  is loaded or autoloaded) and to increase the likelihood that
-  all the potentially conflicting user bindings have already
-  been added.
+  - If ~recommended~, maybe add:
+
+    | ~C-x g~ | ~magit-status~        |
+    | ~C-c g~ | ~magit-dispatch~      |
+    | ~C-c f~ | ~magit-file-dispatch~ |
+
+    These bindings are strongly recommended, but we cannot use
+    them by default, because the ~C-c <LETTER>~ namespace is
+    strictly reserved for bindings added by the user (see
+    [[info:elisp#Key Binding Conventions]]).
+
+  The bindings in the chosen set may be added when
+  ~after-init-hook~ is run.  Each binding is added if, and only
+  if, at that time no other key is bound to the same command,
+  and no other command is bound to the same key.  In other words
+  we try to avoid adding bindings that are unnecessary, as well
+  as bindings that conflict with other bindings.
+
+  Adding these bindings is delayed until ~after-init-hook~ is
+  run to allow users to set the variable anywhere in their init
+  file (without having to make sure to do so before ~magit~ is
+  loaded or autoloaded) and to increase the likelihood that all
+  the potentially conflicting user bindings have already been
+  added.
 
   To set this variable use either ~setq~ or the Custom interface.
   Do not use the function ~customize-set-variable~ because doing
-  that would cause Magit to be loaded immediately when that form
+  that would cause Magit to be loaded immediately, when that form
   is evaluated (this differs from ~custom-set-variables~, which
   doesn't load the libraries that define the customized variables).
 
-  Setting this variable to nil has no effect if that is done after
-  the key bindings have already been added.
-
-  We recommend that you bind ~C-c g~ instead of ~C-c M-g~ to
-  ~magit-file-dispatch~.  The former is a much better binding
-  but the ~C-c <letter>~ namespace is strictly reserved for
-  users; preventing Magit from using it by default.
-
-  #+BEGIN_SRC emacs-lisp
-    (global-set-key (kbd "C-c g") 'magit-file-dispatch)
-  #+END_SRC
-
-  Also see [[*Commands for Buffers Visiting Files]] and [[info:elisp#Key
-  Binding Conventions]].
+  Setting this variable has no effect if ~after-init-hook~ has
+  already been run.
 
 * Plumbing
 
diff --git a/docs/magit.texi b/docs/magit.texi
index f54b1a7af1..987dd244e2 100644
--- a/docs/magit.texi
+++ b/docs/magit.texi
@@ -276,7 +276,7 @@ Essential Settings
 
 * Safety::
 * Performance::
-* Default Bindings::
+* Global Bindings::
 
 
 Plumbing
@@ -681,16 +681,24 @@ commands" or just "transients".)
 The key bindings in that menu correspond to the bindings in Magit
 buffers, including but not limited to the status buffer.  So you could
 type @code{h d} to bring up the diff menu, but once you remember that "d"
-stands for "diff", you would usually do so by just typing @code{d}.  But this
-"prefix of prefixes" is useful even once you have memorized all the
-bindings, as it can provide easy access to Magit commands from
-non-Magit buffers.  The global binding is @code{C-x M-g}.
+stands for "diff", you would usually do so by just typing @code{d}.
 
-In file visiting buffers @code{C-c M-g} brings up a similar menu featuring
-commands that act on just the visited file, see @ref{Commands for Buffers 
Visiting Files}.
+This "prefix of prefixes" is useful even once you have memorized all
+the bindings, as it can provide easy access to Magit commands from
+non-Magit buffers.  So, by default, it is globally bound to @code{C-x M-g}.
 
-Magit also provides a context menu and other mouse commands, see
-@ref{Mouse Support}.
+A similar menu featuring (for the most part) commands that act on just
+the file being visited in the current buffer, is globally bound to @code{C-c
+M-g}.  That binding can also be used in buffers, which do not visit a
+file, but then only a subset of the commands is available.
+
+The global key bindings mentioned in the previous two paragraphs are
+quite inconvenient.  We recommend using @code{C-c g} and @code{C-c f} instead, 
but
+cannot use those key sequences by default because they are strickly
+reserved for bindings added by the user.  See @ref{Global Bindings}, if you
+want to explicitly opt-in to the recommended key bindings.
+
+Magit also provides context menus and other mouse commands, see @ref{Mouse 
Support}.
 
 It is not necessary that you do so now, but if you stick with Magit,
 then it is highly recommended that you read the next section too.
@@ -1671,22 +1679,22 @@ used the package @code{magit-popup} and even earlier 
versions library
 Transient is documented in @ref{Top,,,transient,}.
 
 @table @asis
-@item @kbd{C-c C-c} (@code{magit-dispatch})
-@kindex C-c C-c
+@item @kbd{C-x M-g} (@code{magit-dispatch})
+@itemx @kbd{C-c g} (@code{magit-dispatch})
+@kindex C-x M-g
+@kindex C-c g
 @findex magit-dispatch
 This transient prefix command binds most of Magit's other prefix
 commands as suffix commands and displays them in a temporary buffer
 until one of them is invoked.  Invoking such a sub-prefix causes the
 suffixes of that command to be bound and displayed instead of those
 of @code{magit-dispatch}.
-@end table
 
-This command is also, or especially, useful outside Magit buffers, so
-you should setup a global binding:
-
-@lisp
-(global-set-key (kbd "C-x M-g") 'magit-dispatch)
-@end lisp
+This command is also, or especially, useful outside Magit buffers,
+so Magit by default binds it to @code{C-c M-g} in the global keymap.
+@code{C-c g} would be a better binding, but we cannot use that by default,
+because that key sequence is reserved for the user.  See @ref{Global Bindings} 
to learn more default and recommended key bindings.
+@end table
 
 @node Transient Arguments and Buffer Variables
 @section Transient Arguments and Buffer Variables
@@ -5023,17 +5031,49 @@ the <a 
href="http://git-scm.com/docs/git-blame";>git-blame(1)</a> manpage.
 the git-blame(1) manpage.
 @end iftex
 
-To start blaming invoke the @code{magit-file-dispatch} transient prefix
-command by pressing @code{C-c M-g}.
+To start blaming, invoke the @code{magit-file-dispatch} transient prefix
+command.  When using the default key bindings, that can be done
+by pressing @code{C-c M-g}.  When using the recommended bindings, this
+command is instead bound to @code{C-c f}.  Also see @ref{Global Bindings}.
 
-The blaming suffix commands can be invoked from the dispatch
-transient.  However if you want to set an infix argument, then you
-have to enter the blaming sub-transient first.
-
-The key bindings shown below assume that you enter the dispatch
-transient using the default binding.
+The blaming suffix commands can be invoked directly from the file
+dispatch transient.  However if you want to set an infix argument,
+then you have to enter the blaming sub-prefix first.
 
 @table @asis
+@item @kbd{C-c f B} (@code{magit-blame})
+@itemx @kbd{C-c f b} (@code{magit-blame-addition})
+@itemx @kbd{C-c f B b}
+@itemx @kbd{C-c f r} (@code{magit-blame-removal})
+@itemx @kbd{C-c f B r}
+@itemx @kbd{C-c f f} (@code{magit-blame-reverse})
+@itemx @kbd{C-c f B f}
+@itemx @kbd{C-c f e} (@code{magit-blame-echo})
+@itemx @kbd{C-c f B e}
+@itemx @kbd{C-c f q} (@code{magit-blame-quit})
+@itemx @kbd{C-c f B q}
+@kindex C-c f B
+@kindex C-c f b
+@kindex C-c f B b
+@kindex C-c f r
+@kindex C-c f B r
+@kindex C-c f f
+@kindex C-c f B f
+@kindex C-c f e
+@kindex C-c f B e
+@kindex C-c f q
+@kindex C-c f B q
+@findex magit-blame
+@findex magit-blame-addition
+@findex magit-blame-removal
+@findex magit-blame-reverse
+@findex magit-blame-echo
+@findex magit-blame-quit
+Each of these commands is documented individually right below,
+alongside their default key bindings.  The bindings shown above
+are the recommended bindings, which you can enable by following
+the instructions in @ref{Global Bindings}.
+
 @item @kbd{C-c M-g B} (@code{magit-blame})
 @kindex C-c M-g B
 @findex magit-blame
@@ -5104,6 +5144,14 @@ available in other buffers; here only the behavior is 
described that
 is relevant in file-visiting buffers that are being blamed.
 
 @table @asis
+@item @kbd{C-c M-g q} (@code{magit-blame-quit})
+@itemx @kbd{C-c M-g B q}
+@kindex C-c M-g q
+@kindex C-c M-g B q
+@findex magit-blame-quit
+This command turns off Magit-Blame mode.  If the buffer was created
+during a recursive blame, then it also kills the buffer.
+
 @item @kbd{@key{RET}} (@code{magit-show-commit})
 @kindex RET
 @findex magit-show-commit
@@ -9350,49 +9398,170 @@ Mode-line lighter for 
@code{magit-wip-initial-backup-mode}.
 @node Commands for Buffers Visiting Files
 @section Commands for Buffers Visiting Files
 
-Magit defines a few global key bindings unless the user sets
-@code{magit-define-global-key-bindings} to @code{nil}.  This includes binding 
@code{C-c
-M-g} to @code{magit-file-dispatch}.  @code{C-c g} would be a much better 
binding
-but the @code{C-c <letter>} namespace is reserved for users, meaning that
-packages are not allowed to use it.  If you want to use @code{C-c g}, then
-you have to add that binding yourself.  Also see @ref{Default Bindings}
-and @ref{Key Binding Conventions,,,elisp,}.
+By default Magit defines a few global key bindings.  These bindings
+are a compromise between providing no bindings at all and providing
+the better bindings I would have liked to use instead.  Magit cannot
+provide the set of recommended bindings by default because those key
+sequences are stricktly reserved for bindings added by the user.
+Also see @ref{Global Bindings} and @ref{Key Binding Conventions,,,elisp,}.
 
-If you want a better binding, you have to add it yourself:
+To use the recommended bindings, add this to your init file and
+restart Emacs.
 
 @lisp
-(global-set-key (kbd "C-c g") 'magit-file-dispatch)
+(setq magit-define-global-key-bindings 'recommended)
 @end lisp
 
-The key bindings shown below assume that you have not improved the
-binding for @code{magit-file-dispatch}.
+If you don't want Magit to add any bindings to the global keymap at
+all, add this to your init file and restart Emacs.
+
+@lisp
+(setq magit-define-global-key-bindings nil)
+@end lisp
 
 @table @asis
+@item @kbd{C-c f} (@code{magit-file-dispatch})
+@itemx @kbd{C-c f s} (@code{magit-stage-file})
+@itemx @kbd{C-c f s} (@code{magit-stage-buffer-file})
+@itemx @kbd{C-c f u} (@code{magit-unstage-file})
+@itemx @kbd{C-c f u} (@code{magit-unstage-buffer-file})
+@itemx @kbd{C-c f , x} (@code{magit-file-untrack})
+@itemx @kbd{C-c f , r} (@code{magit-file-rename})
+@itemx @kbd{C-c f , k} (@code{magit-file-delete})
+@itemx @kbd{C-c f , c} (@code{magit-file-checkout})
+@itemx @kbd{C-c f D} (@code{magit-diff})
+@itemx @kbd{C-c f d} (@code{magit-diff-buffer-file})
+@itemx @kbd{C-c f L} (@code{magit-log})
+@itemx @kbd{C-c f l} (@code{magit-log-buffer-file})
+@itemx @kbd{C-c f t} (@code{magit-log-trace-definition})
+@itemx @kbd{C-c f M} (@code{magit-log-merged})
+@itemx @kbd{C-c f B} (@code{magit-blame})
+@itemx @kbd{C-c f b} (@code{magit-blame-additions})
+@itemx @kbd{C-c f r} (@code{magit-blame-removal})
+@itemx @kbd{C-c f f} (@code{magit-blame-reverse})
+@itemx @kbd{C-c f m} (@code{magit-blame-echo})
+@itemx @kbd{C-c f q} (@code{magit-blame-quit})
+@itemx @kbd{C-c f p} (@code{magit-blob-previous})
+@itemx @kbd{C-c f n} (@code{magit-blob-next})
+@itemx @kbd{C-c f v} (@code{magit-find-file})
+@itemx @kbd{C-c f V} (@code{magit-blob-visit-file})
+@itemx @kbd{C-c f g} (@code{magit-status-here})
+@itemx @kbd{C-c f G} (@code{magit-display-repository-buffer})
+@itemx @kbd{C-c f c} (@code{magit-commit})
+@itemx @kbd{C-c f e} (@code{magit-edit-line-commit})
+@kindex C-c f
+@kindex C-c f s
+@kindex C-c f s
+@kindex C-c f u
+@kindex C-c f u
+@kindex C-c f , x
+@kindex C-c f , r
+@kindex C-c f , k
+@kindex C-c f , c
+@kindex C-c f D
+@kindex C-c f d
+@kindex C-c f L
+@kindex C-c f l
+@kindex C-c f t
+@kindex C-c f M
+@kindex C-c f B
+@kindex C-c f b
+@kindex C-c f r
+@kindex C-c f f
+@kindex C-c f m
+@kindex C-c f q
+@kindex C-c f p
+@kindex C-c f n
+@kindex C-c f v
+@kindex C-c f V
+@kindex C-c f g
+@kindex C-c f G
+@kindex C-c f c
+@kindex C-c f e
+@findex magit-file-dispatch
+@findex magit-stage-file
+@findex magit-stage-buffer-file
+@findex magit-unstage-file
+@findex magit-unstage-buffer-file
+@findex magit-file-untrack
+@findex magit-file-rename
+@findex magit-file-delete
+@findex magit-file-checkout
+@findex magit-diff
+@findex magit-diff-buffer-file
+@findex magit-log
+@findex magit-log-buffer-file
+@findex magit-log-trace-definition
+@findex magit-log-merged
+@findex magit-blame
+@findex magit-blame-additions
+@findex magit-blame-removal
+@findex magit-blame-reverse
+@findex magit-blame-echo
+@findex magit-blame-quit
+@findex magit-blob-previous
+@findex magit-blob-next
+@findex magit-find-file
+@findex magit-blob-visit-file
+@findex magit-status-here
+@findex magit-display-repository-buffer
+@findex magit-commit
+@findex magit-edit-line-commit
+Each of these commands is documented individually right below,
+alongside their default key bindings.  The bindings shown above
+are the recommended bindings, which you can enable by following
+the instructions further up.
+
 @item @kbd{C-c M-g} (@code{magit-file-dispatch})
 @kindex C-c M-g
 @findex magit-file-dispatch
 This transient prefix command binds the following suffix commands
 and displays them in a temporary buffer until a suffix is invoked.
 
-When invoked in a buffer that does not visit a file, then it falls
-back to regular @code{magit-dispatch}.
-
 @item @kbd{C-c M-g s} (@code{magit-stage-file})
+@itemx @kbd{C-c M-g s} (@code{magit-stage-buffer-file})
+@kindex C-c M-g s
 @kindex C-c M-g s
 @findex magit-stage-file
+@findex magit-stage-buffer-file
 Stage all changes to the file being visited in the current buffer.
+When not visiting a file, then the first command is used, which
+prompts for a file.
 
 @item @kbd{C-c M-g u} (@code{magit-unstage-file})
+@itemx @kbd{C-c M-g u} (@code{magit-unstage-buffer-file})
+@kindex C-c M-g u
 @kindex C-c M-g u
 @findex magit-unstage-file
+@findex magit-unstage-buffer-file
 Unstage all changes to the file being visited in the current buffer.
-
-@item @kbd{C-c M-g c} (@code{magit-commit})
-@kindex C-c M-g c
-@findex magit-commit
-This transient prefix command binds the following suffix commands
-along with the appropriate infix arguments and displays them in a
-temporary buffer until a suffix is invoked.  See @ref{Initiating a Commit}.
+When not visiting a file, then the first command is used, which
+prompts for a file.
+
+@item @kbd{C-c M-g , x} (@code{magit-file-untrack})
+@kindex C-c M-g , x
+@findex magit-file-untrack
+This command untracks a file read from the user, defaulting to the
+visited file.
+
+@item @kbd{C-c M-g , r} (@code{magit-file-rename})
+@kindex C-c M-g , r
+@findex magit-file-rename
+This command renames a file read from the user, defaulting to the
+visited file.
+
+@item @kbd{C-c M-g , k} (@code{magit-file-delete})
+@kindex C-c M-g , k
+@findex magit-file-delete
+This command deletes a file read from the user, defaulting to the
+visited file.
+
+@item @kbd{C-c M-g , c} (@code{magit-file-checkout})
+@kindex C-c M-g , c
+@findex magit-file-checkout
+This command updates a file in the working tree and index to the
+contents from a revision.  Both the revision and file are read
+from the user.
 
 @item @kbd{C-c M-g D} (@code{magit-diff})
 @kindex C-c M-g D
@@ -9438,11 +9607,6 @@ This command shows the log for the file of blob that the 
current
 buffer visits.  Renames are followed when a prefix argument is used
 or when @code{--follow} is an active log argument.  When the region is
 active, the log is restricted to the selected line range.
-
-@item @kbd{C-c M-g t} (@code{magit-log-trace-definition})
-@kindex C-c M-g t
-@findex magit-log-trace-definition
-This command shows the log for the definition at point.
 @end table
 
 @defopt magit-log-buffer-file-locked
@@ -9451,6 +9615,18 @@ buffer.  See @ref{Modes and Buffers}.
 @end defopt
 
 @table @asis
+@item @kbd{C-c M-g t} (@code{magit-log-trace-definition})
+@kindex C-c M-g t
+@findex magit-log-trace-definition
+This command shows the log for the definition at point.
+
+@item @kbd{C-c M-g M} (@code{magit-log-merged})
+@kindex C-c M-g M
+@findex magit-log-merged
+This command reads a commit and a branch in shows a log concerning
+the merge of the former into the latter.  This shows multiple commits
+even in case of a fast-forward merge.
+
 @item @kbd{C-c M-g B} (@code{magit-blame})
 @kindex C-c M-g B
 @findex magit-blame
@@ -9460,13 +9636,57 @@ temporary buffer until a suffix is invoked.
 
 For more information about this and the following commands also see
 @ref{Blaming}.
-@end table
 
 In addition to the @code{magit-blame} sub-transient, the dispatch transient
-also binds several blaming suffix commands directly.  See @ref{Blaming} for
-information about those commands and bindings.
+also binds several blaming suffix commands directly.  See @ref{Blaming}
+for information about those commands and bindings.
+
+@item @kbd{C-c M-g p} (@code{magit-blob-previous})
+@kindex C-c M-g p
+@findex magit-blob-previous
+This command visits the previous blob which modified the current
+file.
+
+@item @kbd{C-c M-g n} (@code{magit-blob-next})
+@kindex C-c M-g n
+@findex magit-blob-next
+This command visits the next blob which modified the current file.
+
+@item @kbd{C-c M-g v} (@code{magit-find-file})
+@kindex C-c M-g v
+@findex magit-find-file
+This command reads a revision and file and visits the respective
+blob.
+
+@item @kbd{C-c M-g V} (@code{magit-blob-visit-file})
+@kindex C-c M-g V
+@findex magit-blob-visit-file
+This command visits the file from the working tree, corresponding
+to the current blob.  When visiting a blob or the version from the
+index, then it goes to the same location in the respective file in
+the working tree.
+
+@item @kbd{C-c M-g g} (@code{magit-status-here})
+@kindex C-c M-g g
+@findex magit-status-here
+This command displays the status of the current repository in a
+buffer, like @code{magit-status} does.  Additionally it tries to go to
+the position in that buffer, which corresponds to the position
+in the current file-visiting buffer (if any).
+
+@item @kbd{C-c M-g G} (@code{magit-display-repository-buffer})
+@kindex C-c M-g G
+@findex magit-display-repository-buffer
+This command reads and displays a Magit buffer belonging to the
+current repository, without refreshing it.
+
+@item @kbd{C-c M-g c} (@code{magit-commit})
+@kindex C-c M-g c
+@findex magit-commit
+This transient prefix command binds the following suffix commands
+along with the appropriate infix arguments and displays them in a
+temporary buffer until a suffix is invoked.  See @ref{Initiating a Commit}.
 
-@table @asis
 @item @kbd{C-c M-g e} (@code{magit-edit-line-commit})
 @kindex C-c M-g e
 @findex magit-edit-line-commit
@@ -9477,38 +9697,8 @@ line, if any.  The commit is determined using @code{git 
blame} and made
 editable using @code{git rebase --interactive} if it is reachable from
 @code{HEAD}, or by checking out the commit (or a branch that points at it)
 otherwise.
-
-@item @kbd{C-c M-g p} (@code{magit-blob-previous})
-@kindex C-c M-g p
-@findex magit-blob-previous
-Visit the previous blob which modified the current file.
 @end table
 
-There are a few additional commands that operate on a single file but
-are not enabled in the file transient command by default:
-
-@deffn Command magit-file-rename
-This command renames a file read from the user.
-@end deffn
-
-@deffn Command magit-file-delete
-This command deletes a file read from the user.
-@end deffn
-
-@deffn Command magit-file-untrack
-This command untracks a file read from the user.
-@end deffn
-
-@deffn Command magit-file-checkout
-This command updates a file in the working tree and index to the
-contents from a revision.  Both the revision and file are read
-from the user.
-@end deffn
-
-To enable them invoke the transient (@code{C-c M-g}), enter "edit mode" 
(@code{C-x
-l}), set the "transient level" (@code{C-x l} again), enter @code{5}, and leave 
edit
-mode (@code{C-g}).  Also see @ref{Enabling and Disabling 
Suffixes,,,transient,}.
-
 @node Minor Mode for Buffers Visiting Blobs
 @section Minor Mode for Buffers Visiting Blobs
 
@@ -9675,7 +9865,7 @@ users might want to customize, for safety and/or 
performance reasons.
 @menu
 * Safety::
 * Performance::
-* Default Bindings::
+* Global Bindings::
 @end menu
 
 @node Safety
@@ -9919,16 +10109,20 @@ executable you're running against the one at 
@code{/usr/bin/git}, and if
 you notice a notable difference try using the latter as
 @code{magit-git-executable}.
 
-@node Default Bindings
-@subsection Default Bindings
+@node Global Bindings
+@subsection Global Bindings
 
 @defopt magit-define-global-key-bindings
-This option controls whether some Magit commands are automatically
-bound in the global keymap even before Magit is used for the first
-time in the current session.
+This option controls which set of Magit key bindings, if any, may
+be added to the global keymap, even before Magit is first used in
+the current Emacs session.
 
-If this variable is non-nil, which it is by default, then the
-following bindings may be added to the global keymap.
+@itemize
+@item
+If the value is @code{nil}, no bindings are added.
+
+@item
+If @code{default}, maybe add:
 
 @multitable {aaaaaaaaa} {aaaaaaaaaaaaaaaaaaaaa}
 @item @code{C-x g}
@@ -9939,39 +10133,46 @@ following bindings may be added to the global keymap.
 @tab @code{magit-file-dispatch}
 @end multitable
 
-These bindings may be added when @code{after-init-hook} is run.
-Each binding is added if and only if at that time no other key
-is bound to the same command and no other command is bound to
-the same key.  In other words we try to avoid adding bindings
-that are unnecessary, as well as bindings that conflict with
-other bindings.
+@item
+If @code{recommended}, maybe add:
+
+@multitable {aaaaaaa} {aaaaaaaaaaaaaaaaaaaaa}
+@item @code{C-x g}
+@tab @code{magit-status}
+@item @code{C-c g}
+@tab @code{magit-dispatch}
+@item @code{C-c f}
+@tab @code{magit-file-dispatch}
+@end multitable
 
-Adding the above bindings is delayed until @code{after-init-hook}
-is called to allow users to set the variable anywhere in their
-init file (without having to make sure to do so before @code{magit}
-is loaded or autoloaded) and to increase the likelihood that
-all the potentially conflicting user bindings have already
-been added.
+These bindings are strongly recommended, but we cannot use
+them by default, because the @code{C-c <LETTER>} namespace is
+strictly reserved for bindings added by the user (see
+@ref{Key Binding Conventions,,,elisp,}).
+@end itemize
+
+The bindings in the chosen set may be added when
+@code{after-init-hook} is run.  Each binding is added if, and only
+if, at that time no other key is bound to the same command,
+and no other command is bound to the same key.  In other words
+we try to avoid adding bindings that are unnecessary, as well
+as bindings that conflict with other bindings.
+
+Adding these bindings is delayed until @code{after-init-hook} is
+run to allow users to set the variable anywhere in their init
+file (without having to make sure to do so before @code{magit} is
+loaded or autoloaded) and to increase the likelihood that all
+the potentially conflicting user bindings have already been
+added.
 
 To set this variable use either @code{setq} or the Custom interface.
 Do not use the function @code{customize-set-variable} because doing
-that would cause Magit to be loaded immediately when that form
+that would cause Magit to be loaded immediately, when that form
 is evaluated (this differs from @code{custom-set-variables}, which
 doesn't load the libraries that define the customized variables).
 
-Setting this variable to nil has no effect if that is done after
-the key bindings have already been added.
-
-We recommend that you bind @code{C-c g} instead of @code{C-c M-g} to
-@code{magit-file-dispatch}.  The former is a much better binding
-but the @code{C-c <letter>} namespace is strictly reserved for
-users; preventing Magit from using it by default.
-
-@lisp
-(global-set-key (kbd "C-c g") 'magit-file-dispatch)
-@end lisp
-
-Also see @ref{Commands for Buffers Visiting Files} and @ref{Key Binding 
Conventions,,,elisp,}.
+Setting this variable has no effect if @code{after-init-hook} has
+already been run.
 @end defopt
 
 @node Plumbing
diff --git a/lisp/magit.el b/lisp/magit.el
index bb785ae124..a8842259ba 100644
--- a/lisp/magit.el
+++ b/lisp/magit.el
@@ -249,62 +249,75 @@ and/or `magit-branch-remote-head'."
 ;;; Global Bindings
 
 ;;;###autoload
-(defcustom magit-define-global-key-bindings t
-  "Whether to bind some Magit commands in the global keymap.
-
-If this variable is non-nil, then the following bindings may
-be added to the global keymap.  The default is t.
-
-key             binding
----             -------
-C-x g           magit-status
-C-x M-g         magit-dispatch
-C-c M-g         magit-file-dispatch
-
-These bindings may be added when `after-init-hook' is run.
-Each binding is added if and only if at that time no other key
-is bound to the same command and no other command is bound to
-the same key.  In other words we try to avoid adding bindings
-that are unnecessary, as well as bindings that conflict with
-other bindings.
-
-Adding the above bindings is delayed until `after-init-hook'
-is called to allow users to set the variable anywhere in their
-init file (without having to make sure to do so before `magit'
-is loaded or autoloaded) and to increase the likelihood that
-all the potentially conflicting user bindings have already
-been added.
+(defcustom magit-define-global-key-bindings 'default
+  "Which set of key bindings to add to the global keymap, if any.
+
+This option controls which set of Magit key bindings, if any, may
+be added to the global keymap, even before Magit is first used in
+the current Emacs session.
+
+If the value is nil, no bindings are added.
+
+If `default', maybe add:
+
+    C-x g     `magit-status'
+    C-x M-g   `magit-dispatch'
+    C-c M-g   `magit-file-dispatch'
+
+If `recommended', maybe add:
+
+    C-x g     `magit-status'
+    C-c g     `magit-dispatch'
+    C-c f     `magit-file-dispatch'
+
+    These bindings are strongly recommended, but we cannot use
+    them by default, because the \"C-c <LETTER>\" namespace is
+    strictly reserved for bindings added by the user.
+
+The bindings in the chosen set may be added when
+`after-init-hook' is run.  Each binding is added if, and only
+if, at that time no other key is bound to the same command,
+and no other command is bound to the same key.  In other words
+we try to avoid adding bindings that are unnecessary, as well
+as bindings that conflict with other bindings.
+
+Adding these bindings is delayed until `after-init-hook' is
+run to allow users to set the variable anywhere in their init
+file (without having to make sure to do so before `magit' is
+loaded or autoloaded) and to increase the likelihood that all
+the potentially conflicting user bindings have already been
+added.
 
 To set this variable use either `setq' or the Custom interface.
 Do not use the function `customize-set-variable' because doing
-that would cause Magit to be loaded immediately when that form
+that would cause Magit to be loaded immediately, when that form
 is evaluated (this differs from `custom-set-variables', which
 doesn't load the libraries that define the customized variables).
 
-Setting this variable to nil has no effect if that is done after
-the key bindings have already been added.
-
-We recommend that you bind \"C-c g\" instead of \"C-c M-g\" to
-`magit-file-dispatch'.  The former is a much better binding
-but the \"C-c <letter>\" namespace is strictly reserved for
-users; preventing Magit from using it by default.
-
-Also see info node `(magit)Commands for Buffers Visiting Files'."
-  :package-version '(magit . "3.0.0")
+Setting this variable has no effect if `after-init-hook' has
+already been run."
+  :package-version '(magit . "4.0.0")
   :group 'magit-essentials
-  :type 'boolean)
+  :type '(choice (const :tag "Add no binding" nil)
+                 (const :tag "Use default bindings" default)
+                 (const :tag "Use recommended bindings" recommended)))
 
 ;; This is autoloaded and thus is used before `compat' is
 ;; loaded, so we cannot use `keymap-lookup' and `keymap-set'.
 ;;;###autoload
 (progn
   (defun magit-maybe-define-global-key-bindings (&optional force)
+    "See variable `magit-define-global-key-bindings'."
     (when magit-define-global-key-bindings
       (let ((map (current-global-map)))
         (pcase-dolist (`(,key . ,def)
-                       '(("C-x g"   . magit-status)
-                         ("C-x M-g" . magit-dispatch)
-                         ("C-c M-g" . magit-file-dispatch)))
+                       (cond ((eq magit-define-global-key-bindings 
'recommended)
+                              '(("C-x g"   . magit-status)
+                                ("C-c g"   . magit-dispatch)
+                                ("C-c f"   . magit-file-dispatch)))
+                             ('(("C-x g"   . magit-status)
+                                ("C-x M-g" . magit-dispatch)
+                                ("C-c M-g" . magit-file-dispatch)))))
           (when (or force
                     (not (or (lookup-key map (kbd key))
                              (where-is-internal def (make-sparse-keymap) t))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]