emacs-diffs
[Top][All Lists]
Advanced

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

master 4d4b401: Merge from origin/emacs-28


From: Glenn Morris
Subject: master 4d4b401: Merge from origin/emacs-28
Date: Tue, 19 Oct 2021 13:23:00 -0400 (EDT)

branch: master
commit 4d4b4017591c7fb4e37b7d1e0d6b2db565a56c66
Merge: 41c262a d742cc3
Author: Glenn Morris <rgm@gnu.org>
Commit: Glenn Morris <rgm@gnu.org>

    Merge from origin/emacs-28
    
    d742cc3c20 (origin/emacs-28) ; etc/NEWS: Fix typos
    28db29590f * admin/notes/unicode: Refer to Unicode's emoji-style.txt
    9bd2f59db6 Handle VS-16 correctly for non-emoji codepoints
    e55e2d4a11 ; * etc/NEWS: Minor copyedit about 'repeat-mode'.
    380981ddb5 Adjust bug-reference-bug-regexp default values to match on...
    c1cf95a0e1 ; * doc/emacs/windows.texi: Doc fix.
    98eb6d783a Fix a typo in emacs-lisp-intro.texi
    f5b8f626e3 Fix some Tramp problems
    fc988a7113 Adapt Tramp manual
    0c241043a8 Further fixes to Elisp manual
    8e8a920246 * lisp/progmodes/cc-engine.el (c-forward-decl-or-cast-1): ...
    5a3242301d Rename tab-bar-drag-maybe to tab-bar--dragging-in-progress
    bb4209a5a5 Fix xref elisp identifier namespace mistake
    
    # Conflicts:
    #   etc/NEWS
---
 admin/notes/unicode                     |  8 +++-
 admin/unidata/blocks.awk                | 26 +------------
 admin/unidata/emoji-zwj.awk             | 41 ++++++++++++++++++++-
 doc/emacs/windows.texi                  |  2 +-
 doc/lispintro/emacs-lisp-intro.texi     |  2 +-
 doc/lispref/frames.texi                 |  6 +--
 doc/lispref/windows.texi                |  9 +----
 doc/misc/tramp.texi                     | 15 ++++----
 etc/NEWS.28                             | 29 ++++++++-------
 lisp/composite.el                       |  9 ++++-
 lisp/net/tramp-adb.el                   | 65 ++++++++++++++++-----------------
 lisp/net/tramp-gvfs.el                  | 30 +--------------
 lisp/net/tramp-sh.el                    |  4 +-
 lisp/net/tramp-sudoedit.el              |  5 ++-
 lisp/net/tramp.el                       | 44 +++++++++++++++++-----
 lisp/progmodes/bug-reference.el         |  8 ++--
 lisp/progmodes/cc-engine.el             |  1 +
 lisp/progmodes/elisp-mode.el            |  6 +--
 lisp/tab-bar.el                         |  8 ++--
 src/composite.c                         | 11 ++++++
 src/font.c                              | 20 +++++++++-
 src/xdisp.c                             |  6 +--
 test/lisp/net/tramp-tests.el            | 28 +++++++++++++-
 test/lisp/progmodes/elisp-mode-tests.el | 11 ++++++
 24 files changed, 238 insertions(+), 156 deletions(-)

