emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] feature/tramp-thread-safe 33363e5: Rework "async" toggling


From: Michael Albinus
Subject: [Emacs-diffs] feature/tramp-thread-safe 33363e5: Rework "async" toggling of file visiting commands
Date: Sun, 5 Aug 2018 05:45:33 -0400 (EDT)

branch: feature/tramp-thread-safe
commit 33363e5f6232616dbcddf0a31a25d33b0347f160
Author: Michael Albinus <address@hidden>
Commit: Michael Albinus <address@hidden>

    Rework "async" toggling of file visiting commands
    
    * doc/emacs/files.texi (Visiting):
    * doc/lispref/files.texi (Visiting Functions):
    * etc/NEWS: Use 'execute-file-commands-asynchronously' rather than
    'find-file-asynchronously'.
    
    * lisp/files.el (universal-async-argument): New defun.  Bind it
    to "C-x &".
    (find-file, find-file-other-window, find-file-other-frame)
    (find-file-existing, find-alternate-file-other-window)
    (find-alternate-file, find-file-literally): Adapt docstring.
    (execute-file-commands-asynchronously): Rename from
    `find-file-asynchronously'.
    (find-file-read-args, find-alternate-file-other-window)
    (find-alternate-file): Use it.
---
 doc/emacs/files.texi   |  22 +++++-----
 doc/lispref/files.texi |  10 ++---
 etc/NEWS               |  14 +++---
 lisp/files.el          | 116 +++++++++++++++++++++++++++++++++++--------------
 lisp/vc/vc-hooks.el    |   2 +-
 5 files changed, 107 insertions(+), 57 deletions(-)

diff --git a/doc/emacs/files.texi b/doc/emacs/files.texi
index 46e64c2..a11d8b9 100644
--- a/doc/emacs/files.texi
+++ b/doc/emacs/files.texi
@@ -229,14 +229,14 @@ actually contains wildcard characters.  You can disable 
the wildcard
 feature by customizing @code{find-file-wildcards}.
 
 @cindex visiting files asynchronously
address@hidden find-file-asynchronously
address@hidden execute-file-commands-asynchronously
   Sometimes, it is handy to visit a file asynchronously.  This means,
 while loading the file into its buffer Emacs keeps responsive, and you
 can continue to edit other files, or call commands.  This is
-controlled by the user option @code{find-file-asynchronously}.  If
-this option is @code{nil} (the default), visiting a file is performed
-synchronously.  A regexp value let files, which name matches the
-regexp, being visited asynchronously, and synchronously otherwise.
+controlled by the user option @code{execute-file-commands-asynchronously}.
+If this option is @code{nil} (the default), visiting a file is
+performed synchronously.  A regexp value let files, which name matches
+the regexp, being visited asynchronously, and synchronously otherwise.
 The value @code{t} forces asynchronous visiting of files
 unconditionally.
 
@@ -245,16 +245,16 @@ If you want to visit all remote files asynchronously, you 
should set
 @example
 @group
 (customize-set-variable
-  'find-file-asynchronously tramp-file-name-regexp
+  'execute-file-commands-asynchronously tramp-file-name-regexp
   "Visit remote files asynchronously")
 @end group
 @end example
 
-  With a prefix argument @kbd{C-u}, the meaning of
address@hidden will be reverted.  If this user option
-is @code{nil}, visiting a file is performed asynchronously.  Contrary,
-if this user option is address@hidden, visiting a file is performed
-synchronously.
+  With the key sequence @kbd{C-x &} prior the file visiting command,
+the meaning of @code{execute-file-commands-asynchronously} will be
+reverted.  If this user option is @code{nil}, visiting a file is
+performed asynchronously.  Contrary, if this user option is
address@hidden, visiting a file is performed synchronously.
 
 @kindex C-x C-v
 @findex find-alternate-file
diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi
index 9faa47b..4cb2605 100644
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -118,8 +118,8 @@ interactive call, then @code{find-file} expands wildcard 
characters in
 
 If @var{async} is address@hidden, the file will be loaded into the
 buffer asynchronously.  Interactively, this is indicated by either
-setting user option @code{find-file-asynchronously} to address@hidden,
-or by a prefix argument.
+setting user option @code{execute-file-commands-asynchronously} to
address@hidden, or by the key sequence @kbd{C-x &} prior the command.
 
 When @code{find-file} is called interactively, it prompts for
 @var{filename} in the minibuffer.
@@ -228,12 +228,12 @@ the @code{find-file} commands ignore their 
@var{wildcards} argument
 and never treat wildcard characters specially.
 @end defopt
 
address@hidden find-file-asynchronously
address@hidden execute-file-commands-asynchronously
 If this variable is address@hidden, a file will be visited
 asynchronously when called interactively.  If it is a regular
 expression, it must match the file name to be visited.  This behavior
-is toggled by a prefix argument to the interactive call of the file
-visiting command.
+is toggled by the key sequence @kbd{C-x &} prior to the interactive
+call of the file visiting command.
 @end defopt
 
 @defopt find-file-hook
diff --git a/etc/NEWS b/etc/NEWS
index 8d18d3e..ea363c4 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -13,7 +13,7 @@ See files NEWS.26, NEWS.25, ..., NEWS.18, and NEWS.1-17 for 
changes
 in older Emacs versions.
 
 You can narrow news to a specific version by calling 'view-emacs-news'
-with a prefix argument or by typing C-u C-h C-n.
+with a prefix argument or by typing 'C-u C-h C-n'.
 
 Temporary note:
 +++ indicates that all necessary documentation updates are complete.
@@ -211,12 +211,12 @@ navigation and editing of large files.
 
 +++
 ** Files can be visited asynchronously.
-If the new user option 'find-file-asynchronously' has a proper non-nil
-value, interactive file visiting commands load the file asynchronously
-into the respective buffer.  I.e., Emacs is still responsive while
-loading the files, which is useful especially for remote files.  See
-the node "(emacs) Visiting" in the user manual for the supported
-commands.
+If the new user option 'execute-file-commands-asynchronously' has a
+proper non-nil value, interactive file visiting commands load the file
+asynchronously into the respective buffer.  I.e., Emacs is still
+responsive while loading the files, which is useful especially for
+remote files.  See the node "(emacs) Visiting" in the user manual for
+the supported commands.
 
 
 * Changes in Specialized Modes and Packages in Emacs 27.1
diff --git a/lisp/files.el b/lisp/files.el
index 195694a..fae7900 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -1576,14 +1576,56 @@ rather than FUN itself, to `minibuffer-setup-hook'."
              ,@body)
          (remove-hook 'minibuffer-setup-hook ,hook)))))
 
+(defun universal-async-argument (async)
+  "Execute an interactive command using the ASYNC argument.
+For file visiting and saving commands, this toggles the meaning
+of `execute-file-commands-asynchronously'."
+  (interactive
+   (list (and (featurep 'threads) (not execute-file-commands-asynchronously))))
+  (let* ((execute-file-commands-asynchronously async)
+         (keyseq (read-key-sequence nil))
+        (cmd (key-binding keyseq))
+        prefix)
+    ;; `read-key-sequence' ignores quit, so make an explicit check.
+    (if (equal last-input-event (nth 3 (current-input-mode)))
+       (keyboard-quit))
+    (when (memq cmd '(universal-argument digit-argument))
+      (call-interactively cmd)
+
+      ;; Process keys bound in `universal-argument-map'.
+      (while (progn
+              (setq keyseq (read-key-sequence nil t)
+                    cmd (key-binding keyseq t))
+              (not (eq cmd 'universal-argument-other-key)))
+       (let ((current-prefix-arg prefix-arg)
+             ;; Have to bind `last-command-event' here so that
+             ;; `digit-argument', for instance, can compute the
+             ;; `prefix-arg'.
+             (last-command-event (aref keyseq 0)))
+         (call-interactively cmd)))
+
+      ;; This is the final call to `universal-argument-other-key', which
+      ;; sets the final `prefix-arg'.
+      (let ((current-prefix-arg prefix-arg))
+       (call-interactively cmd))
+
+      ;; Read the command to execute with the given `prefix-arg'.
+      (setq prefix prefix-arg
+           keyseq (read-key-sequence nil t)
+           cmd (key-binding keyseq)))
+
+    (let ((current-prefix-arg prefix))
+      (message "")
+      (call-interactively cmd))))
+
+(define-key ctl-x-map "&" 'universal-async-argument)
+
 (defun find-file-read-args (prompt mustmatch &optional wildcards)
   "Return the interactive spec (<filename> <async>).
 If WILDCARDS is non-nil, return the spec (<filename> t <async>)."
   (let ((filename (read-file-name prompt nil default-directory mustmatch))
-        (async (and (xor find-file-asynchronously current-prefix-arg)
-                    (featurep 'threads))))
-    (when (and async (stringp find-file-asynchronously))
-      (setq async (string-match-p find-file-asynchronously filename)))
+        (async (and (featurep 'threads) execute-file-commands-asynchronously)))
+    (when (stringp async) (setq async (string-match-p async filename)))
     (if wildcards `(,filename t ,async) `(,filename ,async))))
 
 (defmacro find-file-with-threads (filename async &rest body)
@@ -1623,9 +1665,10 @@ expand wildcards (if any) and visit multiple files.  You 
can
 suppress wildcard expansion by setting `find-file-wildcards' to nil.
 
 If ASYNC is non-nil, the file will be loaded into the buffer
-asynchronously.  Interactively, this is indicated by either
-setting `find-file-asynchronously' to non-nil, or by a prefix
-argument.
+asynchronously.  Interactively, this is indicated by setting
+`execute-file-commands-asynchronously' to a proper non-nil value.
+This behavior can be toggled by the key sequence \\[universal-async-argument]
+prior the command invocation.
 
 To visit a file without any kind of conversion and without
 automatically choosing a major mode, use \\[find-file-literally]."
@@ -1660,9 +1703,10 @@ Interactively, or if WILDCARDS is non-nil in a call from 
Lisp,
 expand wildcards (if any) and visit multiple files.
 
 If ASYNC is non-nil, the file will be loaded into the buffer
-asynchronously.  Interactively, this is indicated by either
-setting `find-file-asynchronously' to non-nil, or by a prefix
-argument."
+asynchronously.  Interactively, this is indicated by setting
+`execute-file-commands-asynchronously' to a proper non-nil value.
+This behavior can be toggled by the key sequence \\[universal-async-argument]
+prior the command invocation."
   (interactive
    (find-file-read-args "Find file in other window: "
                         (confirm-nonexistent-file-or-buffer) t))
@@ -1698,9 +1742,10 @@ Interactively, or if WILDCARDS is non-nil in a call from 
Lisp,
 expand wildcards (if any) and visit multiple files.
 
 If ASYNC is non-nil, the file will be loaded into the buffer
-asynchronously.  Interactively, this is indicated by either
-setting `find-file-asynchronously' to non-nil, or by a prefix
-argument."
+asynchronously.  Interactively, this is indicated by setting
+`execute-file-commands-asynchronously' to a proper non-nil value.
+This behavior can be toggled by the key sequence \\[universal-async-argument]
+prior the command invocation."
   (interactive
    (find-file-read-args "Find file in other frame: "
                         (confirm-nonexistent-file-or-buffer) t))
@@ -1720,9 +1765,10 @@ Like \\[find-file], but only allow a file that exists, 
and do not allow
 file names with wildcards.
 
 If ASYNC is non-nil, the file will be loaded into the buffer
-asynchronously.  Interactively, this is indicated by either
-setting `find-file-asynchronously' to non-nil, or by a prefix
-argument."
+asynchronously.  Interactively, this is indicated by setting
+`execute-file-commands-asynchronously' to a proper non-nil value.
+This behavior can be toggled by the key sequence \\[universal-async-argument]
+prior the command invocation."
    (interactive
     (find-file-read-args "Find existing file: " t))
    (if (and (not (called-interactively-p 'interactive))
@@ -1779,9 +1825,10 @@ Interactively, or if WILDCARDS is non-nil in a call from 
Lisp,
 expand wildcards (if any) and replace the file with multiple files.
 
 If ASYNC is non-nil, the file will be loaded into the buffer
-asynchronously.  Interactively, this is indicated by either
-setting `find-file-asynchronously' to non-nil, or by a prefix
-argument."
+asynchronously.  Interactively, this is indicated by setting
+`execute-file-commands-asynchronously' to a proper non-nil value.
+This behavior can be toggled by the key sequence \\[universal-async-argument]
+prior the command invocation."
   (interactive
    (save-selected-window
      (other-window 1)
@@ -1794,8 +1841,9 @@ argument."
        (list (read-file-name
              "Find alternate file: " file-dir nil
               (confirm-nonexistent-file-or-buffer) file-name)
-            t (and (xor find-file-asynchronously current-prefix-arg)
-                    (featurep 'threads))))))
+            t
+             (and (featurep 'threads) execute-file-commands-asynchronously)))))
+  (when (stringp async) (setq async (string-match-p async filename)))
   (if (one-window-p)
       (find-file-other-window filename wildcards async)
     (save-selected-window
@@ -1822,9 +1870,10 @@ Interactively, or if WILDCARDS is non-nil in a call from 
Lisp,
 expand wildcards (if any) and replace the file with multiple files.
 
 If ASYNC is non-nil, the file will be loaded into the buffer
-asynchronously.  Interactively, this is indicated by either
-setting `find-file-asynchronously' to non-nil, or by a prefix
-argument.
+asynchronously.  Interactively, this is indicated by setting
+`execute-file-commands-asynchronously' to a proper non-nil value.
+This behavior can be toggled by the key sequence \\[universal-async-argument]
+prior the command invocation.
 
 If the current buffer is an indirect buffer, or the base buffer
 for one or more indirect buffers, the other buffer(s) are not
@@ -1839,8 +1888,8 @@ killed."
      (list (read-file-name
            "Find alternate file: " file-dir nil
             (confirm-nonexistent-file-or-buffer) file-name)
-          t (and (xor find-file-asynchronously current-prefix-arg)
-                  (featurep 'threads)))))
+          t (and (featurep 'threads) execute-file-commands-asynchronously))))
+  (when (stringp async) (setq async (string-match-p async filename)))
   (unless (run-hook-with-args-until-failure 'kill-buffer-query-functions)
     (user-error "Aborted"))
   (and (buffer-modified-p) buffer-file-name
@@ -2069,12 +2118,12 @@ suppresses this warning."
   :version "21.1"
   :type 'boolean)
 
-(defcustom find-file-asynchronously nil
+(defcustom execute-file-commands-asynchronously nil
   "Non-nil means visit file asynchronously when called interactively.
 If it is a regular expression, it must match the file name to be
-visited.  This behavior is toggled by a prefix argument to the
-interactive call."
-  :group 'files
+visited.  This behavior is toggled by the key sequence 
\\[universal-async-argument]
+prior the command invocation."
+:group 'files
   :version "27.1"
   :type '(choice boolean regexp))
 
@@ -2496,9 +2545,10 @@ If Emacs already has a buffer which is visiting the file,
 this command asks you whether to visit it literally instead.
 
 If ASYNC is non-nil, the file will be loaded into the buffer
-asynchronously.  Interactively, this is indicated by either
-setting `find-file-asynchronously' to non-nil, or by a prefix
-argument.
+asynchronously.  Interactively, this is indicated by setting
+`execute-file-commands-asynchronously' to a proper non-nil value.
+This behavior can be toggled by the key sequence \\[universal-async-argument]
+prior the command invocation.
 
 In non-interactive use, the value is the buffer where the file is
 visited literally.  If the file was visited in a buffer before
diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el
index 59c66e7..21ea764 100644
--- a/lisp/vc/vc-hooks.el
+++ b/lisp/vc/vc-hooks.el
@@ -814,7 +814,7 @@ In the latter case, VC mode is deactivated for this buffer."
     ;; Run it asynchronously.
     (make-thread
      (lambda ()
-       ;; Wait, until the file visitng function tells us so.
+       ;; Wait, until the file visiting function tells us so.
        (with-mutex vc-mutex)
        (vc-file-clearprops buffer-file-name)
        ;; FIXME: Why use a hook?  Why pass it buffer-file-name?



reply via email to

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