diff options
| author | Glenn Morris | 2021-10-19 07:50:35 -0700 |
|---|---|---|
| committer | Glenn Morris | 2021-10-19 07:50:35 -0700 |
| commit | 4d4b4017591c7fb4e37b7d1e0d6b2db565a56c66 (patch) | |
| tree | 132fc64cbb5da9e0f5d0600edfcf189dd86e783d | |
| parent | 41c262af322eab6c35a94d747dcaf776b0975f35 (diff) | |
| parent | d742cc3c204ba0adeb9600d236a0e454e35a42ff (diff) | |
| download | emacs-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/unicode | 8 | ||||
| -rwxr-xr-x | admin/unidata/blocks.awk | 26 | ||||
| -rw-r--r-- | admin/unidata/emoji-zwj.awk | 41 | ||||
| -rw-r--r-- | doc/emacs/windows.texi | 2 | ||||
| -rw-r--r-- | doc/lispintro/emacs-lisp-intro.texi | 2 | ||||
| -rw-r--r-- | doc/lispref/frames.texi | 6 | ||||
| -rw-r--r-- | doc/lispref/windows.texi | 9 | ||||
| -rw-r--r-- | doc/misc/tramp.texi | 15 | ||||
| -rw-r--r-- | etc/NEWS.28 | 29 | ||||
| -rw-r--r-- | lisp/composite.el | 9 | ||||
| -rw-r--r-- | lisp/net/tramp-adb.el | 65 | ||||
| -rw-r--r-- | lisp/net/tramp-gvfs.el | 30 | ||||
| -rw-r--r-- | lisp/net/tramp-sh.el | 4 | ||||
| -rw-r--r-- | lisp/net/tramp-sudoedit.el | 5 | ||||
| -rw-r--r-- | lisp/net/tramp.el | 44 | ||||
| -rw-r--r-- | lisp/progmodes/bug-reference.el | 8 | ||||
| -rw-r--r-- | lisp/progmodes/cc-engine.el | 1 | ||||
| -rw-r--r-- | lisp/progmodes/elisp-mode.el | 6 | ||||
| -rw-r--r-- | lisp/tab-bar.el | 8 | ||||
| -rw-r--r-- | src/composite.c | 11 | ||||
| -rw-r--r-- | src/font.c | 20 | ||||
| -rw-r--r-- | src/xdisp.c | 6 | ||||
| -rw-r--r-- | test/lisp/net/tramp-tests.el | 28 | ||||
| -rw-r--r-- | 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 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 | ||
| 117 | Visit "emoji-zwj-sequences.txt" and "emoji-sequences.txt" with the | 117 | Visit "emoji-zwj-sequences.txt" and "emoji-sequences.txt" with the |
| 118 | rebuilt Emacs, and check that the sample sequences are composed | 118 | rebuilt Emacs, and check that the sample sequences are composed |
| 119 | properly. Note that your emoji font might not have glyphs for the | 119 | properly. Also check the Unicode style chart file available at |
| 120 | newest codepoints yet. | 120 | https://unicode.org/emoji/charts/emoji-style.txt for any issues |
| 121 | involving VS-15 and VS-16, if so you may need to update the value | ||
| 122 | generated for auto-composition-emoji-eligible-codepoints by | ||
| 123 | admin/unidata/emoji-zwj.awk. Note that your emoji font might not have | ||
| 124 | glyphs for the newest codepoints yet. | ||
| 121 | 125 | ||
| 122 | Finally, etc/NEWS should be updated to announce the support for the | 126 | Finally, etc/NEWS should be updated to announce the support for the |
| 123 | new Unicode version. | 127 | new 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 | ||
| 223 | END { | 223 | END { |
| 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 | |||
| 1177 | example, the word for the South American sloth, the @samp{ai}, is | 1177 | example, the word for the South American sloth, the @samp{ai}, is |
| 1178 | completely different from the two words, @samp{a}, and @samp{i}. | 1178 | completely different from the two words, @samp{a}, and @samp{i}. |
| 1179 | 1179 | ||
| 1180 | There are many kinds of atom in nature but only a few in Lisp: for | 1180 | There are many kinds of atoms in nature but only a few in Lisp: for |
| 1181 | example, @dfn{numbers}, such as 37, 511, or 1729, and @dfn{symbols}, such | 1181 | example, @dfn{numbers}, such as 37, 511, or 1729, and @dfn{symbols}, such |
| 1182 | as @samp{+}, @samp{foo}, or @samp{forward-line}. The words we have | 1182 | as @samp{+}, @samp{foo}, or @samp{forward-line}. The words we have |
| 1183 | listed in the examples above are all symbols. In everyday Lisp | 1183 | listed 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 | |||
| 642 | accommodate an overlong tool bar. | 642 | accommodate an overlong tool bar. |
| 643 | 643 | ||
| 644 | @item Tab Bar | 644 | @item Tab Bar |
| 645 | @cindex internal tab bar | 645 | @cindex tab bar |
| 646 | The tab bar (@pxref{Tab Bars,,,emacs, The GNU Emacs Manual}) is always | 646 | The tab bar (@pxref{Tab Bars,,,emacs, The GNU Emacs Manual}) is always |
| 647 | drawn by Emacs itself. The tab bar appears above the tool bar in | 647 | drawn by Emacs itself. The tab bar appears above the tool bar in |
| 648 | Emacs built with an internal tool bar, and below the tool bar in | 648 | 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 | |||
| 1218 | unchanged if this option is @code{t} or a list containing | 1218 | unchanged if this option is @code{t} or a list containing |
| 1219 | @code{vertical-scroll-bars}. | 1219 | @code{vertical-scroll-bars}. |
| 1220 | 1220 | ||
| 1221 | The default value is @code{'(tab-bar-lines tool-bar-lines)} for Lucid, | 1221 | The default value is @code{(tab-bar-lines tool-bar-lines)} for Lucid, |
| 1222 | Motif and MS-Windows (which means that adding/removing a tool or tab | 1222 | Motif and MS-Windows (which means that adding/removing a tool or tab |
| 1223 | bar there does not change the outer frame height), | 1223 | bar 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 |
| 1226 | exception of @code{tab-bar-lines} may change the size of the outer | 1226 | exception of @code{tab-bar-lines} may change the size of the outer |
| 1227 | frame), and @code{t} otherwise (which means the outer frame size never | 1227 | 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 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 | ||
| 214 | Each window belongs to exactly one frame (@pxref{Frames}). For all | 214 | Each window belongs to exactly one frame (@pxref{Frames}). For all |
| 215 | windows belonging to a specific frame, we sometimes also say that these | 215 | windows belonging to a specific frame, we sometimes also say that these |
| 216 | windows are @dfn{owned} by that frame or simply that they are on that frame. | 216 | windows are @dfn{owned} by that frame or simply that they are on that |
| 217 | frame. | ||
| 217 | 218 | ||
| 218 | @defun window-frame &optional window | 219 | @defun window-frame &optional window |
| 219 | This function returns the specified @var{window}'s frame---the frame | 220 | This function returns the specified @var{window}'s frame---the frame |
| @@ -233,12 +234,6 @@ minibuffer window (@pxref{Minibuffer Windows}) in that list. If | |||
| 233 | active. If @var{minibuffer} is neither @code{nil} nor @code{t}, the | 234 | active. If @var{minibuffer} is neither @code{nil} nor @code{t}, the |
| 234 | minibuffer window is never included. | 235 | minibuffer window is never included. |
| 235 | 236 | ||
| 236 | Note that the window returned by @code{minibuffer-window} called with | ||
| 237 | the argument @var{frame} is returned by @code{window-list} called with | ||
| 238 | the 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 | ||
| 240 | not returned by this invocation. | ||
| 241 | |||
| 242 | The optional argument @var{window}, if non-@code{nil}, must be a live | 237 | The optional argument @var{window}, if non-@code{nil}, must be a live |
| 243 | window on the specified frame; then @var{window} will be the first | 238 | window on the specified frame; then @var{window} will be the first |
| 244 | element in the returned list. If @var{window} is omitted or @code{nil}, | 239 | 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 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 | ||
| 1072 | This non-native @value{tramp} method connects via the Server Message | 1072 | This non-native @value{tramp} method connects via the Server Message |
| 1073 | Block (SMB) networking protocol to hosts running file servers that are | 1073 | Block (SMB) networking protocol to hosts running file servers that are |
| 1074 | typically based on @url{https://www.samba.org/,,Samba} or MS Windows. | 1074 | typically based on @uref{https://www.samba.org/,,Samba} or MS Windows. |
| 1075 | 1075 | ||
| 1076 | Using @command{smbclient} requires a few tweaks when working with | 1076 | Using @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 |
| 1325 | The program @command{rclone} allows to access different system | 1325 | The program @command{rclone} allows to access different system |
| 1326 | storages in the cloud, see @url{https://rclone.org/} for a list of | 1326 | storages in the cloud, see @uref{https://rclone.org/} for a list of |
| 1327 | supported systems. If the @command{rclone} program isn't found in | 1327 | supported systems. If the @command{rclone} program isn't found in |
| 1328 | your @env{PATH} environment variable, you can tell @value{tramp} its | 1328 | your @env{PATH} environment variable, you can tell @value{tramp} its |
| 1329 | absolute path via the user option @code{tramp-rclone-program}. | 1329 | absolute path via the user option @code{tramp-rclone-program}. |
| @@ -1362,7 +1362,7 @@ for accessing the system storage, you should use it. | |||
| 1362 | On local hosts which have installed the @command{sshfs} client for | 1362 | On local hosts which have installed the @command{sshfs} client for |
| 1363 | mounting a file system based on @command{sftp}, this method can be | 1363 | mounting a file system based on @command{sftp}, this method can be |
| 1364 | used, see | 1364 | used, 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 |
| 1366 | the @command{sshfs} program isn't found in your @env{PATH} environment | 1366 | the @command{sshfs} program isn't found in your @env{PATH} environment |
| 1367 | variable, you can tell @value{tramp} its absolute path via the user | 1367 | variable, you can tell @value{tramp} its absolute path via the user |
| 1368 | option @code{tramp-sshfs-program}. | 1368 | option @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 |
| 5194 | versions. When you see such a message (the text might differ), you | 5194 | versions. When you see such a message (the text might differ), you |
| 5195 | don't use the Emacs built-in version of @value{tramp}. In case you | 5195 | don't use the Emacs built-in version of @value{tramp}, and you must |
| 5196 | have installed @value{tramp} from GNU ELPA, | 5196 | recompile 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 |
| 5201 | see the package README file for instructions how to recompile it. | 5201 | see @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'. |
| 2569 | Key sequences that invoke project-related commands start with the | 2569 | Key sequences that invoke project-related commands start with the |
| 2570 | prefix 'C-x p'. Type "C-x p C-h" to show the full list. | 2570 | prefix '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. |
| 3223 | You can type 'C-x u u' instead of 'C-x u C-x u' to undo many changes, | 3223 | Type '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, | 3225 | instead 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 | 3226 | resize the selected window interactively, 'M-g n n p p' to navigate |
| 3227 | transient mode and then is executed normally. 'repeat-exit-key' | 3227 | next-error matches. Any other key exits transient mode and then is |
| 3228 | defines an additional key to exit mode like 'isearch-exit' ('RET'). | 3228 | executed normally. 'repeat-exit-key' defines an additional key to |
| 3229 | The user option 'repeat-exit-timeout' specifies the number of | 3229 | exit mode like 'isearch-exit' ('RET'). The user option |
| 3230 | seconds of idle time to break the repetition chain automatically. | 3230 | 'repeat-exit-timeout' specifies the number of seconds of idle time to |
| 3231 | With 'repeat-keep-prefix' you can keep the prefix arg of the previous | 3231 | break the repetition chain automatically. With 'repeat-keep-prefix' |
| 3232 | command. For example, this can help to reverse the window navigation | 3232 | you can keep the prefix arg of the previous command. For example, |
| 3233 | direction with e.g. 'C-x o M-- o o'. Also it can help to set a new | 3233 | this can help to reverse the window navigation direction with |
| 3234 | step with e.g. 'C-x { C-5 { { {', which will set the window resizing | 3234 | e.g. 'C-x o M-- o o'. Also it can help to set a new step with |
| 3235 | step to 5 columns. | 3235 | e.g. 'C-x { C-5 { { {', which will set the window resizing step to 5 |
| 3236 | columns. | ||
| 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." |
| 520 | But 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. | ||
| 1146 | This 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 | |||
| 2087 | signal identifier to be raised, remaining arguments passed to | 2087 | signal 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 |
| 2089 | FMT-STRING and ARGUMENTS." | 2089 | FMT-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. |
| 77 | The first subexpression defines the region of the bug-reference | 77 | The first subexpression defines the region of the bug-reference |
| 78 | overlay, i.e., the region being fontified and made clickable in | 78 | overlay, 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." | |||
| 357 | This command should be bound to a drag event. It moves the tab | 357 | This command should be bound to a drag event. It moves the tab |
| 358 | at the mouse-down event to the position at mouse-up event." | 358 | at 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. | |||
| 2124 | See also the documentation of `auto-composition-mode'. */); | 2124 | See 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 | |||
| 2130 | These are codepoints which have Emoji_Presentation = No, and thus by | ||
| 2131 | default are not displayed as emoji. In certain circumstances, such as | ||
| 2132 | when followed by U+FE0F (VS-16) the emoji font should be used for | ||
| 2133 | them anyway. | ||
| 2134 | |||
| 2135 | This 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. */ | ||
| 3867 | static bool | ||
| 3868 | codepoint_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 | |||
| 35916 | mouse stays within the extent of a single glyph (except for images). */); | 35916 | mouse 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" |