diff --git a/admin/notes/unicode b/admin/notes/unicode
index 21233ac..c41b9a6 100644
--- a/admin/notes/unicode
+++ b/admin/notes/unicode
@@ -116,8 +116,12 @@ FONT-NAME-REGEXP is checked using `string-match'."
 
 Visit "emoji-zwj-sequences.txt" and "emoji-sequences.txt" with the
 rebuilt Emacs, and check that the sample sequences are composed
-properly.  Note that your emoji font might not have glyphs for the
-newest codepoints yet.
+properly.  Also check the Unicode style chart file available at
+https://unicode.org/emoji/charts/emoji-style.txt for any issues
+involving VS-15 and VS-16, if so you may need to update the value
+generated for auto-composition-emoji-eligible-codepoints by
+admin/unidata/emoji-zwj.awk.  Note that your emoji font might not have
+glyphs for the newest codepoints yet.
 
 Finally, etc/NEWS should be updated to announce the support for the
 new Unicode version.
diff --git a/admin/unidata/blocks.awk b/admin/unidata/blocks.awk
index 96b0413..314ac3e 100755
--- a/admin/unidata/blocks.awk
+++ b/admin/unidata/blocks.awk
@@ -221,31 +221,9 @@ FILENAME ~ "emoji-data.txt" && /^[0-9A-F].*; 
Emoji_Presentation / {
 }
 
 END {
-    ## These codepoints have Emoji_Presentation = No, but they are
-    ## used in emoji-sequences.txt and emoji-zwj-sequences.txt (with a
-    ## Variation Selector), so force them into the emoji script so
-    ## they will get composed correctly.  FIXME: delete this when we
-    ## can change the font used for a codepoint based on whether it's
-    ## followed by a VS (usually VS-16)
     idx = 0
-    override_start[idx] = "1F3CB"
-    override_end[idx] = "1F3CC"
-    idx++
-    override_start[idx] = "1F3F3"
-    override_end[idx] = "1F3F4"
-    idx++
-    override_start[idx] = "1F441"
-    override_end[idx] = "1F441"
-    idx++
-    override_start[idx] = "1F574"
-    override_end[idx] = "1F575"
-    idx++
-    override_start[idx] = "1F590"
-    override_end[idx] = "1F590"
-
-    ## These are here so that font_range can choose Emoji presentation
-    ## for the preceding codepoint when it encounters a VS
-    idx++
+    # ## These are here so that font_range can choose Emoji presentation
+    # ## for the preceding codepoint when it encounters a VS
     override_start[idx] = "FE00"
     override_end[idx] = "FE0F"
 
diff --git a/admin/unidata/emoji-zwj.awk b/admin/unidata/emoji-zwj.awk
index 5aca157..d4e2944 100644
--- a/admin/unidata/emoji-zwj.awk
+++ b/admin/unidata/emoji-zwj.awk
@@ -64,6 +64,44 @@ END {
      print ";;; emoji-zwj.el --- emoji zwj character composition table  -*- 
lexical-binding:t -*-"
      print ";;; Automatically generated from 
admin/unidata/emoji-{zwj-,}sequences.txt"
      print "(eval-when-compile (require 'regexp-opt))"
+
+     # The following codepoints are not emoji, but they are part of
+     # emoji sequences.  We have code in font.c:font_range that will
+     # try to display them with the emoji font anyway.
+
+     trigger_codepoints[1] = "261D"
+     trigger_codepoints[2] = "26F9"
+     trigger_codepoints[3] = "270C"
+     trigger_codepoints[4] = "270D"
+     trigger_codepoints[5] = "2764"
+     trigger_codepoints[6] = "1F3CB"
+     trigger_codepoints[7] = "1F3CC"
+     trigger_codepoints[8] = "1F3F3"
+     trigger_codepoints[9] = "1F3F4"
+     trigger_codepoints[10] = "1F441"
+     trigger_codepoints[11] = "1F574"
+     trigger_codepoints[12] = "1F575"
+     trigger_codepoints[13] = "1F590"
+
+     printf "(setq auto-composition-emoji-eligible-codepoints\n"
+     printf "'("
+
+     for (trig in trigger_codepoints)
+     {
+         printf("\n?\\N{U+%s}", trigger_codepoints[trig])
+     }
+     printf "\n))\n\n"
+
+     #  We add entries for 'codepoint U+FE0F' here to ensure that the
+     # code in font_range is triggered.
+
+     for (trig in trigger_codepoints)
+     {
+         codepoint = trigger_codepoints[trig]
+         c = sprintf("\\N{U+%s}", codepoint)
+         vec[codepoint] = vec[codepoint] "\n\"" c "\\N{U+FE0F}\""
+     }
+
      print "(dolist (elt `("
 
      for (elt in ch)
@@ -98,6 +136,5 @@ END {
      print "                                           0"
      print "                                    
'compose-gstring-for-graphic))))"
 
-     print "\n"
-     print "(provide 'emoji-zwj)"
+     printf "\n(provide 'emoji-zwj)"
 }
diff --git a/doc/emacs/windows.texi b/doc/emacs/windows.texi
index facbc7f..8cb88a2 100644
--- a/doc/emacs/windows.texi
+++ b/doc/emacs/windows.texi
@@ -444,7 +444,7 @@ selected window write:
 @group
 (customize-set-variable
  'display-buffer-alist
- '("\\*scratch\\*" (display-buffer-same-window)))
+ '(("\\*scratch\\*" (display-buffer-same-window))))
 @end group
 @end example
 
diff --git a/doc/lispintro/emacs-lisp-intro.texi 
b/doc/lispintro/emacs-lisp-intro.texi
index 81ae253..2a990ca 100644
--- a/doc/lispintro/emacs-lisp-intro.texi
+++ b/doc/lispintro/emacs-lisp-intro.texi
@@ -1177,7 +1177,7 @@ are different from the meaning the letters make as a 
word.  For
 example, the word for the South American sloth, the @samp{ai}, is
 completely different from the two words, @samp{a}, and @samp{i}.
 
-There are many kinds of atom in nature but only a few in Lisp: for
+There are many kinds of atoms in nature but only a few in Lisp: for
 example, @dfn{numbers}, such as 37, 511, or 1729, and @dfn{symbols}, such
 as @samp{+}, @samp{foo}, or @samp{forward-line}.  The words we have
 listed in the examples above are all symbols.  In everyday Lisp
diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index f851d12..56ac711 100644
--- a/doc/lispref/frames.texi
+++ b/doc/lispref/frames.texi
@@ -642,7 +642,7 @@ automatically increase the outer width of a frame in order 
to
 accommodate an overlong tool bar.
 
 @item Tab Bar
-@cindex internal tab bar
+@cindex tab bar
 The tab bar (@pxref{Tab Bars,,,emacs, The GNU Emacs Manual}) is always
 drawn by Emacs itself.  The tab bar appears above the tool bar in
 Emacs built with an internal tool bar, and below the tool bar in
@@ -1218,10 +1218,10 @@ width of one scroll bar provided this option is 
@code{nil} and keep it
 unchanged if this option is @code{t} or a list containing
 @code{vertical-scroll-bars}.
 
-The default value is @code{'(tab-bar-lines tool-bar-lines)} for Lucid,
+The default value is @code{(tab-bar-lines tool-bar-lines)} for Lucid,
 Motif and MS-Windows (which means that adding/removing a tool or tab
 bar there does not change the outer frame height),
-@code{'(tab-bar-lines)} on all other window systems including GTK+
+@code{(tab-bar-lines)} on all other window systems including GTK+
 (which means that changing any of the parameters listed above with the
 exception of @code{tab-bar-lines} may change the size of the outer
 frame), and @code{t} otherwise (which means the outer frame size never
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index fb72b8f..2625160 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -213,7 +213,8 @@ window} which is used for displaying a tooltip in a tooltip 
frame
 
 Each window belongs to exactly one frame (@pxref{Frames}).  For all
 windows belonging to a specific frame, we sometimes also say that these
-windows are @dfn{owned} by that frame or simply that they are on that frame.
+windows are @dfn{owned} by that frame or simply that they are on that
+frame.
 
 @defun window-frame &optional window
 This function returns the specified @var{window}'s frame---the frame
@@ -233,12 +234,6 @@ minibuffer window (@pxref{Minibuffer Windows}) in that 
list.  If
 active.  If @var{minibuffer} is neither @code{nil} nor @code{t}, the
 minibuffer window is never included.
 
-Note that the window returned by @code{minibuffer-window} called with
-the argument @var{frame} is returned by @code{window-list} called with
-the same argument if and only if that window actually belongs to
-@var{frame}.  If the minibuffer window is owned by another frame, it is
-not returned by this invocation.
-
 The optional argument @var{window}, if non-@code{nil}, must be a live
 window on the specified frame; then @var{window} will be the first
 element in the returned list.  If @var{window} is omitted or @code{nil},
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index 8cc3eaf..4e95b12 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -1071,7 +1071,7 @@ capable of servicing requests from @value{tramp}.
 
 This non-native @value{tramp} method connects via the Server Message
 Block (SMB) networking protocol to hosts running file servers that are
-typically based on @url{https://www.samba.org/,,Samba} or MS Windows.
+typically based on @uref{https://www.samba.org/,,Samba} or MS Windows.
 
 Using @command{smbclient} requires a few tweaks when working with
 @value{tramp}:
@@ -1323,7 +1323,7 @@ possible, @value{tramp} emulates those operations 
otherwise.
 
 @vindex tramp-rclone-program
 The program @command{rclone} allows to access different system
-storages in the cloud, see @url{https://rclone.org/} for a list of
+storages in the cloud, see @uref{https://rclone.org/} for a list of
 supported systems.  If the @command{rclone} program isn't found in
 your @env{PATH} environment variable, you can tell @value{tramp} its
 absolute path via the user option @code{tramp-rclone-program}.
@@ -1362,7 +1362,7 @@ for accessing the system storage, you should use it.
 On local hosts which have installed the @command{sshfs} client for
 mounting a file system based on @command{sftp}, this method can be
 used, see
-@url{https://github.com/libfuse/sshfs/blob/master/README.rst/}.  If
+@uref{https://github.com/libfuse/sshfs/blob/master/README.rst/}.  If
 the @command{sshfs} program isn't found in your @env{PATH} environment
 variable, you can tell @value{tramp} its absolute path via the user
 option @code{tramp-sshfs-program}.
@@ -5192,13 +5192,14 @@ tramp-compat-with-mutex}
 
 @value{tramp} comes with compatibility code for different Emacs
 versions.  When you see such a message (the text might differ), you
-don't use the Emacs built-in version of @value{tramp}.  In case you
-have installed @value{tramp} from GNU ELPA,
+don't use the Emacs built-in version of @value{tramp}, and you must
+recompile it.  In case you have installed @value{tramp} from GNU ELPA,
 @ifset installchapter
-@xref{ELPA Installation}.
+@xref{ELPA Installation}.  Otherwise, @xref{Recompilation}.
 @end ifset
 @ifclear installchapter
-see the package README file for instructions how to recompile it.
+see @uref{@value{trampurl}#ELPA-Installation}.  Otherwise, see
+@uref{@value{trampurl}#Recompilation}.
 @end ifclear
 
 
diff --git a/etc/NEWS.28 b/etc/NEWS.28
index b7c4346..b410ef7 100644
--- a/etc/NEWS.28
+++ b/etc/NEWS.28
@@ -2567,7 +2567,7 @@ that prompt for a project directory.
 +++
 *** New prefix keymap 'project-prefix-map'.
 Key sequences that invoke project-related commands start with the
-prefix 'C-x p'.  Type "C-x p C-h" to show the full list.
+prefix 'C-x p'.  Type 'C-x p C-h' to show the full list.
 
 +++
 *** New commands 'project-dired', 'project-vc-dir', 'project-shell',
@@ -3220,19 +3220,20 @@ batch mode.
 
 +++
 ** New transient mode 'repeat-mode' to allow shorter key sequences.
-You can type 'C-x u u' instead of 'C-x u C-x u' to undo many changes,
-'C-x o o' instead of 'C-x o C-x o' to switch several windows,
-'C-x { { } } ^ ^ v v' to resize the selected window interactively,
-'M-g n n p p' to navigate next-error matches.  Any other key exits
-transient mode and then is executed normally.  'repeat-exit-key'
-defines an additional key to exit mode like 'isearch-exit' ('RET').
-The user option 'repeat-exit-timeout' specifies the number of
-seconds of idle time to break the repetition chain automatically.
-With 'repeat-keep-prefix' you can keep the prefix arg of the previous
-command.  For example, this can help to reverse the window navigation
-direction with e.g. 'C-x o M-- o o'.  Also it can help to set a new
-step with e.g. 'C-x { C-5 { { {', which will set the window resizing
-step to 5 columns.
+Type 'M-x repeat-mode RET' to enable this mode.  You can then type
+'C-x u u' instead of 'C-x u C-x u' to undo many changes, 'C-x o o'
+instead of 'C-x o C-x o' to switch windows, 'C-x { { } } ^ ^ v v' to
+resize the selected window interactively, 'M-g n n p p' to navigate
+next-error matches.  Any other key exits transient mode and then is
+executed normally.  'repeat-exit-key' defines an additional key to
+exit mode like 'isearch-exit' ('RET').  The user option
+'repeat-exit-timeout' specifies the number of seconds of idle time to
+break the repetition chain automatically.  With 'repeat-keep-prefix'
+you can keep the prefix arg of the previous command.  For example,
+this can help to reverse the window navigation direction with
+e.g. 'C-x o M-- o o'.  Also it can help to set a new step with
+e.g. 'C-x { C-5 { { {', which will set the window resizing step to 5
+columns.
 
 ---
 ** New themes 'modus-vivendi' and 'modus-operandi'.
diff --git a/lisp/composite.el b/lisp/composite.el
index 859253e..99f528a 100644
--- a/lisp/composite.el
+++ b/lisp/composite.el
@@ -834,8 +834,15 @@ and the second is a glyph for a variation selector."
              (lgstring-set-glyph gstring 1 nil)
              (throw 'tag gstring)))))))
 
+;; We explicitly don't handle #xFE0F (VS-16) here, because that's
+;; taken care of by font_range in font.c, which will check for an
+;; emoji font for codepoints used in compositions even if they're not
+;; emoji themselves, and thus choose the Emoji presentation for them
+;; when followed by VS-16.  VS-15 *is* handled here, because if it's
+;; handled in font_range, we end up choosing the Emoji presentation
+;; rather than the Text presentation.
 (let ((elt '([".." 1 compose-gstring-for-variation-glyph])))
-  (set-char-table-range composition-function-table '(#xFE00 . #xFE0F) elt)
+  (set-char-table-range composition-function-table '(#xFE00 . #xFE0E) elt)
   (set-char-table-range composition-function-table '(#xE0100 . #xE01EF) elt))
 
 (defun auto-compose-chars (func from to font-object string direction)
diff --git a/lisp/net/tramp-adb.el b/lisp/net/tramp-adb.el
index 6d8bed1..362a258 100644
--- a/lisp/net/tramp-adb.el
+++ b/lisp/net/tramp-adb.el
@@ -128,8 +128,7 @@ It is used for TCP/IP devices."
     (file-attributes . tramp-adb-handle-file-attributes)
     (file-directory-p . tramp-handle-file-directory-p)
     (file-equal-p . tramp-handle-file-equal-p)
-    ;; FIXME: This is too sloppy.
-    (file-executable-p . tramp-handle-file-exists-p)
+    (file-executable-p . tramp-adb-handle-file-executable-p)
     (file-exists-p . tramp-handle-file-exists-p)
     (file-in-directory-p . tramp-handle-file-in-directory-p)
     (file-local-copy . tramp-adb-handle-file-local-copy)
@@ -147,7 +146,7 @@ It is used for TCP/IP devices."
     (file-notify-rm-watch . tramp-handle-file-notify-rm-watch)
     (file-notify-valid-p . tramp-handle-file-notify-valid-p)
     (file-ownership-preserved-p . ignore)
-    (file-readable-p . tramp-handle-file-exists-p)
+    (file-readable-p . tramp-adb-handle-file-readable-p)
     (file-regular-p . tramp-handle-file-regular-p)
     (file-remote-p . tramp-handle-file-remote-p)
     (file-selinux-context . tramp-handle-file-selinux-context)
@@ -515,28 +514,31 @@ Emacs dired can't find files."
        (set-file-modes tmpfile (logior (or (file-modes filename) 0) #o0400)))
       tmpfile)))
 
+(defun tramp-adb-handle-file-executable-p (filename)
+  "Like `file-executable-p' for Tramp files."
+  (with-parsed-tramp-file-name filename nil
+    (with-tramp-file-property v localname "file-executable-p"
+      (tramp-adb-send-command-and-check
+       v (format "test -x %s" (tramp-shell-quote-argument localname))))))
+
+(defun tramp-adb-handle-file-readable-p (filename)
+  "Like `file-readable-p' for Tramp files."
+  (with-parsed-tramp-file-name filename nil
+    (with-tramp-file-property v localname "file-readable-p"
+      (or (tramp-handle-file-readable-p filename)
+         (tramp-adb-send-command-and-check
+          v (format "test -r %s" (tramp-shell-quote-argument localname)))))))
+
 (defun tramp-adb-handle-file-writable-p (filename)
-  "Like `file-writable-p' for Tramp files.
-But handle the case, if the \"test\" command is not available."
+  "Like `file-writable-p' for Tramp files."
   (with-parsed-tramp-file-name filename nil
     (with-tramp-file-property v localname "file-writable-p"
-      (if (tramp-adb-find-test-command v)
-         (if (file-exists-p filename)
-             (tramp-adb-send-command-and-check
-              v (format "test -w %s" (tramp-shell-quote-argument localname)))
-           (and
-            (file-directory-p (file-name-directory filename))
-            (file-writable-p (file-name-directory filename))))
-
-       ;; Missing "test" command on Android < 4.
-       (let ((rw-path "/data/data"))
-        (tramp-message
-         v 5
-         "Not implemented yet (assuming \"/data/data\" is writable): %s"
-         localname)
-        (and (>= (length localname) (length rw-path))
-             (string= (substring localname 0 (length rw-path))
-                      rw-path)))))))
+      (if (file-exists-p filename)
+         (tramp-adb-send-command-and-check
+          v (format "test -w %s" (tramp-shell-quote-argument localname)))
+       (and
+        (file-directory-p (file-name-directory filename))
+        (file-writable-p (file-name-directory filename)))))))
 
 (defun tramp-adb-handle-write-region
   (start end filename &optional append visit lockname mustbenew)
@@ -1043,12 +1045,13 @@ implementation will be used."
                               (rename-file remote-tmpstderr stderr))))
                          ;; Read initial output.  Remove the first
                          ;; line, which is the command echo.
-                         (while
-                             (progn
-                               (goto-char (point-min))
-                               (not (re-search-forward "[\n]" nil t)))
-                           (tramp-accept-process-output p 0))
-                         (delete-region (point-min) (point))
+                         (unless (eq filter t)
+                           (while
+                               (progn
+                                 (goto-char (point-min))
+                                 (not (re-search-forward "[\n]" nil t)))
+                             (tramp-accept-process-output p 0))
+                           (delete-region (point-min) (point)))
                          ;; Provide error buffer.  This shows only
                          ;; initial error messages; messages arriving
                          ;; later on will be inserted when the
@@ -1141,12 +1144,6 @@ error and non-nil on success."
     (let ((inhibit-read-only t)) (delete-region (point-min) (point-max)))
     (zerop (apply #'tramp-call-process vec tramp-adb-program nil t nil args))))
 
-(defun tramp-adb-find-test-command (vec)
-  "Check whether the ash has a builtin \"test\" command.
-This happens for Android >= 4.0."
-  (with-tramp-connection-property vec "test"
-    (tramp-adb-send-command-and-check vec "type test")))
-
 ;; Connection functions
 
 (defun tramp-adb-send-command (vec command &optional neveropen nooutput)
diff --git a/lisp/net/tramp-gvfs.el b/lisp/net/tramp-gvfs.el
index 115d005..ebe57a8 100644
--- a/lisp/net/tramp-gvfs.el
+++ b/lisp/net/tramp-gvfs.el
@@ -788,7 +788,7 @@ It has been changed in GVFS 1.14.")
     (file-notify-rm-watch . tramp-handle-file-notify-rm-watch)
     (file-notify-valid-p . tramp-handle-file-notify-valid-p)
     (file-ownership-preserved-p . ignore)
-    (file-readable-p . tramp-gvfs-handle-file-readable-p)
+    (file-readable-p . tramp-handle-file-readable-p)
     (file-regular-p . tramp-handle-file-regular-p)
     (file-remote-p . tramp-handle-file-remote-p)
     (file-selinux-context . tramp-handle-file-selinux-context)
@@ -1396,8 +1396,7 @@ If FILE-SYSTEM is non-nil, return file system attributes."
   "Like `file-executable-p' for Tramp files."
   (with-parsed-tramp-file-name filename nil
     (with-tramp-file-property v localname "file-executable-p"
-      (and (file-exists-p filename)
-          (tramp-check-cached-permissions v ?x)))))
+      (tramp-check-cached-permissions v ?x))))
 
 (defun tramp-gvfs-handle-file-name-all-completions (filename directory)
   "Like `file-name-all-completions' for Tramp files."
@@ -1519,31 +1518,6 @@ If FILE-SYSTEM is non-nil, return file system 
attributes."
     (when string (tramp-message proc 10 "Rest string:\n%s" string))
     (process-put proc 'rest-string string)))
 
-(defun tramp-gvfs-handle-file-readable-p (filename)
-  "Like `file-readable-p' for Tramp files."
-  (with-parsed-tramp-file-name filename nil
-    (with-tramp-file-property v localname "file-readable-p"
-      (and (file-exists-p filename)
-          (or (tramp-check-cached-permissions v ?r)
-              ;; `tramp-check-cached-permissions' doesn't handle
-              ;; symbolic links.
-              (and (stringp (file-symlink-p filename))
-                   (file-readable-p
-                    (concat
-                     (file-remote-p filename) (file-symlink-p filename))))
-              ;; If the user is different from what we guess to be
-              ;; the user, we don't know.  Let's check, whether
-              ;; access is restricted explicitly.
-              (and (/= (tramp-get-remote-uid v 'integer)
-                       (tramp-compat-file-attribute-user-id
-                        (file-attributes filename 'integer)))
-                   (not
-                    (string-equal
-                     "FALSE"
-                     (cdr (assoc
-                           "access::can-read"
-                           (tramp-gvfs-get-file-attributes filename)))))))))))
-
 (defun tramp-gvfs-handle-file-system-info (filename)
   "Like `file-system-info' for Tramp files."
   (setq filename (directory-file-name (expand-file-name filename)))
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index 6984dd8..6f3b324 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -1580,9 +1580,7 @@ ID-FORMAT valid values are `string' and `integer'."
   "Like `file-readable-p' for Tramp files."
   (with-parsed-tramp-file-name filename nil
     (with-tramp-file-property v localname "file-readable-p"
-      ;; Examine `file-attributes' cache to see if request can be
-      ;; satisfied without remote operation.
-      (or (tramp-check-cached-permissions v ?r)
+      (or (tramp-handle-file-readable-p filename)
          (tramp-run-test "-r" filename)))))
 
 ;; Functions implemented using the basic functions above.
diff --git a/lisp/net/tramp-sudoedit.el b/lisp/net/tramp-sudoedit.el
index 516d46d..845f31d 100644
--- a/lisp/net/tramp-sudoedit.el
+++ b/lisp/net/tramp-sudoedit.el
@@ -464,8 +464,9 @@ the result will be a local, non-Tramp, file name."
   "Like `file-readable-p' for Tramp files."
   (with-parsed-tramp-file-name filename nil
     (with-tramp-file-property v localname "file-readable-p"
-      (tramp-sudoedit-send-command
-       v "test" "-r" (tramp-compat-file-name-unquote localname)))))
+      (or (tramp-handle-file-readable-p filename)
+         (tramp-sudoedit-send-command
+          v "test" "-r" (tramp-compat-file-name-unquote localname))))))
 
 (defun tramp-sudoedit-handle-set-file-modes (filename mode &optional flag)
   "Like `set-file-modes' for Tramp files."
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 318b4e4..372e0a2 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -2087,8 +2087,7 @@ VEC-OR-PROC identifies the connection to use, SIGNAL is 
the
 signal identifier to be raised, remaining arguments passed to
 `tramp-message'.  Finally, signal SIGNAL is raised with
 FMT-STRING and ARGUMENTS."
-  (let ((inhibit-message t)
-       signal-hook-function)
+  (let (signal-hook-function)
     (tramp-backtrace vec-or-proc)
     (unless arguments
       ;; FMT-STRING could be just a file name, as in
@@ -2198,9 +2197,10 @@ the resulting error message."
   ;; `custom-initialize-*' functions provoke `void-variable' errors.
   ;; We don't want to see them in the backtrace.
   (unless (eq error-symbol 'void-variable)
-    (tramp-error
-     (car tramp-current-connection) error-symbol
-     (mapconcat (lambda (x) (format "%s" x)) data " "))))
+    (let ((inhibit-message t))
+      (tramp-error
+       (car tramp-current-connection) error-symbol
+       (mapconcat (lambda (x) (format "%s" x)) data " ")))))
 
 (put #'tramp-signal-hook-function 'tramp-suppress-trace t)
 
@@ -3275,10 +3275,18 @@ User is always nil."
 
 (defun tramp-handle-access-file (filename string)
   "Like `access-file' for Tramp files."
-  (unless (file-readable-p (file-truename filename))
-    (tramp-compat-file-missing
-     (tramp-dissect-file-name filename)
-     (format "%s: %s" string filename))))
+  (setq filename (file-truename filename))
+  (with-parsed-tramp-file-name filename v
+    (if (file-exists-p filename)
+       (unless
+           (funcall
+            (if (file-directory-p filename)
+                #'file-accessible-directory-p #'file-readable-p)
+            filename)
+         (tramp-error
+          v 'file-error (format "%s: Permission denied, %s" string filename)))
+      (tramp-compat-file-missing
+       v (format "%s: No such file or directory, %s" string filename)))))
 
 (defun tramp-handle-add-name-to-file
   (filename newname &optional ok-if-already-exists)
@@ -3568,6 +3576,17 @@ User is always nil."
        (tramp-compat-file-attribute-modification-time
        (file-attributes file1))))))
 
+(defun tramp-handle-file-readable-p (filename)
+  "Like `file-readable-p' for Tramp files."
+  (with-parsed-tramp-file-name filename nil
+    (with-tramp-file-property v localname "file-readable-p"
+      (or (tramp-check-cached-permissions v ?r)
+         ;; `tramp-check-cached-permissions' doesn't handle symbolic
+         ;; links.
+         (when-let ((symlink (file-symlink-p filename)))
+           (and (stringp symlink)
+                (file-readable-p (concat (file-remote-p filename) 
symlink))))))))
+
 (defun tramp-handle-file-regular-p (filename)
   "Like `file-regular-p' for Tramp files."
   (and (file-exists-p filename)
@@ -4220,7 +4239,12 @@ substitution.  SPEC-LIST is a list of char/value pairs 
used for
                :name name :buffer buffer
                :command (append `(,login-program) login-args command)
                :coding coding :noquery noquery :connection-type connection-type
-               :filter filter :sentinel sentinel :stderr stderr))
+               :sentinel sentinel :stderr stderr))
+           ;; Set filter.  Prior Emacs 29.1, it doesn't work reliable
+           ;; to provide it as `make-process' argument when filter is
+           ;; t.  See Bug#51177.
+           (when filter
+             (set-process-filter p filter))
 
            (tramp-message v 6 "%s" (string-join (process-command p) " "))
            p))))))
diff --git a/lisp/progmodes/bug-reference.el b/lisp/progmodes/bug-reference.el
index c6327c1..6385057 100644
--- a/lisp/progmodes/bug-reference.el
+++ b/lisp/progmodes/bug-reference.el
@@ -72,7 +72,7 @@ so that it is considered safe, see `enable-local-variables'.")
                 (get s 'bug-reference-url-format)))))
 
 (defcustom bug-reference-bug-regexp
-  "\\(\\(?:[Bb]ug ?#?\\|[Pp]atch ?#\\|RFE ?#\\|PR 
[a-z+-]+/\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)"
+  "\\(\\b\\(?:[Bb]ug ?#?\\|[Pp]atch ?#\\|RFE ?#\\|PR 
[a-z+-]+/\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)"
   "Regular expression matching bug references.
 The first subexpression defines the region of the bug-reference
 overlay, i.e., the region being fontified and made clickable in
@@ -350,7 +350,7 @@ generated from `bug-reference-forge-alist'."
             ;; `bug-reference-url-format' and
             ;; `bug-reference-bug-regexp' aren't set already.
             ("git\\.\\(?:sv\\|savannah\\)\\.gnu\\.org:"
-             "\\<\\(\\(?:[Bb]ug ?#?\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)\\>"
+             "\\(\\b\\(?:[Bb]ug ?#?\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)\\>"
              ,(lambda (_) "https://debbugs.gnu.org/%s";))
 
             ;; Entries for the software forges of
@@ -395,7 +395,7 @@ applicable."
      ,(regexp-opt '("@debbugs.gnu.org" "-devel@gnu.org"
                     ;; List-Id of Gnus devel mailing list.
                     "ding.gnus.org"))
-     "\\([Bb]ug ?#?\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)"
+     "\\(\\b[Bb]ug ?#?\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)"
      "https://debbugs.gnu.org/%s";))
   "An alist for setting up `bug-reference-mode' in mail modes.
 
@@ -526,7 +526,7 @@ From, and Cc against HEADER-REGEXP in
   `((,(concat "#" (regexp-opt '("emacs" "gnus" "org-mode" "rcirc"
                                 "erc") 'words))
      "Libera.Chat"
-     "\\([Bb]ug ?#?\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)"
+     "\\(\\b[Bb]ug ?#?\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)"
      "https://debbugs.gnu.org/%s";))
   "An alist for setting up `bug-reference-mode' in IRC modes.
 
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 20cdb72..c42c957 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -10409,6 +10409,7 @@ This function might do hidden buffer changes."
                              ;; are directly inside a class (etc.) called 
"bar".
                              (save-excursion
                                (and
+                                type-start
                                 (progn
                                   (goto-char name-start)
                                   (not (memq (c-forward-type) '(nil maybe))))
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index 10a3794..9522055 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -877,17 +877,17 @@ namespace but with lower confidence."
         ;;             ^ index K   ^ index J   ^ index I
         (let* ((i (elisp--xref-list-index))
                (i-head (looking-at-sym))
-               (i-paren (and i-head (eq (char-before) ?\()
+               (i-paren (and i (eq (char-before) ?\()
                              (progn (backward-char) t)))
                (i-quoted (and i-paren (memq (char-before) '(?\' ?`))))
                (j (and i-paren (elisp--xref-list-index)))
                (j-head (and j (looking-at-sym)))
-               (j-paren (and j-head (eq (char-before) ?\()
+               (j-paren (and j (eq (char-before) ?\()
                              (progn (backward-char) t)))
                (j-quoted (and j-paren (memq (char-before) '(?\' ?`))))
                (k (and j-paren (elisp--xref-list-index)))
                (k-head (and k (looking-at-sym)))
-               (k-paren (and k-head (eq (char-before) ?\()
+               (k-paren (and k (eq (char-before) ?\()
                              (progn (backward-char) t)))
                (k-quoted (and k-paren (memq (char-before) '(?\' ?`)))))
           (cond
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 3dc95c9..0355691 100644
--- a/lisp/tab-bar.el
+++ b/lisp/tab-bar.el
@@ -239,7 +239,7 @@ For any other value of KEY, the value is t."
         (string-to-number (string-replace "tab-" "" key-name)))))
    (t t)))
 
-(defvar tab-bar-drag-maybe)
+(defvar tab-bar--dragging-in-progress)
 
 (defun tab-bar--event-to-item (posn)
   "This function extracts extra info from the mouse event at position POSN.
@@ -248,7 +248,7 @@ It returns a list of the form (KEY KEY-BINDING CLOSE-P), 
where:
  KEY-BINDING is the binding of KEY;
  CLOSE-P is non-nil if the mouse event was a click on the close button \"x\",
    nil otherwise."
-  (setq tab-bar-drag-maybe nil)
+  (setq tab-bar--dragging-in-progress nil)
   (if (posn-window posn)
       (let ((caption (car (posn-string posn))))
         (when caption
@@ -280,7 +280,7 @@ existing tab."
   (interactive "e")
   (let* ((item (tab-bar--event-to-item (event-start event)))
          (tab-number (tab-bar--key-to-number (nth 0 item))))
-    (setq tab-bar-drag-maybe t)
+    (setq tab-bar--dragging-in-progress t)
     ;; Don't close the tab when clicked on the close button.  Also
     ;; don't add new tab on down-mouse.  Let `tab-bar-mouse-1' do this.
     (unless (or (eq (car item) 'add-tab) (nth 2 item))
@@ -357,7 +357,7 @@ only when you click on its \"x\" close button."
 This command should be bound to a drag event.  It moves the tab
 at the mouse-down event to the position at mouse-up event."
   (interactive "e")
-  (setq tab-bar-drag-maybe nil)
+  (setq tab-bar--dragging-in-progress nil)
   (let ((from (tab-bar--key-to-number
                (nth 0 (tab-bar--event-to-item
                        (event-start event)))))
diff --git a/src/composite.c b/src/composite.c
index f456e7a..c170805 100644
--- a/src/composite.c
+++ b/src/composite.c
@@ -2124,6 +2124,17 @@ GSTRING, or modify GSTRING itself and return it.
 See also the documentation of `auto-composition-mode'.  */);
   Vcomposition_function_table = Fmake_char_table (Qnil, Qnil);
 
+  DEFVAR_LISP ("auto-composition-emoji-eligible-codepoints", 
Vauto_composition_emoji_eligible_codepoints,
+              doc: /* List of codepoints for which auto-composition will check 
for an emoji font.
+
+These are codepoints which have Emoji_Presentation = No, and thus by
+default are not displayed as emoji.  In certain circumstances, such as
+when followed by U+FE0F (VS-16) the emoji font should be used for
+them anyway.
+
+This list is auto-generated, you should not need to modify it.  */);
+  Vauto_composition_emoji_eligible_codepoints = Qnil;
+
   defsubr (&Scompose_region_internal);
   defsubr (&Scompose_string_internal);
   defsubr (&Sfind_composition_internal);
diff --git a/src/font.c b/src/font.c
index 83f0f82..6cd4a6b 100644
--- a/src/font.c
+++ b/src/font.c
@@ -3860,6 +3860,23 @@ font_at (int c, ptrdiff_t pos, struct face *face, struct 
window *w,
 
 #ifdef HAVE_WINDOW_SYSTEM
 
+/* Check if CH is a codepoint for which we should attempt to use the
+   emoji font, even if the codepoint itself has Emoji_Presentation =
+   No.  Vauto_composition_emoji_eligible_codepoints is filled in for
+   us by admin/unidata/emoji-zwj.awk.  */
+static bool
+codepoint_is_emoji_eligible (int ch)
+{
+  if (EQ (CHAR_TABLE_REF (Vchar_script_table, ch), Qemoji))
+    return true;
+
+  if (! NILP (Fmemq (make_fixnum (ch),
+                    Vauto_composition_emoji_eligible_codepoints)))
+    return true;
+
+  return false;
+}
+
 /* Check how many characters after character/byte position POS/POS_BYTE
    (at most to *LIMIT) can be displayed by the same font in the window W.
    FACE, if non-NULL, is the face selected for the character at POS.
@@ -3907,8 +3924,7 @@ font_range (ptrdiff_t pos, ptrdiff_t pos_byte, ptrdiff_t 
*limit,
   /* If the composition was triggered by an emoji, use a character
      from 'script-representative-chars', rather than the first
      character in the string, to determine the font to use.  */
-  if (EQ (CHAR_TABLE_REF (Vchar_script_table, ch),
-         Qemoji))
+  if (codepoint_is_emoji_eligible (ch))
     {
       Lisp_Object val = assq_no_quit (Qemoji, Vscript_representative_chars);
       if (CONSP (val))
diff --git a/src/xdisp.c b/src/xdisp.c
index 578458b..738f22a 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -33780,7 +33780,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
   if (EQ (window, f->tab_bar_window))
     {
       note_tab_bar_highlight (f, x, y);
-      if (tab_bar_drag_maybe)
+      if (tab_bar__dragging_in_progress)
        {
          cursor = FRAME_OUTPUT_DATA (f)->hand_cursor;
          goto set_cursor;
@@ -35916,9 +35916,9 @@ When nil, mouse-movement events will not be generated 
as long as the
 mouse stays within the extent of a single glyph (except for images).  */);
   mouse_fine_grained_tracking = false;
 
-  DEFVAR_BOOL ("tab-bar-drag-maybe", tab_bar_drag_maybe,
+  DEFVAR_BOOL ("tab-bar--dragging-in-progress", tab_bar__dragging_in_progress,
     doc: /* Non-nil when maybe dragging tab bar item.  */);
-  tab_bar_drag_maybe = false;
+  tab_bar__dragging_in_progress = false;
 
   DEFVAR_BOOL ("redisplay-skip-initial-frame", redisplay_skip_initial_frame,
     doc: /* Non-nil to skip redisplay in initial frame.
diff --git a/test/lisp/net/tramp-tests.el b/test/lisp/net/tramp-tests.el
index da15401..8c7fc48 100644
--- a/test/lisp/net/tramp-tests.el
+++ b/test/lisp/net/tramp-tests.el
@@ -3159,7 +3159,20 @@ This tests also `file-directory-p' and 
`file-accessible-directory-p'."
                  (regexp-opt (directory-files tmp-name1))
                  (length (directory-files tmp-name1)))))))
 
-           ;; Check error case.
+           ;; Check error cases.
+           (when (and (tramp--test-supports-file-modes-p)
+                      ;; With "sshfs", directories with zero file
+                      ;; modes are still "accessible".
+                      (not (tramp--test-sshfs-p))
+                      ;; A directory is always accessible for user "root".
+                      (not (zerop (tramp-compat-file-attribute-user-id
+                                   (file-attributes tmp-name1)))))
+             (set-file-modes tmp-name1 0)
+             (with-temp-buffer
+               (should-error
+                (insert-directory tmp-name1 nil)
+                :type 'file-error))
+             (set-file-modes tmp-name1 #o777))
            (delete-directory tmp-name1 'recursive)
            (with-temp-buffer
              (should-error
@@ -3372,9 +3385,22 @@ This tests also `access-file', `file-readable-p',
                       (tramp-get-remote-gid tramp-test-vec 'integer)))
              (delete-file tmp-name1))
 
+           (when (and (tramp--test-supports-file-modes-p)
+                      ;; A file is always accessible for user "root".
+                      (not (zerop (tramp-compat-file-attribute-user-id
+                                   (file-attributes
+                                    tramp-test-temporary-file-directory)))))
+             (write-region "foo" nil tmp-name1)
+             (set-file-modes tmp-name1 0)
+             (should-error
+              (access-file tmp-name1 "error")
+              :type 'file-error)
+             (set-file-modes tmp-name1 #o777)
+             (delete-file tmp-name1))
            (should-error
             (access-file tmp-name1 "error")
             :type tramp-file-missing)
+
            ;; `file-ownership-preserved-p' should return t for
            ;; non-existing files.
            (when test-file-ownership-preserved-p
diff --git a/test/lisp/progmodes/elisp-mode-tests.el 
b/test/lisp/progmodes/elisp-mode-tests.el
index 6bc4fef..8a3669c 100644
--- a/test/lisp/progmodes/elisp-mode-tests.el
+++ b/test/lisp/progmodes/elisp-mode-tests.el
@@ -966,6 +966,17 @@ evaluation of BODY."
     (should (equal (elisp--xref-infer-namespace p7) 'variable)))
 
   (elisp-mode-test--with-buffer
+      (concat "(let (({p1}alpha {p2}beta)\n"
+              "      ({p3}gamma ({p4}delta {p5}epsilon)))\n"
+              "  ({p6}zeta))\n")
+    (should (equal (elisp--xref-infer-namespace p1) 'variable))
+    (should (equal (elisp--xref-infer-namespace p2) 'variable))
+    (should (equal (elisp--xref-infer-namespace p3) 'variable))
+    (should (equal (elisp--xref-infer-namespace p4) 'function))
+    (should (equal (elisp--xref-infer-namespace p5) 'maybe-variable))
+    (should (equal (elisp--xref-infer-namespace p6) 'function)))
+
+  (elisp-mode-test--with-buffer
       (concat "(defun {p1}alpha () {p2}beta)\n"
               "(defface {p3}gamma ...)\n"
               "(defvar {p4}delta {p5}epsilon)\n"



reply via email to

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