aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Morris2021-10-19 07:50:35 -0700
committerGlenn Morris2021-10-19 07:50:35 -0700
commit4d4b4017591c7fb4e37b7d1e0d6b2db565a56c66 (patch)
tree132fc64cbb5da9e0f5d0600edfcf189dd86e783d
parent41c262af322eab6c35a94d747dcaf776b0975f35 (diff)
parentd742cc3c204ba0adeb9600d236a0e454e35a42ff (diff)
downloademacs-4d4b4017591c7fb4e37b7d1e0d6b2db565a56c66.tar.gz
emacs-4d4b4017591c7fb4e37b7d1e0d6b2db565a56c66.zip
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
-rw-r--r--admin/notes/unicode8
-rwxr-xr-xadmin/unidata/blocks.awk26
-rw-r--r--admin/unidata/emoji-zwj.awk41
-rw-r--r--doc/emacs/windows.texi2
-rw-r--r--doc/lispintro/emacs-lisp-intro.texi2
-rw-r--r--doc/lispref/frames.texi6
-rw-r--r--doc/lispref/windows.texi9
-rw-r--r--doc/misc/tramp.texi15
-rw-r--r--etc/NEWS.2829
-rw-r--r--lisp/composite.el9
-rw-r--r--lisp/net/tramp-adb.el65
-rw-r--r--lisp/net/tramp-gvfs.el30
-rw-r--r--lisp/net/tramp-sh.el4
-rw-r--r--lisp/net/tramp-sudoedit.el5
-rw-r--r--lisp/net/tramp.el44
-rw-r--r--lisp/progmodes/bug-reference.el8
-rw-r--r--lisp/progmodes/cc-engine.el1
-rw-r--r--lisp/progmodes/elisp-mode.el6
-rw-r--r--lisp/tab-bar.el8
-rw-r--r--src/composite.c11
-rw-r--r--src/font.c20
-rw-r--r--src/xdisp.c6
-rw-r--r--test/lisp/net/tramp-tests.el28
-rw-r--r--test/lisp/progmodes/elisp-mode-tests.el11
24 files changed, 238 insertions, 156 deletions
diff --git a/admin/notes/unicode b/admin/notes/unicode
index 21233ac2819..c41b9a6d26d 100644
--- a/admin/notes/unicode
+++ b/admin/notes/unicode
@@ -116,8 +116,12 @@ FONT-NAME-REGEXP is checked using `string-match'."
116 116
117Visit "emoji-zwj-sequences.txt" and "emoji-sequences.txt" with the 117Visit "emoji-zwj-sequences.txt" and "emoji-sequences.txt" with the
118rebuilt Emacs, and check that the sample sequences are composed 118rebuilt Emacs, and check that the sample sequences are composed
119properly. Note that your emoji font might not have glyphs for the 119properly. Also check the Unicode style chart file available at
120newest codepoints yet. 120https://unicode.org/emoji/charts/emoji-style.txt for any issues
121involving VS-15 and VS-16, if so you may need to update the value
122generated for auto-composition-emoji-eligible-codepoints by
123admin/unidata/emoji-zwj.awk. Note that your emoji font might not have
124glyphs for the newest codepoints yet.
121 125
122Finally, etc/NEWS should be updated to announce the support for the 126Finally, etc/NEWS should be updated to announce the support for the
123new Unicode version. 127new Unicode version.
diff --git a/admin/unidata/blocks.awk b/admin/unidata/blocks.awk
index 96b0413875d..314ac3e9394 100755
--- a/admin/unidata/blocks.awk
+++ b/admin/unidata/blocks.awk
@@ -221,31 +221,9 @@ FILENAME ~ "emoji-data.txt" && /^[0-9A-F].*; Emoji_Presentation / {
221} 221}
222 222
223END { 223END {
224 ## These codepoints have Emoji_Presentation = No, but they are
225 ## used in emoji-sequences.txt and emoji-zwj-sequences.txt (with a
226 ## Variation Selector), so force them into the emoji script so
227 ## they will get composed correctly. FIXME: delete this when we
228 ## can change the font used for a codepoint based on whether it's
229 ## followed by a VS (usually VS-16)
230 idx = 0 224 idx = 0
231 override_start[idx] = "1F3CB" 225 # ## These are here so that font_range can choose Emoji presentation
232 override_end[idx] = "1F3CC" 226 # ## for the preceding codepoint when it encounters a VS
233 idx++
234 override_start[idx] = "1F3F3"
235 override_end[idx] = "1F3F4"
236 idx++
237 override_start[idx] = "1F441"
238 override_end[idx] = "1F441"
239 idx++
240 override_start[idx] = "1F574"
241 override_end[idx] = "1F575"
242 idx++
243 override_start[idx] = "1F590"
244 override_end[idx] = "1F590"
245
246 ## These are here so that font_range can choose Emoji presentation
247 ## for the preceding codepoint when it encounters a VS
248 idx++
249 override_start[idx] = "FE00" 227 override_start[idx] = "FE00"
250 override_end[idx] = "FE0F" 228 override_end[idx] = "FE0F"
251 229
diff --git a/admin/unidata/emoji-zwj.awk b/admin/unidata/emoji-zwj.awk
index 5aca157cbd4..d4e2944ca34 100644
--- a/admin/unidata/emoji-zwj.awk
+++ b/admin/unidata/emoji-zwj.awk
@@ -64,6 +64,44 @@ END {
64 print ";;; emoji-zwj.el --- emoji zwj character composition table -*- lexical-binding:t -*-" 64 print ";;; emoji-zwj.el --- emoji zwj character composition table -*- lexical-binding:t -*-"
65 print ";;; Automatically generated from admin/unidata/emoji-{zwj-,}sequences.txt" 65 print ";;; Automatically generated from admin/unidata/emoji-{zwj-,}sequences.txt"
66 print "(eval-when-compile (require 'regexp-opt))" 66 print "(eval-when-compile (require 'regexp-opt))"
67
68 # The following codepoints are not emoji, but they are part of
69 # emoji sequences. We have code in font.c:font_range that will
70 # try to display them with the emoji font anyway.
71
72 trigger_codepoints[1] = "261D"
73 trigger_codepoints[2] = "26F9"
74 trigger_codepoints[3] = "270C"
75 trigger_codepoints[4] = "270D"
76 trigger_codepoints[5] = "2764"
77 trigger_codepoints[6] = "1F3CB"
78 trigger_codepoints[7] = "1F3CC"
79 trigger_codepoints[8] = "1F3F3"
80 trigger_codepoints[9] = "1F3F4"
81 trigger_codepoints[10] = "1F441"
82 trigger_codepoints[11] = "1F574"
83 trigger_codepoints[12] = "1F575"
84 trigger_codepoints[13] = "1F590"
85
86 printf "(setq auto-composition-emoji-eligible-codepoints\n"
87 printf "'("
88
89 for (trig in trigger_codepoints)
90 {
91 printf("\n?\\N{U+%s}", trigger_codepoints[trig])
92 }
93 printf "\n))\n\n"
94
95 # We add entries for 'codepoint U+FE0F' here to ensure that the
96 # code in font_range is triggered.
97
98 for (trig in trigger_codepoints)
99 {
100 codepoint = trigger_codepoints[trig]
101 c = sprintf("\\N{U+%s}", codepoint)
102 vec[codepoint] = vec[codepoint] "\n\"" c "\\N{U+FE0F}\""
103 }
104
67 print "(dolist (elt `(" 105 print "(dolist (elt `("
68 106
69 for (elt in ch) 107 for (elt in ch)
@@ -98,6 +136,5 @@ END {
98 print " 0" 136 print " 0"
99 print " 'compose-gstring-for-graphic))))" 137 print " 'compose-gstring-for-graphic))))"
100 138
101 print "\n" 139 printf "\n(provide 'emoji-zwj)"
102 print "(provide 'emoji-zwj)"
103} 140}
diff --git a/doc/emacs/windows.texi b/doc/emacs/windows.texi
index facbc7f3ed8..8cb88a20954 100644
--- a/doc/emacs/windows.texi
+++ b/doc/emacs/windows.texi
@@ -444,7 +444,7 @@ selected window write:
444@group 444@group
445(customize-set-variable 445(customize-set-variable
446 'display-buffer-alist 446 'display-buffer-alist
447 '("\\*scratch\\*" (display-buffer-same-window))) 447 '(("\\*scratch\\*" (display-buffer-same-window))))
448@end group 448@end group
449@end example 449@end example
450 450
diff --git a/doc/lispintro/emacs-lisp-intro.texi b/doc/lispintro/emacs-lisp-intro.texi
index 81ae2536339..2a990ca9ce8 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
1177example, the word for the South American sloth, the @samp{ai}, is 1177example, the word for the South American sloth, the @samp{ai}, is
1178completely different from the two words, @samp{a}, and @samp{i}. 1178completely different from the two words, @samp{a}, and @samp{i}.
1179 1179
1180There are many kinds of atom in nature but only a few in Lisp: for 1180There are many kinds of atoms in nature but only a few in Lisp: for
1181example, @dfn{numbers}, such as 37, 511, or 1729, and @dfn{symbols}, such 1181example, @dfn{numbers}, such as 37, 511, or 1729, and @dfn{symbols}, such
1182as @samp{+}, @samp{foo}, or @samp{forward-line}. The words we have 1182as @samp{+}, @samp{foo}, or @samp{forward-line}. The words we have
1183listed in the examples above are all symbols. In everyday Lisp 1183listed in the examples above are all symbols. In everyday Lisp
diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index f851d12c080..56ac7118135 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
642accommodate an overlong tool bar. 642accommodate an overlong tool bar.
643 643
644@item Tab Bar 644@item Tab Bar
645@cindex internal tab bar 645@cindex tab bar
646The tab bar (@pxref{Tab Bars,,,emacs, The GNU Emacs Manual}) is always 646The tab bar (@pxref{Tab Bars,,,emacs, The GNU Emacs Manual}) is always
647drawn by Emacs itself. The tab bar appears above the tool bar in 647drawn by Emacs itself. The tab bar appears above the tool bar in
648Emacs built with an internal tool bar, and below the tool bar in 648Emacs 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
1218unchanged if this option is @code{t} or a list containing 1218unchanged if this option is @code{t} or a list containing
1219@code{vertical-scroll-bars}. 1219@code{vertical-scroll-bars}.
1220 1220
1221The default value is @code{'(tab-bar-lines tool-bar-lines)} for Lucid, 1221The default value is @code{(tab-bar-lines tool-bar-lines)} for Lucid,
1222Motif and MS-Windows (which means that adding/removing a tool or tab 1222Motif and MS-Windows (which means that adding/removing a tool or tab
1223bar there does not change the outer frame height), 1223bar there does not change the outer frame height),
1224@code{'(tab-bar-lines)} on all other window systems including GTK+ 1224@code{(tab-bar-lines)} on all other window systems including GTK+
1225(which means that changing any of the parameters listed above with the 1225(which means that changing any of the parameters listed above with the
1226exception of @code{tab-bar-lines} may change the size of the outer 1226exception of @code{tab-bar-lines} may change the size of the outer
1227frame), and @code{t} otherwise (which means the outer frame size never 1227frame), and @code{t} otherwise (which means the outer frame size never
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index fb72b8f7005..262516054ab 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
213 213
214Each window belongs to exactly one frame (@pxref{Frames}). For all 214Each window belongs to exactly one frame (@pxref{Frames}). For all
215windows belonging to a specific frame, we sometimes also say that these 215windows belonging to a specific frame, we sometimes also say that these
216windows are @dfn{owned} by that frame or simply that they are on that frame. 216windows are @dfn{owned} by that frame or simply that they are on that
217frame.
217 218
218@defun window-frame &optional window 219@defun window-frame &optional window
219This function returns the specified @var{window}'s frame---the frame 220This function returns the specified @var{window}'s frame---the frame
@@ -233,12 +234,6 @@ minibuffer window (@pxref{Minibuffer Windows}) in that list. If
233active. If @var{minibuffer} is neither @code{nil} nor @code{t}, the 234active. If @var{minibuffer} is neither @code{nil} nor @code{t}, the
234minibuffer window is never included. 235minibuffer window is never included.
235 236
236Note that the window returned by @code{minibuffer-window} called with
237the argument @var{frame} is returned by @code{window-list} called with
238the same argument if and only if that window actually belongs to
239@var{frame}. If the minibuffer window is owned by another frame, it is
240not returned by this invocation.
241
242The optional argument @var{window}, if non-@code{nil}, must be a live 237The optional argument @var{window}, if non-@code{nil}, must be a live
243window on the specified frame; then @var{window} will be the first 238window on the specified frame; then @var{window} will be the first
244element in the returned list. If @var{window} is omitted or @code{nil}, 239element 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 8cc3eafc874..4e95b1211fa 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -1071,7 +1071,7 @@ capable of servicing requests from @value{tramp}.
1071 1071
1072This non-native @value{tramp} method connects via the Server Message 1072This non-native @value{tramp} method connects via the Server Message
1073Block (SMB) networking protocol to hosts running file servers that are 1073Block (SMB) networking protocol to hosts running file servers that are
1074typically based on @url{https://www.samba.org/,,Samba} or MS Windows. 1074typically based on @uref{https://www.samba.org/,,Samba} or MS Windows.
1075 1075
1076Using @command{smbclient} requires a few tweaks when working with 1076Using @command{smbclient} requires a few tweaks when working with
1077@value{tramp}: 1077@value{tramp}:
@@ -1323,7 +1323,7 @@ possible, @value{tramp} emulates those operations otherwise.
1323 1323
1324@vindex tramp-rclone-program 1324@vindex tramp-rclone-program
1325The program @command{rclone} allows to access different system 1325The program @command{rclone} allows to access different system
1326storages in the cloud, see @url{https://rclone.org/} for a list of 1326storages in the cloud, see @uref{https://rclone.org/} for a list of
1327supported systems. If the @command{rclone} program isn't found in 1327supported systems. If the @command{rclone} program isn't found in
1328your @env{PATH} environment variable, you can tell @value{tramp} its 1328your @env{PATH} environment variable, you can tell @value{tramp} its
1329absolute path via the user option @code{tramp-rclone-program}. 1329absolute path via the user option @code{tramp-rclone-program}.
@@ -1362,7 +1362,7 @@ for accessing the system storage, you should use it.
1362On local hosts which have installed the @command{sshfs} client for 1362On local hosts which have installed the @command{sshfs} client for
1363mounting a file system based on @command{sftp}, this method can be 1363mounting a file system based on @command{sftp}, this method can be
1364used, see 1364used, see
1365@url{https://github.com/libfuse/sshfs/blob/master/README.rst/}. If 1365@uref{https://github.com/libfuse/sshfs/blob/master/README.rst/}. If
1366the @command{sshfs} program isn't found in your @env{PATH} environment 1366the @command{sshfs} program isn't found in your @env{PATH} environment
1367variable, you can tell @value{tramp} its absolute path via the user 1367variable, you can tell @value{tramp} its absolute path via the user
1368option @code{tramp-sshfs-program}. 1368option @code{tramp-sshfs-program}.
@@ -5192,13 +5192,14 @@ tramp-compat-with-mutex}
5192 5192
5193@value{tramp} comes with compatibility code for different Emacs 5193@value{tramp} comes with compatibility code for different Emacs
5194versions. When you see such a message (the text might differ), you 5194versions. When you see such a message (the text might differ), you
5195don't use the Emacs built-in version of @value{tramp}. In case you 5195don't use the Emacs built-in version of @value{tramp}, and you must
5196have installed @value{tramp} from GNU ELPA, 5196recompile it. In case you have installed @value{tramp} from GNU ELPA,
5197@ifset installchapter 5197@ifset installchapter
5198@xref{ELPA Installation}. 5198@xref{ELPA Installation}. Otherwise, @xref{Recompilation}.
5199@end ifset 5199@end ifset
5200@ifclear installchapter 5200@ifclear installchapter
5201see the package README file for instructions how to recompile it. 5201see @uref{@value{trampurl}#ELPA-Installation}. Otherwise, see
5202@uref{@value{trampurl}#Recompilation}.
5202@end ifclear 5203@end ifclear
5203 5204
5204 5205
diff --git a/etc/NEWS.28 b/etc/NEWS.28
index b7c4346db97..b410ef77cfa 100644
--- a/etc/NEWS.28
+++ b/etc/NEWS.28
@@ -2567,7 +2567,7 @@ that prompt for a project directory.
2567+++ 2567+++
2568*** New prefix keymap 'project-prefix-map'. 2568*** New prefix keymap 'project-prefix-map'.
2569Key sequences that invoke project-related commands start with the 2569Key sequences that invoke project-related commands start with the
2570prefix 'C-x p'. Type "C-x p C-h" to show the full list. 2570prefix 'C-x p'. Type 'C-x p C-h' to show the full list.
2571 2571
2572+++ 2572+++
2573*** New commands 'project-dired', 'project-vc-dir', 'project-shell', 2573*** New commands 'project-dired', 'project-vc-dir', 'project-shell',
@@ -3220,19 +3220,20 @@ batch mode.
3220 3220
3221+++ 3221+++
3222** New transient mode 'repeat-mode' to allow shorter key sequences. 3222** New transient mode 'repeat-mode' to allow shorter key sequences.
3223You can type 'C-x u u' instead of 'C-x u C-x u' to undo many changes, 3223Type 'M-x repeat-mode RET' to enable this mode. You can then type
3224'C-x o o' instead of 'C-x o C-x o' to switch several windows, 3224'C-x u u' instead of 'C-x u C-x u' to undo many changes, 'C-x o o'
3225'C-x { { } } ^ ^ v v' to resize the selected window interactively, 3225instead of 'C-x o C-x o' to switch windows, 'C-x { { } } ^ ^ v v' to
3226'M-g n n p p' to navigate next-error matches. Any other key exits 3226resize the selected window interactively, 'M-g n n p p' to navigate
3227transient mode and then is executed normally. 'repeat-exit-key' 3227next-error matches. Any other key exits transient mode and then is
3228defines an additional key to exit mode like 'isearch-exit' ('RET'). 3228executed normally. 'repeat-exit-key' defines an additional key to
3229The user option 'repeat-exit-timeout' specifies the number of 3229exit mode like 'isearch-exit' ('RET'). The user option
3230seconds of idle time to break the repetition chain automatically. 3230'repeat-exit-timeout' specifies the number of seconds of idle time to
3231With 'repeat-keep-prefix' you can keep the prefix arg of the previous 3231break the repetition chain automatically. With 'repeat-keep-prefix'
3232command. For example, this can help to reverse the window navigation 3232you can keep the prefix arg of the previous command. For example,
3233direction with e.g. 'C-x o M-- o o'. Also it can help to set a new 3233this can help to reverse the window navigation direction with
3234step with e.g. 'C-x { C-5 { { {', which will set the window resizing 3234e.g. 'C-x o M-- o o'. Also it can help to set a new step with
3235step to 5 columns. 3235e.g. 'C-x { C-5 { { {', which will set the window resizing step to 5
3236columns.
3236 3237
3237--- 3238---
3238** New themes 'modus-vivendi' and 'modus-operandi'. 3239** New themes 'modus-vivendi' and 'modus-operandi'.
diff --git a/lisp/composite.el b/lisp/composite.el
index 859253ec7e2..99f528a0779 100644
--- a/lisp/composite.el
+++ b/lisp/composite.el
@@ -834,8 +834,15 @@ and the second is a glyph for a variation selector."
834 (lgstring-set-glyph gstring 1 nil) 834 (lgstring-set-glyph gstring 1 nil)
835 (throw 'tag gstring))))))) 835 (throw 'tag gstring)))))))
836 836
837;; We explicitly don't handle #xFE0F (VS-16) here, because that's
838;; taken care of by font_range in font.c, which will check for an
839;; emoji font for codepoints used in compositions even if they're not
840;; emoji themselves, and thus choose the Emoji presentation for them
841;; when followed by VS-16. VS-15 *is* handled here, because if it's
842;; handled in font_range, we end up choosing the Emoji presentation
843;; rather than the Text presentation.
837(let ((elt '([".." 1 compose-gstring-for-variation-glyph]))) 844(let ((elt '([".." 1 compose-gstring-for-variation-glyph])))
838 (set-char-table-range composition-function-table '(#xFE00 . #xFE0F) elt) 845 (set-char-table-range composition-function-table '(#xFE00 . #xFE0E) elt)
839 (set-char-table-range composition-function-table '(#xE0100 . #xE01EF) elt)) 846 (set-char-table-range composition-function-table '(#xE0100 . #xE01EF) elt))
840 847
841(defun auto-compose-chars (func from to font-object string direction) 848(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 6d8bed1d786..362a258f43d 100644
--- a/lisp/net/tramp-adb.el
+++ b/lisp/net/tramp-adb.el
@@ -128,8 +128,7 @@ It is used for TCP/IP devices."
128 (file-attributes . tramp-adb-handle-file-attributes) 128 (file-attributes . tramp-adb-handle-file-attributes)
129 (file-directory-p . tramp-handle-file-directory-p) 129 (file-directory-p . tramp-handle-file-directory-p)
130 (file-equal-p . tramp-handle-file-equal-p) 130 (file-equal-p . tramp-handle-file-equal-p)
131 ;; FIXME: This is too sloppy. 131 (file-executable-p . tramp-adb-handle-file-executable-p)
132 (file-executable-p . tramp-handle-file-exists-p)
133 (file-exists-p . tramp-handle-file-exists-p) 132 (file-exists-p . tramp-handle-file-exists-p)
134 (file-in-directory-p . tramp-handle-file-in-directory-p) 133 (file-in-directory-p . tramp-handle-file-in-directory-p)
135 (file-local-copy . tramp-adb-handle-file-local-copy) 134 (file-local-copy . tramp-adb-handle-file-local-copy)
@@ -147,7 +146,7 @@ It is used for TCP/IP devices."
147 (file-notify-rm-watch . tramp-handle-file-notify-rm-watch) 146 (file-notify-rm-watch . tramp-handle-file-notify-rm-watch)
148 (file-notify-valid-p . tramp-handle-file-notify-valid-p) 147 (file-notify-valid-p . tramp-handle-file-notify-valid-p)
149 (file-ownership-preserved-p . ignore) 148 (file-ownership-preserved-p . ignore)
150 (file-readable-p . tramp-handle-file-exists-p) 149 (file-readable-p . tramp-adb-handle-file-readable-p)
151 (file-regular-p . tramp-handle-file-regular-p) 150 (file-regular-p . tramp-handle-file-regular-p)
152 (file-remote-p . tramp-handle-file-remote-p) 151 (file-remote-p . tramp-handle-file-remote-p)
153 (file-selinux-context . tramp-handle-file-selinux-context) 152 (file-selinux-context . tramp-handle-file-selinux-context)
@@ -515,28 +514,31 @@ Emacs dired can't find files."
515 (set-file-modes tmpfile (logior (or (file-modes filename) 0) #o0400))) 514 (set-file-modes tmpfile (logior (or (file-modes filename) 0) #o0400)))
516 tmpfile))) 515 tmpfile)))
517 516
517(defun tramp-adb-handle-file-executable-p (filename)
518 "Like `file-executable-p' for Tramp files."
519 (with-parsed-tramp-file-name filename nil
520 (with-tramp-file-property v localname "file-executable-p"
521 (tramp-adb-send-command-and-check
522 v (format "test -x %s" (tramp-shell-quote-argument localname))))))
523
524(defun tramp-adb-handle-file-readable-p (filename)
525 "Like `file-readable-p' for Tramp files."
526 (with-parsed-tramp-file-name filename nil
527 (with-tramp-file-property v localname "file-readable-p"
528 (or (tramp-handle-file-readable-p filename)
529 (tramp-adb-send-command-and-check
530 v (format "test -r %s" (tramp-shell-quote-argument localname)))))))
531
518(defun tramp-adb-handle-file-writable-p (filename) 532(defun tramp-adb-handle-file-writable-p (filename)
519 "Like `file-writable-p' for Tramp files. 533 "Like `file-writable-p' for Tramp files."
520But handle the case, if the \"test\" command is not available."
521 (with-parsed-tramp-file-name filename nil 534 (with-parsed-tramp-file-name filename nil
522 (with-tramp-file-property v localname "file-writable-p" 535 (with-tramp-file-property v localname "file-writable-p"
523 (if (tramp-adb-find-test-command v) 536 (if (file-exists-p filename)
524 (if (file-exists-p filename) 537 (tramp-adb-send-command-and-check
525 (tramp-adb-send-command-and-check 538 v (format "test -w %s" (tramp-shell-quote-argument localname)))
526 v (format "test -w %s" (tramp-shell-quote-argument localname))) 539 (and
527 (and 540 (file-directory-p (file-name-directory filename))
528 (file-directory-p (file-name-directory filename)) 541 (file-writable-p (file-name-directory filename)))))))
529 (file-writable-p (file-name-directory filename))))
530
531 ;; Missing "test" command on Android < 4.
532 (let ((rw-path "/data/data"))
533 (tramp-message
534 v 5
535 "Not implemented yet (assuming \"/data/data\" is writable): %s"
536 localname)
537 (and (>= (length localname) (length rw-path))
538 (string= (substring localname 0 (length rw-path))
539 rw-path)))))))
540 542
541(defun tramp-adb-handle-write-region 543(defun tramp-adb-handle-write-region
542 (start end filename &optional append visit lockname mustbenew) 544 (start end filename &optional append visit lockname mustbenew)
@@ -1043,12 +1045,13 @@ implementation will be used."
1043 (rename-file remote-tmpstderr stderr)))) 1045 (rename-file remote-tmpstderr stderr))))
1044 ;; Read initial output. Remove the first 1046 ;; Read initial output. Remove the first
1045 ;; line, which is the command echo. 1047 ;; line, which is the command echo.
1046 (while 1048 (unless (eq filter t)
1047 (progn 1049 (while
1048 (goto-char (point-min)) 1050 (progn
1049 (not (re-search-forward "[\n]" nil t))) 1051 (goto-char (point-min))
1050 (tramp-accept-process-output p 0)) 1052 (not (re-search-forward "[\n]" nil t)))
1051 (delete-region (point-min) (point)) 1053 (tramp-accept-process-output p 0))
1054 (delete-region (point-min) (point)))
1052 ;; Provide error buffer. This shows only 1055 ;; Provide error buffer. This shows only
1053 ;; initial error messages; messages arriving 1056 ;; initial error messages; messages arriving
1054 ;; later on will be inserted when the 1057 ;; later on will be inserted when the
@@ -1141,12 +1144,6 @@ error and non-nil on success."
1141 (let ((inhibit-read-only t)) (delete-region (point-min) (point-max))) 1144 (let ((inhibit-read-only t)) (delete-region (point-min) (point-max)))
1142 (zerop (apply #'tramp-call-process vec tramp-adb-program nil t nil args)))) 1145 (zerop (apply #'tramp-call-process vec tramp-adb-program nil t nil args))))
1143 1146
1144(defun tramp-adb-find-test-command (vec)
1145 "Check whether the ash has a builtin \"test\" command.
1146This happens for Android >= 4.0."
1147 (with-tramp-connection-property vec "test"
1148 (tramp-adb-send-command-and-check vec "type test")))
1149
1150;; Connection functions 1147;; Connection functions
1151 1148
1152(defun tramp-adb-send-command (vec command &optional neveropen nooutput) 1149(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 115d005c0ca..ebe57a8bcec 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.")
788 (file-notify-rm-watch . tramp-handle-file-notify-rm-watch) 788 (file-notify-rm-watch . tramp-handle-file-notify-rm-watch)
789 (file-notify-valid-p . tramp-handle-file-notify-valid-p) 789 (file-notify-valid-p . tramp-handle-file-notify-valid-p)
790 (file-ownership-preserved-p . ignore) 790 (file-ownership-preserved-p . ignore)
791 (file-readable-p . tramp-gvfs-handle-file-readable-p) 791 (file-readable-p . tramp-handle-file-readable-p)
792 (file-regular-p . tramp-handle-file-regular-p) 792 (file-regular-p . tramp-handle-file-regular-p)
793 (file-remote-p . tramp-handle-file-remote-p) 793 (file-remote-p . tramp-handle-file-remote-p)
794 (file-selinux-context . tramp-handle-file-selinux-context) 794 (file-selinux-context . tramp-handle-file-selinux-context)
@@ -1396,8 +1396,7 @@ If FILE-SYSTEM is non-nil, return file system attributes."
1396 "Like `file-executable-p' for Tramp files." 1396 "Like `file-executable-p' for Tramp files."
1397 (with-parsed-tramp-file-name filename nil 1397 (with-parsed-tramp-file-name filename nil
1398 (with-tramp-file-property v localname "file-executable-p" 1398 (with-tramp-file-property v localname "file-executable-p"
1399 (and (file-exists-p filename) 1399 (tramp-check-cached-permissions v ?x))))
1400 (tramp-check-cached-permissions v ?x)))))
1401 1400
1402(defun tramp-gvfs-handle-file-name-all-completions (filename directory) 1401(defun tramp-gvfs-handle-file-name-all-completions (filename directory)
1403 "Like `file-name-all-completions' for Tramp files." 1402 "Like `file-name-all-completions' for Tramp files."
@@ -1519,31 +1518,6 @@ If FILE-SYSTEM is non-nil, return file system attributes."
1519 (when string (tramp-message proc 10 "Rest string:\n%s" string)) 1518 (when string (tramp-message proc 10 "Rest string:\n%s" string))
1520 (process-put proc 'rest-string string))) 1519 (process-put proc 'rest-string string)))
1521 1520
1522(defun tramp-gvfs-handle-file-readable-p (filename)
1523 "Like `file-readable-p' for Tramp files."
1524 (with-parsed-tramp-file-name filename nil
1525 (with-tramp-file-property v localname "file-readable-p"
1526 (and (file-exists-p filename)
1527 (or (tramp-check-cached-permissions v ?r)
1528 ;; `tramp-check-cached-permissions' doesn't handle
1529 ;; symbolic links.
1530 (and (stringp (file-symlink-p filename))
1531 (file-readable-p
1532 (concat
1533 (file-remote-p filename) (file-symlink-p filename))))
1534 ;; If the user is different from what we guess to be
1535 ;; the user, we don't know. Let's check, whether
1536 ;; access is restricted explicitly.
1537 (and (/= (tramp-get-remote-uid v 'integer)
1538 (tramp-compat-file-attribute-user-id
1539 (file-attributes filename 'integer)))
1540 (not
1541 (string-equal
1542 "FALSE"
1543 (cdr (assoc
1544 "access::can-read"
1545 (tramp-gvfs-get-file-attributes filename)))))))))))
1546
1547(defun tramp-gvfs-handle-file-system-info (filename) 1521(defun tramp-gvfs-handle-file-system-info (filename)
1548 "Like `file-system-info' for Tramp files." 1522 "Like `file-system-info' for Tramp files."
1549 (setq filename (directory-file-name (expand-file-name filename))) 1523 (setq filename (directory-file-name (expand-file-name filename)))
diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index 6984dd8b429..6f3b3245225 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'."
1580 "Like `file-readable-p' for Tramp files." 1580 "Like `file-readable-p' for Tramp files."
1581 (with-parsed-tramp-file-name filename nil 1581 (with-parsed-tramp-file-name filename nil
1582 (with-tramp-file-property v localname "file-readable-p" 1582 (with-tramp-file-property v localname "file-readable-p"
1583 ;; Examine `file-attributes' cache to see if request can be 1583 (or (tramp-handle-file-readable-p filename)
1584 ;; satisfied without remote operation.
1585 (or (tramp-check-cached-permissions v ?r)
1586 (tramp-run-test "-r" filename))))) 1584 (tramp-run-test "-r" filename)))))
1587 1585
1588;; Functions implemented using the basic functions above. 1586;; Functions implemented using the basic functions above.
diff --git a/lisp/net/tramp-sudoedit.el b/lisp/net/tramp-sudoedit.el
index 516d46da37d..845f31d09b1 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."
464 "Like `file-readable-p' for Tramp files." 464 "Like `file-readable-p' for Tramp files."
465 (with-parsed-tramp-file-name filename nil 465 (with-parsed-tramp-file-name filename nil
466 (with-tramp-file-property v localname "file-readable-p" 466 (with-tramp-file-property v localname "file-readable-p"
467 (tramp-sudoedit-send-command 467 (or (tramp-handle-file-readable-p filename)
468 v "test" "-r" (tramp-compat-file-name-unquote localname))))) 468 (tramp-sudoedit-send-command
469 v "test" "-r" (tramp-compat-file-name-unquote localname))))))
469 470
470(defun tramp-sudoedit-handle-set-file-modes (filename mode &optional flag) 471(defun tramp-sudoedit-handle-set-file-modes (filename mode &optional flag)
471 "Like `set-file-modes' for Tramp files." 472 "Like `set-file-modes' for Tramp files."
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 318b4e454da..372e0a2cb73 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
2087signal identifier to be raised, remaining arguments passed to 2087signal identifier to be raised, remaining arguments passed to
2088`tramp-message'. Finally, signal SIGNAL is raised with 2088`tramp-message'. Finally, signal SIGNAL is raised with
2089FMT-STRING and ARGUMENTS." 2089FMT-STRING and ARGUMENTS."
2090 (let ((inhibit-message t) 2090 (let (signal-hook-function)
2091 signal-hook-function)
2092 (tramp-backtrace vec-or-proc) 2091 (tramp-backtrace vec-or-proc)
2093 (unless arguments 2092 (unless arguments
2094 ;; FMT-STRING could be just a file name, as in 2093 ;; FMT-STRING could be just a file name, as in
@@ -2198,9 +2197,10 @@ the resulting error message."
2198 ;; `custom-initialize-*' functions provoke `void-variable' errors. 2197 ;; `custom-initialize-*' functions provoke `void-variable' errors.
2199 ;; We don't want to see them in the backtrace. 2198 ;; We don't want to see them in the backtrace.
2200 (unless (eq error-symbol 'void-variable) 2199 (unless (eq error-symbol 'void-variable)
2201 (tramp-error 2200 (let ((inhibit-message t))
2202 (car tramp-current-connection) error-symbol 2201 (tramp-error
2203 (mapconcat (lambda (x) (format "%s" x)) data " ")))) 2202 (car tramp-current-connection) error-symbol
2203 (mapconcat (lambda (x) (format "%s" x)) data " ")))))
2204 2204
2205(put #'tramp-signal-hook-function 'tramp-suppress-trace t) 2205(put #'tramp-signal-hook-function 'tramp-suppress-trace t)
2206 2206
@@ -3275,10 +3275,18 @@ User is always nil."
3275 3275
3276(defun tramp-handle-access-file (filename string) 3276(defun tramp-handle-access-file (filename string)
3277 "Like `access-file' for Tramp files." 3277 "Like `access-file' for Tramp files."
3278 (unless (file-readable-p (file-truename filename)) 3278 (setq filename (file-truename filename))
3279 (tramp-compat-file-missing 3279 (with-parsed-tramp-file-name filename v
3280 (tramp-dissect-file-name filename) 3280 (if (file-exists-p filename)
3281 (format "%s: %s" string filename)))) 3281 (unless
3282 (funcall
3283 (if (file-directory-p filename)
3284 #'file-accessible-directory-p #'file-readable-p)
3285 filename)
3286 (tramp-error
3287 v 'file-error (format "%s: Permission denied, %s" string filename)))
3288 (tramp-compat-file-missing
3289 v (format "%s: No such file or directory, %s" string filename)))))
3282 3290
3283(defun tramp-handle-add-name-to-file 3291(defun tramp-handle-add-name-to-file
3284 (filename newname &optional ok-if-already-exists) 3292 (filename newname &optional ok-if-already-exists)
@@ -3568,6 +3576,17 @@ User is always nil."
3568 (tramp-compat-file-attribute-modification-time 3576 (tramp-compat-file-attribute-modification-time
3569 (file-attributes file1)))))) 3577 (file-attributes file1))))))
3570 3578
3579(defun tramp-handle-file-readable-p (filename)
3580 "Like `file-readable-p' for Tramp files."
3581 (with-parsed-tramp-file-name filename nil
3582 (with-tramp-file-property v localname "file-readable-p"
3583 (or (tramp-check-cached-permissions v ?r)
3584 ;; `tramp-check-cached-permissions' doesn't handle symbolic
3585 ;; links.
3586 (when-let ((symlink (file-symlink-p filename)))
3587 (and (stringp symlink)
3588 (file-readable-p (concat (file-remote-p filename) symlink))))))))
3589
3571(defun tramp-handle-file-regular-p (filename) 3590(defun tramp-handle-file-regular-p (filename)
3572 "Like `file-regular-p' for Tramp files." 3591 "Like `file-regular-p' for Tramp files."
3573 (and (file-exists-p filename) 3592 (and (file-exists-p filename)
@@ -4220,7 +4239,12 @@ substitution. SPEC-LIST is a list of char/value pairs used for
4220 :name name :buffer buffer 4239 :name name :buffer buffer
4221 :command (append `(,login-program) login-args command) 4240 :command (append `(,login-program) login-args command)
4222 :coding coding :noquery noquery :connection-type connection-type 4241 :coding coding :noquery noquery :connection-type connection-type
4223 :filter filter :sentinel sentinel :stderr stderr)) 4242 :sentinel sentinel :stderr stderr))
4243 ;; Set filter. Prior Emacs 29.1, it doesn't work reliable
4244 ;; to provide it as `make-process' argument when filter is
4245 ;; t. See Bug#51177.
4246 (when filter
4247 (set-process-filter p filter))
4224 4248
4225 (tramp-message v 6 "%s" (string-join (process-command p) " ")) 4249 (tramp-message v 6 "%s" (string-join (process-command p) " "))
4226 p)))))) 4250 p))))))
diff --git a/lisp/progmodes/bug-reference.el b/lisp/progmodes/bug-reference.el
index c6327c1a3f3..63850571c53 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'.")
72 (get s 'bug-reference-url-format))))) 72 (get s 'bug-reference-url-format)))))
73 73
74(defcustom bug-reference-bug-regexp 74(defcustom bug-reference-bug-regexp
75 "\\(\\(?:[Bb]ug ?#?\\|[Pp]atch ?#\\|RFE ?#\\|PR [a-z+-]+/\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)" 75 "\\(\\b\\(?:[Bb]ug ?#?\\|[Pp]atch ?#\\|RFE ?#\\|PR [a-z+-]+/\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)"
76 "Regular expression matching bug references. 76 "Regular expression matching bug references.
77The first subexpression defines the region of the bug-reference 77The first subexpression defines the region of the bug-reference
78overlay, i.e., the region being fontified and made clickable in 78overlay, i.e., the region being fontified and made clickable in
@@ -350,7 +350,7 @@ generated from `bug-reference-forge-alist'."
350 ;; `bug-reference-url-format' and 350 ;; `bug-reference-url-format' and
351 ;; `bug-reference-bug-regexp' aren't set already. 351 ;; `bug-reference-bug-regexp' aren't set already.
352 ("git\\.\\(?:sv\\|savannah\\)\\.gnu\\.org:" 352 ("git\\.\\(?:sv\\|savannah\\)\\.gnu\\.org:"
353 "\\<\\(\\(?:[Bb]ug ?#?\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)\\>" 353 "\\(\\b\\(?:[Bb]ug ?#?\\)\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)\\>"
354 ,(lambda (_) "https://debbugs.gnu.org/%s")) 354 ,(lambda (_) "https://debbugs.gnu.org/%s"))
355 355
356 ;; Entries for the software forges of 356 ;; Entries for the software forges of
@@ -395,7 +395,7 @@ applicable."
395 ,(regexp-opt '("@debbugs.gnu.org" "-devel@gnu.org" 395 ,(regexp-opt '("@debbugs.gnu.org" "-devel@gnu.org"
396 ;; List-Id of Gnus devel mailing list. 396 ;; List-Id of Gnus devel mailing list.
397 "ding.gnus.org")) 397 "ding.gnus.org"))
398 "\\([Bb]ug ?#?\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)" 398 "\\(\\b[Bb]ug ?#?\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)"
399 "https://debbugs.gnu.org/%s")) 399 "https://debbugs.gnu.org/%s"))
400 "An alist for setting up `bug-reference-mode' in mail modes. 400 "An alist for setting up `bug-reference-mode' in mail modes.
401 401
@@ -526,7 +526,7 @@ From, and Cc against HEADER-REGEXP in
526 `((,(concat "#" (regexp-opt '("emacs" "gnus" "org-mode" "rcirc" 526 `((,(concat "#" (regexp-opt '("emacs" "gnus" "org-mode" "rcirc"
527 "erc") 'words)) 527 "erc") 'words))
528 "Libera.Chat" 528 "Libera.Chat"
529 "\\([Bb]ug ?#?\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)" 529 "\\(\\b[Bb]ug ?#?\\([0-9]+\\(?:#[0-9]+\\)?\\)\\)"
530 "https://debbugs.gnu.org/%s")) 530 "https://debbugs.gnu.org/%s"))
531 "An alist for setting up `bug-reference-mode' in IRC modes. 531 "An alist for setting up `bug-reference-mode' in IRC modes.
532 532
diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el
index 20cdb72ccf1..c42c95764a2 100644
--- a/lisp/progmodes/cc-engine.el
+++ b/lisp/progmodes/cc-engine.el
@@ -10409,6 +10409,7 @@ This function might do hidden buffer changes."
10409 ;; are directly inside a class (etc.) called "bar". 10409 ;; are directly inside a class (etc.) called "bar".
10410 (save-excursion 10410 (save-excursion
10411 (and 10411 (and
10412 type-start
10412 (progn 10413 (progn
10413 (goto-char name-start) 10414 (goto-char name-start)
10414 (not (memq (c-forward-type) '(nil maybe)))) 10415 (not (memq (c-forward-type) '(nil maybe))))
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index 10a37942571..9522055670d 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -877,17 +877,17 @@ namespace but with lower confidence."
877 ;; ^ index K ^ index J ^ index I 877 ;; ^ index K ^ index J ^ index I
878 (let* ((i (elisp--xref-list-index)) 878 (let* ((i (elisp--xref-list-index))
879 (i-head (looking-at-sym)) 879 (i-head (looking-at-sym))
880 (i-paren (and i-head (eq (char-before) ?\() 880 (i-paren (and i (eq (char-before) ?\()
881 (progn (backward-char) t))) 881 (progn (backward-char) t)))
882 (i-quoted (and i-paren (memq (char-before) '(?\' ?`)))) 882 (i-quoted (and i-paren (memq (char-before) '(?\' ?`))))
883 (j (and i-paren (elisp--xref-list-index))) 883 (j (and i-paren (elisp--xref-list-index)))
884 (j-head (and j (looking-at-sym))) 884 (j-head (and j (looking-at-sym)))
885 (j-paren (and j-head (eq (char-before) ?\() 885 (j-paren (and j (eq (char-before) ?\()
886 (progn (backward-char) t))) 886 (progn (backward-char) t)))
887 (j-quoted (and j-paren (memq (char-before) '(?\' ?`)))) 887 (j-quoted (and j-paren (memq (char-before) '(?\' ?`))))
888 (k (and j-paren (elisp--xref-list-index))) 888 (k (and j-paren (elisp--xref-list-index)))
889 (k-head (and k (looking-at-sym))) 889 (k-head (and k (looking-at-sym)))
890 (k-paren (and k-head (eq (char-before) ?\() 890 (k-paren (and k (eq (char-before) ?\()
891 (progn (backward-char) t))) 891 (progn (backward-char) t)))
892 (k-quoted (and k-paren (memq (char-before) '(?\' ?`))))) 892 (k-quoted (and k-paren (memq (char-before) '(?\' ?`)))))
893 (cond 893 (cond
diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el
index 3dc95c91691..03556919b20 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."
239 (string-to-number (string-replace "tab-" "" key-name))))) 239 (string-to-number (string-replace "tab-" "" key-name)))))
240 (t t))) 240 (t t)))
241 241
242(defvar tab-bar-drag-maybe) 242(defvar tab-bar--dragging-in-progress)
243 243
244(defun tab-bar--event-to-item (posn) 244(defun tab-bar--event-to-item (posn)
245 "This function extracts extra info from the mouse event at position POSN. 245 "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:
248 KEY-BINDING is the binding of KEY; 248 KEY-BINDING is the binding of KEY;
249 CLOSE-P is non-nil if the mouse event was a click on the close button \"x\", 249 CLOSE-P is non-nil if the mouse event was a click on the close button \"x\",
250 nil otherwise." 250 nil otherwise."
251 (setq tab-bar-drag-maybe nil) 251 (setq tab-bar--dragging-in-progress nil)
252 (if (posn-window posn) 252 (if (posn-window posn)
253 (let ((caption (car (posn-string posn)))) 253 (let ((caption (car (posn-string posn))))
254 (when caption 254 (when caption
@@ -280,7 +280,7 @@ existing tab."
280 (interactive "e") 280 (interactive "e")
281 (let* ((item (tab-bar--event-to-item (event-start event))) 281 (let* ((item (tab-bar--event-to-item (event-start event)))
282 (tab-number (tab-bar--key-to-number (nth 0 item)))) 282 (tab-number (tab-bar--key-to-number (nth 0 item))))
283 (setq tab-bar-drag-maybe t) 283 (setq tab-bar--dragging-in-progress t)
284 ;; Don't close the tab when clicked on the close button. Also 284 ;; Don't close the tab when clicked on the close button. Also
285 ;; don't add new tab on down-mouse. Let `tab-bar-mouse-1' do this. 285 ;; don't add new tab on down-mouse. Let `tab-bar-mouse-1' do this.
286 (unless (or (eq (car item) 'add-tab) (nth 2 item)) 286 (unless (or (eq (car item) 'add-tab) (nth 2 item))
@@ -357,7 +357,7 @@ only when you click on its \"x\" close button."
357This command should be bound to a drag event. It moves the tab 357This command should be bound to a drag event. It moves the tab
358at the mouse-down event to the position at mouse-up event." 358at the mouse-down event to the position at mouse-up event."
359 (interactive "e") 359 (interactive "e")
360 (setq tab-bar-drag-maybe nil) 360 (setq tab-bar--dragging-in-progress nil)
361 (let ((from (tab-bar--key-to-number 361 (let ((from (tab-bar--key-to-number
362 (nth 0 (tab-bar--event-to-item 362 (nth 0 (tab-bar--event-to-item
363 (event-start event))))) 363 (event-start event)))))
diff --git a/src/composite.c b/src/composite.c
index f456e7a835d..c170805d9dd 100644
--- a/src/composite.c
+++ b/src/composite.c
@@ -2124,6 +2124,17 @@ GSTRING, or modify GSTRING itself and return it.
2124See also the documentation of `auto-composition-mode'. */); 2124See also the documentation of `auto-composition-mode'. */);
2125 Vcomposition_function_table = Fmake_char_table (Qnil, Qnil); 2125 Vcomposition_function_table = Fmake_char_table (Qnil, Qnil);
2126 2126
2127 DEFVAR_LISP ("auto-composition-emoji-eligible-codepoints", Vauto_composition_emoji_eligible_codepoints,
2128 doc: /* List of codepoints for which auto-composition will check for an emoji font.
2129
2130These are codepoints which have Emoji_Presentation = No, and thus by
2131default are not displayed as emoji. In certain circumstances, such as
2132when followed by U+FE0F (VS-16) the emoji font should be used for
2133them anyway.
2134
2135This list is auto-generated, you should not need to modify it. */);
2136 Vauto_composition_emoji_eligible_codepoints = Qnil;
2137
2127 defsubr (&Scompose_region_internal); 2138 defsubr (&Scompose_region_internal);
2128 defsubr (&Scompose_string_internal); 2139 defsubr (&Scompose_string_internal);
2129 defsubr (&Sfind_composition_internal); 2140 defsubr (&Sfind_composition_internal);
diff --git a/src/font.c b/src/font.c
index 83f0f8296ad..6cd4a6b5c11 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,
3860 3860
3861#ifdef HAVE_WINDOW_SYSTEM 3861#ifdef HAVE_WINDOW_SYSTEM
3862 3862
3863/* Check if CH is a codepoint for which we should attempt to use the
3864 emoji font, even if the codepoint itself has Emoji_Presentation =
3865 No. Vauto_composition_emoji_eligible_codepoints is filled in for
3866 us by admin/unidata/emoji-zwj.awk. */
3867static bool
3868codepoint_is_emoji_eligible (int ch)
3869{
3870 if (EQ (CHAR_TABLE_REF (Vchar_script_table, ch), Qemoji))
3871 return true;
3872
3873 if (! NILP (Fmemq (make_fixnum (ch),
3874 Vauto_composition_emoji_eligible_codepoints)))
3875 return true;
3876
3877 return false;
3878}
3879
3863/* Check how many characters after character/byte position POS/POS_BYTE 3880/* Check how many characters after character/byte position POS/POS_BYTE
3864 (at most to *LIMIT) can be displayed by the same font in the window W. 3881 (at most to *LIMIT) can be displayed by the same font in the window W.
3865 FACE, if non-NULL, is the face selected for the character at POS. 3882 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,
3907 /* If the composition was triggered by an emoji, use a character 3924 /* If the composition was triggered by an emoji, use a character
3908 from 'script-representative-chars', rather than the first 3925 from 'script-representative-chars', rather than the first
3909 character in the string, to determine the font to use. */ 3926 character in the string, to determine the font to use. */
3910 if (EQ (CHAR_TABLE_REF (Vchar_script_table, ch), 3927 if (codepoint_is_emoji_eligible (ch))
3911 Qemoji))
3912 { 3928 {
3913 Lisp_Object val = assq_no_quit (Qemoji, Vscript_representative_chars); 3929 Lisp_Object val = assq_no_quit (Qemoji, Vscript_representative_chars);
3914 if (CONSP (val)) 3930 if (CONSP (val))
diff --git a/src/xdisp.c b/src/xdisp.c
index 578458bd248..738f22abedd 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -33780,7 +33780,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
33780 if (EQ (window, f->tab_bar_window)) 33780 if (EQ (window, f->tab_bar_window))
33781 { 33781 {
33782 note_tab_bar_highlight (f, x, y); 33782 note_tab_bar_highlight (f, x, y);
33783 if (tab_bar_drag_maybe) 33783 if (tab_bar__dragging_in_progress)
33784 { 33784 {
33785 cursor = FRAME_OUTPUT_DATA (f)->hand_cursor; 33785 cursor = FRAME_OUTPUT_DATA (f)->hand_cursor;
33786 goto set_cursor; 33786 goto set_cursor;
@@ -35916,9 +35916,9 @@ When nil, mouse-movement events will not be generated as long as the
35916mouse stays within the extent of a single glyph (except for images). */); 35916mouse stays within the extent of a single glyph (except for images). */);
35917 mouse_fine_grained_tracking = false; 35917 mouse_fine_grained_tracking = false;
35918 35918
35919 DEFVAR_BOOL ("tab-bar-drag-maybe", tab_bar_drag_maybe, 35919 DEFVAR_BOOL ("tab-bar--dragging-in-progress", tab_bar__dragging_in_progress,
35920 doc: /* Non-nil when maybe dragging tab bar item. */); 35920 doc: /* Non-nil when maybe dragging tab bar item. */);
35921 tab_bar_drag_maybe = false; 35921 tab_bar__dragging_in_progress = false;
35922 35922
35923 DEFVAR_BOOL ("redisplay-skip-initial-frame", redisplay_skip_initial_frame, 35923 DEFVAR_BOOL ("redisplay-skip-initial-frame", redisplay_skip_initial_frame,
35924 doc: /* Non-nil to skip redisplay in initial frame. 35924 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 da15401be05..8c7fc48848b 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'."
3159 (regexp-opt (directory-files tmp-name1)) 3159 (regexp-opt (directory-files tmp-name1))
3160 (length (directory-files tmp-name1))))))) 3160 (length (directory-files tmp-name1)))))))
3161 3161
3162 ;; Check error case. 3162 ;; Check error cases.
3163 (when (and (tramp--test-supports-file-modes-p)
3164 ;; With "sshfs", directories with zero file
3165 ;; modes are still "accessible".
3166 (not (tramp--test-sshfs-p))
3167 ;; A directory is always accessible for user "root".
3168 (not (zerop (tramp-compat-file-attribute-user-id
3169 (file-attributes tmp-name1)))))
3170 (set-file-modes tmp-name1 0)
3171 (with-temp-buffer
3172 (should-error
3173 (insert-directory tmp-name1 nil)
3174 :type 'file-error))
3175 (set-file-modes tmp-name1 #o777))
3163 (delete-directory tmp-name1 'recursive) 3176 (delete-directory tmp-name1 'recursive)
3164 (with-temp-buffer 3177 (with-temp-buffer
3165 (should-error 3178 (should-error
@@ -3372,9 +3385,22 @@ This tests also `access-file', `file-readable-p',
3372 (tramp-get-remote-gid tramp-test-vec 'integer))) 3385 (tramp-get-remote-gid tramp-test-vec 'integer)))
3373 (delete-file tmp-name1)) 3386 (delete-file tmp-name1))
3374 3387
3388 (when (and (tramp--test-supports-file-modes-p)
3389 ;; A file is always accessible for user "root".
3390 (not (zerop (tramp-compat-file-attribute-user-id
3391 (file-attributes
3392 tramp-test-temporary-file-directory)))))
3393 (write-region "foo" nil tmp-name1)
3394 (set-file-modes tmp-name1 0)
3395 (should-error
3396 (access-file tmp-name1 "error")
3397 :type 'file-error)
3398 (set-file-modes tmp-name1 #o777)
3399 (delete-file tmp-name1))
3375 (should-error 3400 (should-error
3376 (access-file tmp-name1 "error") 3401 (access-file tmp-name1 "error")
3377 :type tramp-file-missing) 3402 :type tramp-file-missing)
3403
3378 ;; `file-ownership-preserved-p' should return t for 3404 ;; `file-ownership-preserved-p' should return t for
3379 ;; non-existing files. 3405 ;; non-existing files.
3380 (when test-file-ownership-preserved-p 3406 (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 6bc4fefb28a..8a3669c4272 100644
--- a/test/lisp/progmodes/elisp-mode-tests.el
+++ b/test/lisp/progmodes/elisp-mode-tests.el
@@ -966,6 +966,17 @@ evaluation of BODY."
966 (should (equal (elisp--xref-infer-namespace p7) 'variable))) 966 (should (equal (elisp--xref-infer-namespace p7) 'variable)))
967 967
968 (elisp-mode-test--with-buffer 968 (elisp-mode-test--with-buffer
969 (concat "(let (({p1}alpha {p2}beta)\n"
970 " ({p3}gamma ({p4}delta {p5}epsilon)))\n"
971 " ({p6}zeta))\n")
972 (should (equal (elisp--xref-infer-namespace p1) 'variable))
973 (should (equal (elisp--xref-infer-namespace p2) 'variable))
974 (should (equal (elisp--xref-infer-namespace p3) 'variable))
975 (should (equal (elisp--xref-infer-namespace p4) 'function))
976 (should (equal (elisp--xref-infer-namespace p5) 'maybe-variable))
977 (should (equal (elisp--xref-infer-namespace p6) 'function)))
978
979 (elisp-mode-test--with-buffer
969 (concat "(defun {p1}alpha () {p2}beta)\n" 980 (concat "(defun {p1}alpha () {p2}beta)\n"
970 "(defface {p3}gamma ...)\n" 981 "(defface {p3}gamma ...)\n"
971 "(defvar {p4}delta {p5}epsilon)\n" 982 "(defvar {p4}delta {p5}epsilon)\n"