Merge remote-tracking branch 'origin/master' into feature/android
This commit is contained in:
commit
a892c0487a
44 changed files with 918 additions and 264 deletions
430
ChangeLog.3
430
ChangeLog.3
|
@ -1,3 +1,431 @@
|
|||
2022-02-18 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
* Version 28.3 released.
|
||||
|
||||
2023-02-17 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Update HISTORY for Emacs 28.3
|
||||
|
||||
2023-02-17 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Bump Emacs version to 28.3
|
||||
|
||||
* README:
|
||||
* configure.ac:
|
||||
* msdos/sed2v2.inp:
|
||||
* nt/README.W32: Bump Emacs version to 28.3.
|
||||
|
||||
2023-02-17 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Update NEWS for Emacs 28.3
|
||||
|
||||
* etc/NEWS: Update for Emacs 28.3.
|
||||
|
||||
2023-02-17 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Update ChangeLog and AUTHORS for Emacs 28.3
|
||||
|
||||
* ChangeLog.3:
|
||||
* etc/AUTHORS: Update for Emacs 28.3.
|
||||
|
||||
2023-02-17 Xi Lu <lx@shellcodes.org>
|
||||
|
||||
Fix etags local command injection vulnerability
|
||||
|
||||
* lib-src/etags.c: (escape_shell_arg_string): New function.
|
||||
(process_file_name): Use it to quote file names passed to the
|
||||
shell. (Bug#59817)
|
||||
|
||||
(cherry picked from commit 01a4035c869b91c153af9a9132c87adb7669ea1c)
|
||||
|
||||
2023-02-17 Xi Lu <lx@shellcodes.org>
|
||||
|
||||
Fixed ctags local command execute vulnerability
|
||||
|
||||
* lib-src/etags.c:
|
||||
|
||||
(clean_matched_file_tag): New function
|
||||
(do_move_file): New function
|
||||
(readline_internal):
|
||||
Add `leave_cr` parameter, if true, include the \r character
|
||||
|
||||
* test/manual/etags/CTAGS.good_crlf: New file
|
||||
* test/manual/etags/CTAGS.good_update: New file
|
||||
* test/manual/etags/crlf: New file
|
||||
* test/manual/etags/Makefile: Add `ctags -u` test cases
|
||||
|
||||
(cherry picked from commit d48bb4874bc6cd3e69c7a15fc3c91cc141025c51)
|
||||
|
||||
2023-02-17 Xi Lu <lx@shellcodes.org>
|
||||
|
||||
Fix ruby-mode.el local command injection vulnerability (bug#60268)
|
||||
|
||||
* lisp/progmodes/ruby-mode.el
|
||||
(ruby-find-library-file): Fix local command injection vulnerability.
|
||||
|
||||
(cherry picked from commit 9a3b08061feea14d6f37685ca1ab8801758bfd1c)
|
||||
|
||||
2023-02-17 Xi Lu <lx@shellcodes.org>
|
||||
|
||||
Fix htmlfontify.el command injection vulnerability.
|
||||
|
||||
* lisp/htmlfontify.el (hfy-text-p): Fix command injection
|
||||
vulnerability. (Bug#60295)
|
||||
|
||||
(cherry picked from commit 1b4dc4691c1f87fc970fbe568b43869a15ad0d4c)
|
||||
|
||||
2022-12-19 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
Fix storing email into nnmail by Gnus
|
||||
|
||||
Backporting suggested by Florian Weimer, since this is
|
||||
a denial-of-service issue.
|
||||
* lisp/gnus/nnml.el (nnml--encode-headers): Wrap
|
||||
'rfc2047-encode-string' calls with 'ignore-errors', to avoid
|
||||
disrupting email workflows due to possibly-invalid headers.
|
||||
Reported by Florian Weimer <fweimer@redhat.com>.
|
||||
|
||||
(cherry picked from commit 23f7c9c2a92e4619b7c4d2286d4249f812cd695d)
|
||||
|
||||
2022-11-14 Robert Pluim <rpluim@gmail.com>
|
||||
|
||||
Explain how to bind keys to non-ASCII sequences
|
||||
|
||||
* doc/emacs/custom.texi (Init Rebinding): Explain how to use `kbd'
|
||||
when binding keys to non-ASCII sequences.
|
||||
|
||||
2022-11-12 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
Document that 'transient-mark-mode' is off in batch mode
|
||||
|
||||
* doc/emacs/mark.texi (Mark, Disabled Transient Mark): Document,
|
||||
belatedly, that 'transient-mark-mode' is turned on by default only
|
||||
in interactive sessions. (Bug#59201)
|
||||
|
||||
2022-10-14 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
Document how to control where the *.eln files are written
|
||||
|
||||
* doc/lispref/compile.texi (Native Compilation): Document the
|
||||
trick of pointing $HOME to a non-existent directory.
|
||||
(Native-Compilation Variables): Document the role of
|
||||
'native-comp-eln-load-path' in determining where *.eln files are
|
||||
written.
|
||||
|
||||
2022-10-14 Robert Pluim <rpluim@gmail.com>
|
||||
|
||||
Add cross-reference to alternative syntaxes for Unicode
|
||||
|
||||
These alternative syntaxes allow you to specify Unicode codepoints
|
||||
using only ASCII, which helps avoid decoding issues.
|
||||
|
||||
* doc/emacs/custom.texi (Init Non-ASCII): Add cross reference to
|
||||
"General Escape Syntax" in the Emacs Lisp Reference Manual.
|
||||
|
||||
2022-10-07 Lars Ingebrigtsen <larsi@gnus.org>
|
||||
|
||||
Update name of hs-mouse-toggle-hiding in Emacs manual
|
||||
|
||||
* doc/emacs/programs.texi (Hideshow): Update the name of
|
||||
hs-mouse-toggle-hiding (bug#58331).
|
||||
|
||||
2022-10-06 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Fix typo in `(emacs) Lisp Doc'
|
||||
|
||||
* doc/emacs/programs.texi (Lisp Doc): Fix reference to
|
||||
'eldoc-echo-area-display-truncation-message'. (Bug#58324)
|
||||
|
||||
2022-10-06 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Fix references to 'default-indent-new-line'
|
||||
|
||||
* doc/emacs/programs.texi (Comment Commands)
|
||||
(Multi-Line Comments): Fix references to
|
||||
'default-indent-new-line'. (Bug#58325)
|
||||
|
||||
2022-10-04 Andreas Schwab <schwab@linux-m68k.org>
|
||||
|
||||
* src/emacs.c (load_pdump): Propery handle case when executable
|
||||
wasn't found.
|
||||
|
||||
2022-10-04 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
Avoid assertion violations in STRING_CHAR
|
||||
|
||||
* src/xdisp.c (handle_composition_prop):
|
||||
* src/editfns.c (styled_format): Don't call 'STRING_CHAR' on
|
||||
unibyte strings. This avoids assertion violation in
|
||||
'string_char_and_length'.
|
||||
|
||||
(cherry picked from commit d52d6e1e106117eb4bba81a65e256e2e793037b6)
|
||||
|
||||
2022-10-03 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Fix documentation of 'TAB' in cc-mode
|
||||
|
||||
* doc/emacs/programs.texi (C Indent): Fix documentation of 'TAB'
|
||||
in cc-mode. (Bug#58258)
|
||||
|
||||
2022-10-03 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Fix 'org-export-dispatch' command name in manual
|
||||
|
||||
* doc/emacs/text.texi (Org Authoring): Fix 'org-export-dispatch'
|
||||
command name. (Bug#58260)
|
||||
|
||||
2022-10-02 Andreas Schwab <schwab@linux-m68k.org>
|
||||
|
||||
* src/emacs.c (load_pdump): Fix use of xpalloc.
|
||||
|
||||
2022-10-02 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
Avoid assertion violation in 'xpalloc'
|
||||
|
||||
* src/emacs.c (load_pdump): Ensure the 3rd argument of xpalloc is
|
||||
always positive. (Bug#58232)
|
||||
|
||||
2022-09-30 Michael Albinus <michael.albinus@gmx.de>
|
||||
|
||||
Fix connection property incompatibility in Tramp
|
||||
|
||||
* lisp/net/tramp.el (tramp-get-remote-tmpdir): Remove obsolete
|
||||
connection property "tmpdir". (Bug#57800)
|
||||
|
||||
2022-09-29 Lars Ingebrigtsen <larsi@gnus.org>
|
||||
|
||||
Update some Gnus documentation in the Emacs manual
|
||||
|
||||
* doc/emacs/misc.texi (Gnus Group Buffer, Gnus Summary Buffer):
|
||||
Update documentation (bug#58145).
|
||||
|
||||
2022-09-28 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
Clarify image file search
|
||||
|
||||
* doc/lispref/display.texi (Defining Images, Image Descriptors):
|
||||
* lisp/image.el (create-image): Clarify that non-absolute image
|
||||
files are searched along 'image-load-path'. (Bug#52931)
|
||||
|
||||
2022-09-28 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
.mailcap: Some additional fixes.
|
||||
|
||||
2022-09-28 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
Avoid assertion violations in 'pop_it'
|
||||
|
||||
* src/xdisp.c (pop_it): Avoid assertion violations when handling
|
||||
lists or vectors of display properties. (Bug#58122)
|
||||
|
||||
2022-09-28 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Add .mailmap for proper git log output
|
||||
|
||||
This file is used to fix a few misspelled names in various git
|
||||
listings (e.g., "git log"). This can be used to fix incorrect
|
||||
attribution, poor display, or names showing up more than once.
|
||||
It also allows updating an old email addresses to a new one.
|
||||
See "man git-shortlog" for more information on the format.
|
||||
|
||||
* .mailmap: New file.
|
||||
|
||||
2022-09-27 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
* doc/emacs/ack.texi (Acknowledgments): Update maintainers.
|
||||
|
||||
2022-09-24 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* lisp/progmodes/hideshow.el (hs-toggle-hiding): Fix `interactive` form
|
||||
|
||||
This fixes the first part of bug#52092, which is a regression
|
||||
introduced by commit d0e9113de97.
|
||||
|
||||
2022-09-23 YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
|
||||
|
||||
Fix shaping with bitmap-only fonts on HarfBuzz 5.2.0 (Bug#57976)
|
||||
|
||||
* src/ftcrfont.c (ftcrhbfont_begin_hb_font): Undo last change for
|
||||
HarfBuzz 5.2.0.
|
||||
|
||||
2022-09-20 Stefan Monnier <monnier@iro.umontreal.ca>
|
||||
|
||||
* lisp/text-modes/tex-mode.el (tex-mode): Fix AUCTeX regression
|
||||
|
||||
As discussed in
|
||||
https://lists.gnu.org/r/auctex/2022-08/msg00004.html
|
||||
AUCTeX installs its own advice to redefine `tex-mode`, and that
|
||||
advice used to take precedence before commit 6075a7c5ae3fa456cd.
|
||||
|
||||
2022-09-20 Robert Pluim <rpluim@gmail.com>
|
||||
|
||||
Add vc-annotate-switches to manual
|
||||
|
||||
* doc/emacs/maintaining.texi (Old Revisions): Add description of
|
||||
`vc-annotate-switches' and `vc-BACKEND-annotate-switches'.
|
||||
|
||||
2022-09-20 Robert Pluim <rpluim@gmail.com>
|
||||
|
||||
Remove mention of non-existent `annotate-switches'
|
||||
|
||||
* lisp/vc/vc.el (vc-annotate-switches): Remove mention of
|
||||
`annotate-switches'. As far as I can tell this has never existed in
|
||||
Emacs.
|
||||
|
||||
2022-09-20 Robert Pluim <rpluim@gmail.com>
|
||||
|
||||
Mention that src/macuvs.h sometimes needs committing
|
||||
|
||||
* admin/notes/unicode: src/macuvs.h is generated, but needs to be
|
||||
committed sometimes.
|
||||
|
||||
2022-09-19 Gerd Möllmann <gerd@gnu.org>
|
||||
|
||||
MacOS ld warning from native compilation (bug#57849)
|
||||
|
||||
* lisp/emacs-lisp/comp.el (native-comp-driver-options): Add "-Wl,-w"
|
||||
on Darwin systems.
|
||||
* etc/NEWS: Describe change.
|
||||
|
||||
2022-09-18 Michael Albinus <michael.albinus@gmx.de>
|
||||
|
||||
Fix Tramp error with eshell integration
|
||||
|
||||
* lisp/net/tramp-integration.el (tramp-eshell-directory-change):
|
||||
Respect local `default-directory'. (Bug#57556)
|
||||
|
||||
2022-09-17 Michael Albinus <michael.albinus@gmx.de>
|
||||
|
||||
Sync with Tramp 2.5.3.2. Don't merge with master
|
||||
|
||||
* doc/misc/tramp.texi (Android shell setup): Rework.
|
||||
(Frequently Asked Questions): Improve recommendations for speeding up.
|
||||
|
||||
* doc/misc/trampver.texi:
|
||||
* lisp/net/trampver.el: Change version to "2.5.4-pre".
|
||||
|
||||
* lisp/net/tramp-adb.el (tramp-methods): Use "%d".
|
||||
(tramp-adb-handle-directory-files-and-attributes): Fix "." and
|
||||
".." in listing.
|
||||
(tramp-adb-handle-file-attributes)
|
||||
(tramp-adb-handle-directory-files-and-attributes)
|
||||
(tramp-adb-handle-file-name-all-completions): Pipe "ls" output
|
||||
through "cat", in order to avoid quoting special characters.
|
||||
(tramp-adb-maybe-open-connection): Compute args from `tramp-login-args'.
|
||||
|
||||
* lisp/net/tramp-compat.el (tramp-compat-replace-regexp-in-region):
|
||||
New defalias.
|
||||
|
||||
* lisp/net/tramp-gvfs.el (tramp-gvfs-do-copy-or-rename-file):
|
||||
Adapt check for proper remote command.
|
||||
|
||||
* lisp/net/tramp.el (tramp-methods): Adapt docstring.
|
||||
(tramp-handle-make-process): Check for adb device if indicated.
|
||||
(tramp-get-remote-tmpdir): Cache result in temporary connection
|
||||
property.
|
||||
|
||||
* test/lisp/net/tramp-tests.el (tramp-test17-insert-directory)
|
||||
(tramp-test22-file-times, tramp--test-utf8): Adapt tests.
|
||||
(tramp--test-shell-file-name): Do not depend on `tramp--test-adb-p'.
|
||||
(tramp-test46-unload): Ignore autoload functions in
|
||||
`tramp-file-name' structure tests, since `tramp-file-name-handler'
|
||||
is also autoloaded in Emacs 29.
|
||||
|
||||
2022-09-17 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Simplify regexp in make-news-html-file
|
||||
|
||||
* admin/admin.el (make-news-html-file): Simplify regexp.
|
||||
Suggested by Mattias Engdegård <mattiase@acm.org>.
|
||||
|
||||
2022-09-16 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
* admin/admin.el (make-news-html-file): Set id on correct tag.
|
||||
|
||||
2022-09-16 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Add version headlines to HTML NEWS export
|
||||
|
||||
This allows linking to, e.g. "NEWS.28.html#28.1" to go directly to
|
||||
those release notes.
|
||||
* admin/admin.el (admin--org-export-headers-format)
|
||||
(make-news-html-file): Add XX.Y version headlines with an HTML anchor.
|
||||
|
||||
2022-09-16 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Improve HTML export of NEWS file
|
||||
|
||||
* admin/admin.el (admin--org-export-headers-format)
|
||||
(admin--org-html-postamble): New variables.
|
||||
(admin--require-external-package): New function.
|
||||
(make-news-html-file): Improve HTML export.
|
||||
|
||||
2022-09-16 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Delete "etc/NEWS*.html" from .gitignore
|
||||
|
||||
We actually do want to see it when preparing a release, so that we
|
||||
don't include it in a tarball by mistake.
|
||||
* .gitignore: Don't ignore "etc/NEWS*.html".
|
||||
|
||||
2022-09-16 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Recommend NonGNU ELPA over MELPA
|
||||
|
||||
* doc/misc/org.org (Using CDLaTeX to enter math, Footnotes): Recommend
|
||||
NonGNU ELPA over MELPA.
|
||||
|
||||
2022-09-16 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Minor doc fixes in picture.el
|
||||
|
||||
* lisp/textmodes/picture.el: Improve Commentary.
|
||||
(picture-forward-column, picture-backward-column)
|
||||
(picture-move-down, picture-move-up, picture-movement-nw)
|
||||
(picture-movement-ne, picture-movement-sw, picture-movement-se)
|
||||
(picture-set-motion, picture-clear-line, picture-newline)
|
||||
(picture-tab, picture-yank-rectangle)
|
||||
(picture-yank-rectangle-from-register, picture-insert-rectangle)
|
||||
(picture-draw-rectangle): Minor doc fixes.
|
||||
|
||||
2022-09-16 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
* lisp/textmodes/page-ext.el: Improve Commentary.
|
||||
|
||||
2022-09-14 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Automate exporting etc/NEWS to HTML
|
||||
|
||||
* admin/admin.el (make-news-html-file): New function.
|
||||
* .gitignore: Ignore generated "etc/NEWS*.html" file.
|
||||
|
||||
2022-09-14 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* Makefile.in (uninstall): Remove the *.eln files. (Bug#57771)
|
||||
|
||||
2022-09-12 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Update HISTORY for Emacs 28.2
|
||||
|
||||
* etc/HISTORY: Update for the Emacs 28.2 release.
|
||||
|
||||
2022-09-07 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Bump Emacs version to 28.2
|
||||
|
||||
* README:
|
||||
* configure.ac:
|
||||
* msdos/sed2v2.inp:
|
||||
* nt/README.W32: Bump Emacs version to 28.2.
|
||||
|
||||
2022-09-07 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
Update ChangeLog and AUTHORS for Emacs 28.2
|
||||
|
||||
* ChangeLog.3:
|
||||
* etc/AUTHORS:
|
||||
* etc/NEWS: Update for Emacs 28.2.
|
||||
|
||||
2022-09-06 Stefan Kangas <stefankangas@gmail.com>
|
||||
|
||||
* doc/misc/idlwave.texi (Troubleshooting): Don't say "Emacsen".
|
||||
|
@ -236920,7 +237348,7 @@
|
|||
|
||||
This file records repository revisions from
|
||||
commit 9d56a21e6a696ad19ac65c4b405aeca44785884a (exclusive) to
|
||||
commit ddabb03a0176beb4b7fc8d4f2267d459fd2ebded (inclusive).
|
||||
commit f7bd5ac55211ad0ae2e473f0dff46df1e60f99bf (inclusive).
|
||||
See ChangeLog.2 for earlier changes.
|
||||
|
||||
;; Local Variables:
|
||||
|
|
|
@ -1655,11 +1655,11 @@ become available.
|
|||
@findex image-dired-display-previous
|
||||
With point in the thumbnail buffer, you can type @key{RET}
|
||||
(@code{image-dired-display-this}) to display the image in another
|
||||
window. Use the arrow keys to move around in the thumbnail buffer.
|
||||
For easy browsing, use @key{SPC} (@code{image-dired-display-next}) to
|
||||
advance and display the next image. Typing @key{DEL}
|
||||
(@code{image-dired-display-previous}) backs up to the previous
|
||||
thumbnail and displays that instead.
|
||||
window. Use the standard Emacs movement key bindings or the arrow
|
||||
keys to move around in the thumbnail buffer. For easy browsing, use
|
||||
@key{SPC} (@code{image-dired-display-next}) to advance and display the
|
||||
next image. Typing @key{DEL} (@code{image-dired-display-previous})
|
||||
backs up to the previous thumbnail and displays that instead.
|
||||
|
||||
@vindex image-dired-external-viewer
|
||||
Type @kbd{C-@key{RET}}
|
||||
|
@ -1669,9 +1669,19 @@ in an external viewer. You must first configure
|
|||
|
||||
You can delete images through Image-Dired also. Type @kbd{d}
|
||||
(@code{image-dired-flag-thumb-original-file}) to flag the image file
|
||||
for deletion in the Dired buffer. You can also delete the thumbnail
|
||||
image from the thumbnail buffer with @kbd{C-d}
|
||||
(@code{image-dired-delete-char}).
|
||||
for deletion in the Dired buffer. Alternatively, you can remove an
|
||||
image's thumbnail from the thumbnail buffer without flagging the image
|
||||
for deletion, by typing @kbd{C-d} (@code{image-dired-delete-char}).
|
||||
|
||||
@findex image-dired-dired-toggle-marked-thumbs
|
||||
@findex image-dired-dired-display-external
|
||||
@findex image-dired-dired-display-image
|
||||
You could also use Image-Dired for ``inline'' operations (i.e.,
|
||||
right into the Dired buffer). Type @kbd{C-t C-t}, and the thumbnails
|
||||
of the selected images in Dired will appear in front of their names
|
||||
(@code{image-dired-dired-toggle-marked-thumbs}). @kbd{C-t i} and
|
||||
@kbd{C-t x} will display the image under the point in Emacs or with
|
||||
the external viewer, respectively.
|
||||
|
||||
More advanced features include @dfn{image tags}, which are metadata
|
||||
used to categorize image files. The tags are stored in a plain text
|
||||
|
@ -1684,14 +1694,18 @@ in the minibuffer. To mark files having a certain tag, type @kbd{C-t f}
|
|||
(@code{image-dired-mark-tagged-files}). After marking image files
|
||||
with a certain tag, you can use @kbd{C-t d} to view them.
|
||||
|
||||
@findex image-dired-dired-comment-files
|
||||
@findex image-dired-dired-edit-comment-and-tags
|
||||
You can also tag a file directly from the thumbnail buffer by typing
|
||||
@kbd{t t} and you can remove a tag by typing @kbd{t r}. There is also
|
||||
a special tag called ``comment'' for each file (it is not a tag in
|
||||
the exact same sense as the other tags, it is handled slightly
|
||||
differently). That is used to enter a comment or description about the
|
||||
image. You comment a file from the thumbnail buffer by typing
|
||||
@kbd{t t}, and you can remove a tag by typing @kbd{t r}. There is
|
||||
also a special tag called ``comment'' for each file (it is not a tag
|
||||
in the exact same sense as the other tags, it is handled slightly
|
||||
differently). That is used to enter a comment or description about
|
||||
the image. You comment a file from the thumbnail buffer by typing
|
||||
@kbd{c}. You will be prompted for a comment. Type @kbd{C-t c} to add
|
||||
a comment from Dired (@code{image-dired-dired-comment-files}).
|
||||
@kbd{C-t e} will bring a buffer to edit comment and tags
|
||||
(@code{image-dired-dired-edit-comment-and-tags}).
|
||||
|
||||
@vindex image-dired-thumb-visible-marks
|
||||
Files that are marked in Dired will also be marked in Image-Dired if
|
||||
|
|
|
@ -252,11 +252,8 @@ the original symbol. If the contents are another symbol, this
|
|||
process, called @dfn{symbol function indirection}, is repeated until
|
||||
it obtains a non-symbol. @xref{Function Names}, for more information
|
||||
about symbol function indirection.
|
||||
|
||||
One possible consequence of this process is an infinite loop, in the
|
||||
event that a symbol's function cell refers to the same symbol.
|
||||
Otherwise, we eventually obtain a non-symbol, which ought to be a
|
||||
function or other suitable object.
|
||||
We eventually obtain a non-symbol, which ought to be a function or
|
||||
other suitable object.
|
||||
|
||||
@kindex invalid-function
|
||||
More precisely, we should now have a Lisp function (a lambda
|
||||
|
@ -332,19 +329,17 @@ or just
|
|||
The built-in function @code{indirect-function} provides an easy way to
|
||||
perform symbol function indirection explicitly.
|
||||
|
||||
@defun indirect-function function &optional noerror
|
||||
@defun indirect-function function
|
||||
@anchor{Definition of indirect-function}
|
||||
This function returns the meaning of @var{function} as a function. If
|
||||
@var{function} is a symbol, then it finds @var{function}'s function
|
||||
definition and starts over with that value. If @var{function} is not a
|
||||
symbol, then it returns @var{function} itself.
|
||||
|
||||
This function returns @code{nil} if the final symbol is unbound. It
|
||||
signals a @code{cyclic-function-indirection} error if there is a loop
|
||||
in the chain of symbols.
|
||||
This function returns @code{nil} if the final symbol is unbound.
|
||||
|
||||
The optional argument @var{noerror} is obsolete, kept for backward
|
||||
compatibility, and has no effect.
|
||||
There is also a second, optional argument that is obsolete and has no
|
||||
effect.
|
||||
|
||||
Here is how you could define @code{indirect-function} in Lisp:
|
||||
|
||||
|
|
|
@ -737,9 +737,12 @@ explicitly in the source file being loaded. This is because
|
|||
By contrast, in programs that manipulate function definitions for other
|
||||
purposes, it is better to use @code{fset}, which does not keep such
|
||||
records. @xref{Function Cells}.
|
||||
|
||||
If the resulting function definition chain would be circular, then
|
||||
Emacs will signal a @code{cyclic-function-indirection} error.
|
||||
@end defun
|
||||
|
||||
@defun function-alias-p object &optional noerror
|
||||
@defun function-alias-p object
|
||||
Checks whether @var{object} is a function alias. If it is, it returns
|
||||
a list of symbols representing the function alias chain, else
|
||||
@code{nil}. For instance, if @code{a} is an alias for @code{b}, and
|
||||
|
@ -750,9 +753,8 @@ a list of symbols representing the function alias chain, else
|
|||
@result{} (b c)
|
||||
@end example
|
||||
|
||||
If there's a loop in the definitions, an error will be signaled. If
|
||||
@var{noerror} is non-@code{nil}, the non-looping parts of the chain is
|
||||
returned instead.
|
||||
There is also a second, optional argument that is obsolete and has no
|
||||
effect.
|
||||
@end defun
|
||||
|
||||
You cannot create a new primitive function with @code{defun} or
|
||||
|
@ -1539,6 +1541,9 @@ is not a function, e.g., a keyboard macro (@pxref{Keyboard Macros}):
|
|||
If you wish to use @code{fset} to make an alternate name for a
|
||||
function, consider using @code{defalias} instead. @xref{Definition of
|
||||
defalias}.
|
||||
|
||||
If the resulting function definition chain would be circular, then
|
||||
Emacs will signal a @code{cyclic-function-indirection} error.
|
||||
@end defun
|
||||
|
||||
@node Closures
|
||||
|
|
|
@ -5111,8 +5111,11 @@ This anchor is a function that is called with 3 arguments: @var{node},
|
|||
@var{parent}, and @var{bol}. It tries to go to the beginning of the
|
||||
previous non-empty line, and matches @code{adaptive-fill-regexp}. If
|
||||
there is a match, this function returns the end of the match,
|
||||
otherwise it returns nil. This anchor is useful for a
|
||||
@code{indent-relative}-like indent behavior for block comments.
|
||||
otherwise it returns nil. However, if the current line begins with a
|
||||
prefix (e.g., ``-''), return the beginning of the prefix of the
|
||||
previous line instead, so that the two prefixes aligns. This anchor
|
||||
is useful for a @code{indent-relative}-like indent behavior for block
|
||||
comments.
|
||||
|
||||
@end ftable
|
||||
@end defvar
|
||||
|
|
|
@ -1214,7 +1214,7 @@ Suffix specifications have this form:
|
|||
|
||||
@lisp
|
||||
([@var{LEVEL}]
|
||||
[@var{KEY}] [@var{DESCRIPTION}]
|
||||
[@var{KEY} [@var{DESCRIPTION}]]
|
||||
@var{COMMAND}|@var{ARGUMENT} [@var{KEYWORD} @var{VALUE}]...)
|
||||
@end lisp
|
||||
|
||||
|
@ -1253,8 +1253,7 @@ Any command will do; it does not need to have an object associated
|
|||
with it (as would be the case if @code{transient-define-suffix} or
|
||||
@code{transient-define-infix} were used to define it).
|
||||
|
||||
Anonymous, dynamically defined suffix commands are also supported.
|
||||
See information about the @code{:setup-children} function in @ref{Group Specifications}.
|
||||
COMMAND can also be a @code{lambda} expression.
|
||||
|
||||
As mentioned above, the object that is associated with a command can
|
||||
be used to set the default for certain values that otherwise have to
|
||||
|
|
24
etc/AUTHORS
24
etc/AUTHORS
|
@ -325,9 +325,9 @@ Andreas Politz: changed filenotify.el inotify.c buffer-tests.el
|
|||
Andreas Rottmann: changed emacsclient.1 emacsclient.c misc.texi server.el
|
||||
|
||||
Andreas Schwab: changed configure.ac lisp.h xdisp.c process.c alloc.c
|
||||
coding.c Makefile.in files.el fileio.c keyboard.c lread.c xterm.c fns.c
|
||||
src/Makefile.in editfns.c emacs.c print.c eval.c font.c xfns.c sysdep.c
|
||||
and 656 other files
|
||||
coding.c Makefile.in files.el fileio.c keyboard.c emacs.c lread.c
|
||||
xterm.c fns.c src/Makefile.in editfns.c print.c eval.c font.c xfns.c
|
||||
sysdep.c and 656 other files
|
||||
|
||||
Andreas Seltenreich: changed nnweb.el gnus.texi message.el gnus-sum.el
|
||||
gnus.el nnslashdot.el gnus-srvr.el gnus-util.el mm-url.el mm-uu.el
|
||||
|
@ -1575,7 +1575,7 @@ and co-wrote help-tests.el
|
|||
and changed xdisp.c display.texi w32.c msdos.c w32fns.c simple.el
|
||||
files.el fileio.c emacs.c keyboard.c w32term.c text.texi dispnew.c
|
||||
w32proc.c files.texi frames.texi configure.ac lisp.h dispextern.h
|
||||
process.c ms-w32.h and 1236 other files
|
||||
process.c editfns.c and 1237 other files
|
||||
|
||||
Eliza Velasquez: changed server.el
|
||||
|
||||
|
@ -1984,7 +1984,7 @@ Gerd Möllmann: wrote authors.el ebrowse.el jit-lock.el tooltip.el
|
|||
and changed xdisp.c xterm.c dispnew.c dispextern.h xfns.c xfaces.c
|
||||
window.c keyboard.c lisp.h faces.el alloc.c buffer.c startup.el xterm.h
|
||||
fns.c simple.el term.c configure.ac frame.c xmenu.c emacs.c
|
||||
and 609 other files
|
||||
and 610 other files
|
||||
|
||||
Gergely Nagy: changed erc.el
|
||||
|
||||
|
@ -4787,8 +4787,8 @@ Robert P. Goldman: changed org.texi ob-exp.el org.el ox-latex.el
|
|||
Robert Pluim: wrote nsm-tests.el
|
||||
and changed configure.ac process.c blocks.awk network-stream-tests.el
|
||||
font.c processes.texi ftfont.c gtkutil.c vc-git.el process-tests.el
|
||||
emoji-zwj.awk gnutls.el network-stream.el nsm.el tramp.texi mml-sec.el
|
||||
nsterm.m unicode xfns.c auth.texi composite.c and 139 other files
|
||||
custom.texi emoji-zwj.awk gnutls.el network-stream.el nsm.el tramp.texi
|
||||
unicode mml-sec.el nsterm.m xfns.c auth.texi and 140 other files
|
||||
|
||||
Robert Thorpe: changed cus-start.el indent.el rmail.texi
|
||||
|
||||
|
@ -5182,7 +5182,7 @@ and co-wrote help-tests.el keymap-tests.el
|
|||
and changed efaq.texi checkdoc.el package.el cperl-mode.el bookmark.el
|
||||
help.el keymap.c subr.el simple.el erc.el ediff-util.el idlwave.el
|
||||
time.el bytecomp-tests.el comp.el emacs-lisp-intro.texi speedbar.el
|
||||
bytecomp.el edebug.el flyspell.el ibuffer.el and 1348 other files
|
||||
bytecomp.el edebug.el flyspell.el ibuffer.el and 1352 other files
|
||||
|
||||
Stefan Merten: co-wrote rst.el
|
||||
|
||||
|
@ -5937,7 +5937,7 @@ W. Trevor King: changed xterm.el
|
|||
|
||||
Xavier Maillard: changed gnus-faq.texi gnus-score.el mh-utils.el spam.el
|
||||
|
||||
Xi Lu: changed etags.c tramp-sh.el
|
||||
Xi Lu: changed etags.c htmlfontify.el ruby-mode.el tramp-sh.el
|
||||
|
||||
Xu Chunyang: changed eww.el dom.el gud.el netrc.el
|
||||
|
||||
|
@ -5953,8 +5953,8 @@ Yair F: changed hebrew.el
|
|||
|
||||
Yamamoto Mitsuharu: wrote uvs.el
|
||||
and changed macterm.c macfns.c mac-win.el xterm.c mac.c macterm.h image.c
|
||||
macmenu.c macgui.h xdisp.c ftfont.c xfns.c keyboard.c macselect.c
|
||||
ftcrfont.c macfont.m configure.ac w32term.c dispextern.h
|
||||
macmenu.c macgui.h xdisp.c ftfont.c xfns.c ftcrfont.c keyboard.c
|
||||
macselect.c macfont.m configure.ac w32term.c dispextern.h
|
||||
src/Makefile.in unexmacosx.c and 111 other files
|
||||
|
||||
Yan Gajdos: changed vc-git.el
|
||||
|
@ -6005,7 +6005,7 @@ Yuchen Pei: changed calendar.texi diary-lib.el icalendar-tests.el
|
|||
|
||||
Yue Daian: wrote cl-font-lock.el
|
||||
|
||||
Yuga Ego: changed emacs-lisp-intro.texi
|
||||
Yuga Ego: changed custom.texi emacs-lisp-intro.texi
|
||||
|
||||
Yu-ji Hosokawa: changed README.W32
|
||||
|
||||
|
|
|
@ -228,6 +228,8 @@ GNU Emacs 28.1 (2022-04-04) emacs-28.1
|
|||
|
||||
GNU Emacs 28.2 (2022-09-12) emacs-28.2
|
||||
|
||||
GNU Emacs 28.3 (2023-02-17) emacs-28.3
|
||||
|
||||
|
||||
----------------------------------------------------------------------
|
||||
This file is part of GNU Emacs.
|
||||
|
|
15
etc/NEWS
15
etc/NEWS
|
@ -358,6 +358,21 @@ This function is like 'user-uid', but is aware of file name handlers,
|
|||
so it will return the remote UID for remote files (or -1 if the
|
||||
connection has no associated user).
|
||||
|
||||
+++
|
||||
** 'fset' and 'defalias' now signal an error for circular alias chains.
|
||||
Previously, 'fset' and 'defalias' could be made to build circular
|
||||
function indirection chains as in
|
||||
|
||||
(defalias 'able 'baker)
|
||||
(defalias 'baker 'able)
|
||||
|
||||
but trying to call them would often make Emacs hang. Now, an attempt
|
||||
to create such a loop results in an error.
|
||||
|
||||
Since circular alias chains now cannot occur, 'function-alias-p' and
|
||||
'indirect-function' will never signal an error. Their second
|
||||
'noerror' arguments have no effect and are therefore obsolete.
|
||||
|
||||
|
||||
* Changes in Emacs 30.1 on Non-Free Operating Systems
|
||||
|
||||
|
|
|
@ -3416,7 +3416,7 @@ lambda-expression."
|
|||
(let* ((fn (car form))
|
||||
(handler (get fn 'byte-compile))
|
||||
(interactive-only
|
||||
(or (get fn 'interactive-only)
|
||||
(or (function-get fn 'interactive-only)
|
||||
(memq fn byte-compile-interactive-only-functions))))
|
||||
(when (memq fn '(set symbol-value run-hooks ;; add-to-list
|
||||
add-hook remove-hook run-hook-with-args
|
||||
|
|
|
@ -3813,8 +3813,8 @@ Return the trampoline if found or nil otherwise."
|
|||
;; found.
|
||||
finally (cl-return
|
||||
(expand-file-name
|
||||
(make-temp-file-internal (file-name-sans-extension rel-filename)
|
||||
0 ".eln" nil)
|
||||
(make-temp-file (file-name-sans-extension rel-filename) 0 ".eln"
|
||||
nil)
|
||||
temporary-file-directory))))
|
||||
|
||||
(defun comp-trampoline-compile (subr-name)
|
||||
|
|
|
@ -769,7 +769,7 @@ the C sources, too."
|
|||
(and (symbolp function)
|
||||
(not (eq (car-safe (symbol-function function)) 'macro))
|
||||
(let* ((interactive-only
|
||||
(or (get function 'interactive-only)
|
||||
(or (function-get function 'interactive-only)
|
||||
(if (boundp 'byte-compile-interactive-only-functions)
|
||||
(memq function
|
||||
byte-compile-interactive-only-functions)))))
|
||||
|
@ -996,7 +996,7 @@ Returns a list of the form (REAL-FUNCTION DEF ALIASED REAL-DEF)."
|
|||
(symbol-name function)))))))
|
||||
(real-def (cond
|
||||
((and aliased (not (subrp def)))
|
||||
(car (function-alias-p real-function t)))
|
||||
(car (function-alias-p real-function)))
|
||||
((subrp def) (intern (subr-name def)))
|
||||
(t def))))
|
||||
|
||||
|
|
|
@ -167,28 +167,27 @@ to use the Thumbnail Managing Standard; they will be saved in
|
|||
There are three ways that Image-Dired can store and generate
|
||||
thumbnails:
|
||||
|
||||
1. According to the \"Thumbnail Managing Standard\", which allows
|
||||
1. According to the Thumbnail Managing Standard, which allows
|
||||
sharing of thumbnails across different programs. Thumbnails
|
||||
will be stored in \"$XDG_CACHE_HOME/thumbnails/\"
|
||||
|
||||
To use this way, set this user option to one of the following values:
|
||||
Set this user option to one of the following symbols:
|
||||
|
||||
- `standard' means use thumbnails sized 128x128.
|
||||
- `standard-large' means use thumbnails sized 256x256.
|
||||
- `standard-x-large' means use thumbnails sized 512x512.
|
||||
- `standard-xx-large' means use thumbnails sized 1024x1024.
|
||||
|
||||
2. In the Image-Dired specific directory indicated by
|
||||
2. In the Image-Dired specific directory, as indicated by
|
||||
`image-dired-dir'.
|
||||
|
||||
To use this way, set this user option to `image-dired' (or
|
||||
to `use-image-dired-dir', which means the same thing for
|
||||
backward-compatibility reasons).
|
||||
Set this user option to `image-dired' (`use-image-dired-dir'
|
||||
also works, for backward-compatibility reasons).
|
||||
|
||||
3. In a subdirectory \".image-dired\" in the same directory
|
||||
where the image files are.
|
||||
as the image files.
|
||||
|
||||
To use this way, set this user option to `per-directory'.
|
||||
Set this user option to `per-directory'.
|
||||
|
||||
To control the default size of thumbnails for alternatives (2)
|
||||
and (3) above, customize the value of `image-dired-thumb-size'.
|
||||
|
|
|
@ -243,8 +243,8 @@ value of the last statement in BODY, as elisp."
|
|||
(`output
|
||||
(setq results
|
||||
(if matlabp
|
||||
(cdr (reverse (delq "" (mapcar #'org-strip-quotes
|
||||
(mapcar #'org-trim raw)))))
|
||||
(cdr (reverse (delete "" (mapcar #'org-strip-quotes
|
||||
(mapcar #'org-trim raw)))))
|
||||
(cdr (member org-babel-octave-eoe-output
|
||||
(reverse (mapcar #'org-strip-quotes
|
||||
(mapcar #'org-trim raw)))))))
|
||||
|
|
|
@ -7330,7 +7330,7 @@ Any match of REMOVE-RE will be removed from TXT."
|
|||
(let ((s (org-format-outline-path (org-get-outline-path)
|
||||
(1- (frame-width))
|
||||
nil org-agenda-breadcrumbs-separator)))
|
||||
(if (eq "" s) "" (concat s org-agenda-breadcrumbs-separator))))))
|
||||
(if (equal "" s) "" (concat s org-agenda-breadcrumbs-separator))))))
|
||||
(setq time (cond (s2 (concat
|
||||
(org-agenda-time-of-day-to-ampm-maybe s1)
|
||||
"-" (org-agenda-time-of-day-to-ampm-maybe s2)
|
||||
|
|
|
@ -648,6 +648,9 @@ With a numeric prefix, show all headlines up to that level."
|
|||
(org-fold-show-hidden-entry)
|
||||
(org-fold-show-children))
|
||||
("content"
|
||||
;; Newline before heading will be outside the
|
||||
;; narrowing. Make sure that it is revealed.
|
||||
(org-fold-heading nil)
|
||||
(save-excursion
|
||||
(save-restriction
|
||||
(org-narrow-to-subtree)
|
||||
|
|
|
@ -7562,15 +7562,15 @@ the cache."
|
|||
;; beginning.
|
||||
(next-element-re (pcase granularity
|
||||
((or `headline
|
||||
(guard (eq '(headline)
|
||||
restrict-elements)))
|
||||
(guard (equal '(headline)
|
||||
restrict-elements)))
|
||||
(cons
|
||||
(org-with-limited-levels
|
||||
org-element-headline-re)
|
||||
'match-beg))
|
||||
(`headline+inlinetask
|
||||
(cons
|
||||
(if (eq '(inlinetask) restrict-elements)
|
||||
(if (equal '(inlinetask) restrict-elements)
|
||||
(org-inlinetask-outline-regexp)
|
||||
org-element-headline-re)
|
||||
'match-beg))
|
||||
|
|
|
@ -11,7 +11,7 @@ Inserted by installing Org mode or when a release is made."
|
|||
(defun org-git-version ()
|
||||
"The Git version of Org mode.
|
||||
Inserted by installing Org or when a release is made."
|
||||
(let ((org-git-version "release_9.6.1-31-gaf1bb1"))
|
||||
(let ((org-git-version "release_9.6.1-34-geea8da"))
|
||||
org-git-version))
|
||||
|
||||
(provide 'org-version)
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
(require 'cl-lib)
|
||||
(require 'ox)
|
||||
|
||||
(eval-when-compile (require 'subr-x))
|
||||
|
||||
(defvar orgtbl-exp-regexp)
|
||||
(defvar org-texinfo-supports-math--cache)
|
||||
|
||||
|
@ -2025,12 +2027,14 @@ Once computed, the results remain cached."
|
|||
(unless (boundp 'org-texinfo-supports-math--cache)
|
||||
(setq org-texinfo-supports-math--cache
|
||||
(let ((math-example "1 + 1 = 2"))
|
||||
(let* ((input-file
|
||||
(make-temp-file "test" nil ".info"))
|
||||
(input-content
|
||||
(concat (format "@setfilename %s" input-file) "\n"
|
||||
"@node Top" "\n"
|
||||
(format "@displaymath{%s}" math-example) "\n")))
|
||||
(let* ((input-file (make-temp-file "test" nil ".info"))
|
||||
(input-content (string-join
|
||||
(list (format "@setfilename %s" input-file)
|
||||
"@node Top"
|
||||
"@displaymath"
|
||||
math-example
|
||||
"@end displaymath")
|
||||
"\n")))
|
||||
(with-temp-file input-file
|
||||
(insert input-content))
|
||||
(let* ((output-file (org-texinfo-compile input-file))
|
||||
|
|
|
@ -87,6 +87,25 @@
|
|||
:safe 'integerp
|
||||
:group 'c)
|
||||
|
||||
(defun c-ts-mode-toggle-comment-style ()
|
||||
"Toggle the comment style between block and line comments.
|
||||
Optional numeric ARG, if supplied, switches to block comment
|
||||
style when positive, to line comment style when negative, and
|
||||
just toggles it when zero or left out."
|
||||
(interactive)
|
||||
(pcase-let ((`(,starter . ,ender)
|
||||
(if (string= comment-start "// ")
|
||||
(cons "/* " " */")
|
||||
(cons "// " ""))))
|
||||
(setq-local comment-start starter
|
||||
comment-end ender))
|
||||
(c-ts-mode-set-modeline))
|
||||
|
||||
(defun c-ts-mode-set-modeline ()
|
||||
(setq mode-name
|
||||
(concat (if (eq major-mode 'c-ts-mode) "C" "C++") comment-start))
|
||||
(force-mode-line-update))
|
||||
|
||||
(defun c-ts-mode--indent-style-setter (sym val)
|
||||
"Custom setter for `c-ts-mode-set-style'.
|
||||
|
||||
|
@ -214,6 +233,25 @@ delimiters < and >'s."
|
|||
|
||||
;;; Indent
|
||||
|
||||
(defun c-ts-mode--preproc-offset (_n _p &rest _)
|
||||
"This anchor is used for preprocessor directives.
|
||||
|
||||
Because node is nil at the moment of indentation, we use
|
||||
`treesit-node-on' to capture the anonymous node covering the
|
||||
newline. If the grand-parent of that node is the
|
||||
translation_unit itself, we don't indent. Otherwise, just indent
|
||||
one step according to the great-grand-parent indent level. The
|
||||
reason there is a difference between grand-parent and
|
||||
great-grand-parent here is that the node containing the newline
|
||||
is actually the parent of point at the moment of indentation."
|
||||
(when-let ((node (treesit-node-on (point) (point))))
|
||||
(if (string-equal "translation_unit"
|
||||
(treesit-node-type
|
||||
(treesit-node-parent
|
||||
(treesit-node-parent node))))
|
||||
0
|
||||
c-ts-mode-indent-offset)))
|
||||
|
||||
(defun c-ts-mode--indent-styles (mode)
|
||||
"Indent rules supported by `c-ts-mode'.
|
||||
MODE is either `c' or `cpp'."
|
||||
|
@ -246,13 +284,14 @@ MODE is either `c' or `cpp'."
|
|||
((match nil "do_statement" "body") parent-bol c-ts-mode-indent-offset)
|
||||
((match nil "for_statement" "body") parent-bol c-ts-mode-indent-offset)
|
||||
|
||||
((match "preproc_ifdef" "compound_statement") point-min 0)
|
||||
((match "#endif" "preproc_ifdef") point-min 0)
|
||||
((match "preproc_if" "compound_statement") point-min 0)
|
||||
((match "#endif" "preproc_if") point-min 0)
|
||||
((match "preproc_function_def" "compound_statement") point-min 0)
|
||||
((node-is "preproc") point-min 0)
|
||||
((node-is "#endif") point-min 0)
|
||||
((match "preproc_call" "compound_statement") point-min 0)
|
||||
|
||||
((n-p-gp nil "preproc" "translation_unit") point-min 0)
|
||||
((n-p-gp nil "\n" "preproc") great-grand-parent c-ts-mode--preproc-offset)
|
||||
((parent-is "preproc") grand-parent c-ts-mode-indent-offset)
|
||||
|
||||
((parent-is "function_definition") parent-bol 0)
|
||||
((parent-is "conditional_expression") first-sibling 0)
|
||||
((parent-is "assignment_expression") parent-bol c-ts-mode-indent-offset)
|
||||
|
@ -740,7 +779,8 @@ the semicolon. This function skips the semicolon."
|
|||
:parent prog-mode-map
|
||||
"C-c C-q" #'c-ts-mode-indent-defun
|
||||
"C-c ." #'c-ts-mode-set-style
|
||||
"C-c C-c" #'comment-region)
|
||||
"C-c C-c" #'comment-region
|
||||
"C-c C-k" #'c-ts-mode-toggle-comment-style)
|
||||
|
||||
;;;###autoload
|
||||
(define-derived-mode c-ts-base-mode prog-mode "C"
|
||||
|
@ -805,7 +845,8 @@ the semicolon. This function skips the semicolon."
|
|||
`((block . ,(rx (or "compound_statement"
|
||||
"field_declaration_list"
|
||||
"enumerator_list"
|
||||
"initializer_list")))
|
||||
"initializer_list"
|
||||
"declaration_list")))
|
||||
(if . "if_statement")
|
||||
(else . ("if_statement" . "alternative"))
|
||||
(do . "do_statement")
|
||||
|
@ -855,6 +896,7 @@ To use tree-sitter C/C++ modes by default, evaluate
|
|||
|
||||
in your configuration."
|
||||
:group 'c
|
||||
:after-hook (c-ts-mode-set-modeline)
|
||||
|
||||
(when (treesit-ready-p 'c)
|
||||
(treesit-parser-create 'c)
|
||||
|
@ -887,6 +929,7 @@ To use tree-sitter C/C++ modes by default, evaluate
|
|||
|
||||
in your configuration."
|
||||
:group 'c++
|
||||
:after-hook (c-ts-mode-set-modeline)
|
||||
|
||||
(when (treesit-ready-p 'cpp)
|
||||
(setq-local treesit-text-type-regexp
|
||||
|
|
|
@ -2105,7 +2105,7 @@ casts and declarations are fontified. Used on level 2 and higher."
|
|||
;; prevent a repeat invocation. See elisp/lispref page "Search-based
|
||||
;; Fontification".
|
||||
(while (and (< (point) limit)
|
||||
(re-search-forward
|
||||
(re-search-forward
|
||||
"\\<\\(module\\|export\\|import\\)\\>\\(?:[^_$]\\|$\\)"
|
||||
limit t))
|
||||
(goto-char (match-end 1))
|
||||
|
|
|
@ -3975,7 +3975,7 @@ is in effect when this is matched (see `c-identifier-syntax-table')."
|
|||
;; "throw" in `c-type-modifier-kwds' is followed
|
||||
;; by a parenthesis list, but no extra measures
|
||||
;; are necessary to handle that.
|
||||
(regexp-opt
|
||||
(regexp-opt
|
||||
(append (c-lang-const c-fun-name-substitute-kwds)
|
||||
(c-lang-const c-type-modifier-kwds))
|
||||
t)
|
||||
|
|
|
@ -474,28 +474,37 @@ compilation and evaluation time conflicts."
|
|||
(and (eq (char-before) ?\])
|
||||
(not (eq (char-after) ?\;))))))
|
||||
`((annotation-top-cont ,(c-point 'iopl))))
|
||||
|
||||
((and
|
||||
;; Heuristics to find object initializers
|
||||
(save-excursion
|
||||
;; Next non-whitespace character should be '{'
|
||||
(goto-char (c-point 'boi))
|
||||
(eq (char-after) ?{))
|
||||
(save-excursion
|
||||
;; 'new' should be part of the line
|
||||
(goto-char (c-point 'iopl))
|
||||
(looking-at ".*new.*"))
|
||||
(unless (eq (char-after) ?{)
|
||||
(backward-up-list 1 t t))
|
||||
(save-excursion
|
||||
;; 'new' should be part of the line
|
||||
(goto-char (c-point 'iopl))
|
||||
(looking-at ".*new.*")))
|
||||
;; Line should not already be terminated
|
||||
(save-excursion
|
||||
(goto-char (c-point 'eopl))
|
||||
(or (not (eq (char-before) ?\;))
|
||||
(not (eq (char-before) ?\{)))))
|
||||
(if (save-excursion
|
||||
;; if we have a hanging brace on line before
|
||||
(goto-char (c-point 'eopl))
|
||||
(eq (char-before) ?\{))
|
||||
`((brace-list-intro ,(c-point 'iopl)))
|
||||
`((block-open) (statement ,(c-point 'iopl)))))
|
||||
(cond
|
||||
((save-excursion
|
||||
;; if we have a hanging brace on line before
|
||||
(goto-char (c-point 'eopl))
|
||||
(eq (char-before) ?\{))
|
||||
`((brace-list-intro ,(c-point 'iopl))))
|
||||
((save-excursion
|
||||
;; if we have a hanging brace on line before
|
||||
(goto-char (c-point 'boi))
|
||||
(and (eq (char-after) ?\})
|
||||
`((brace-list-close ,(save-excursion
|
||||
(backward-up-list 1 t t)
|
||||
(point)))))))
|
||||
(t
|
||||
`((block-open) (statement ,(c-point 'iopl))))))
|
||||
(t
|
||||
(apply orig-fun args))))
|
||||
|
||||
|
|
|
@ -1760,11 +1760,6 @@ Use `eglot-managed-p' to determine if current buffer is managed.")
|
|||
(add-hook 'change-major-mode-hook #'eglot--managed-mode-off nil t)
|
||||
(add-hook 'post-self-insert-hook 'eglot--post-self-insert-hook nil t)
|
||||
(add-hook 'pre-command-hook 'eglot--pre-command-hook nil t)
|
||||
(eglot--setq-saving eldoc-documentation-functions
|
||||
'(eglot-signature-eldoc-function
|
||||
eglot-hover-eldoc-function))
|
||||
(eglot--setq-saving eldoc-documentation-strategy
|
||||
#'eldoc-documentation-enthusiast)
|
||||
(eglot--setq-saving xref-prompt-for-identifier nil)
|
||||
(eglot--setq-saving flymake-diagnostic-functions '(eglot-flymake-backend))
|
||||
(eglot--setq-saving company-backends '(company-capf))
|
||||
|
@ -1773,7 +1768,12 @@ Use `eglot-managed-p' to determine if current buffer is managed.")
|
|||
(add-function :before-until (local 'imenu-create-index-function)
|
||||
#'eglot-imenu))
|
||||
(unless (eglot--stay-out-of-p 'flymake) (flymake-mode 1))
|
||||
(unless (eglot--stay-out-of-p 'eldoc) (eldoc-mode 1))
|
||||
(unless (eglot--stay-out-of-p 'eldoc)
|
||||
(add-hook 'eldoc-documentation-functions #'eglot-hover-eldoc-function
|
||||
nil t)
|
||||
(add-hook 'eldoc-documentation-functions #'eglot-signature-eldoc-function
|
||||
nil t)
|
||||
(eldoc-mode 1))
|
||||
(cl-pushnew (current-buffer) (eglot--managed-buffers (eglot-current-server))))
|
||||
(t
|
||||
(remove-hook 'after-change-functions 'eglot--after-change t)
|
||||
|
@ -2782,10 +2782,9 @@ for which LSP on-type-formatting should be requested."
|
|||
(cl-sort completions
|
||||
#'string-lessp
|
||||
:key (lambda (c)
|
||||
(or (plist-get
|
||||
(get-text-property 0 'eglot--lsp-item c)
|
||||
:sortText)
|
||||
"")))))
|
||||
(plist-get
|
||||
(get-text-property 0 'eglot--lsp-item c)
|
||||
:sortText)))))
|
||||
(metadata `(metadata (category . eglot)
|
||||
(display-sort-function . ,sort-completions)))
|
||||
resp items (cached-proxies :none)
|
||||
|
|
|
@ -3458,12 +3458,14 @@ This function is intended for use in `after-change-functions'."
|
|||
((match "<" "jsx_fragment") parent 0)
|
||||
((parent-is "jsx_fragment") parent js-indent-level)
|
||||
((node-is "jsx_closing_element") parent 0)
|
||||
((node-is "jsx_element") parent js-indent-level)
|
||||
((match "jsx_element" "statement") parent js-indent-level)
|
||||
((parent-is "jsx_element") parent js-indent-level)
|
||||
((parent-is "jsx_text") parent-bol js-indent-level)
|
||||
((parent-is "jsx_opening_element") parent js-indent-level)
|
||||
((parent-is "jsx_expression") parent-bol js-indent-level)
|
||||
((match "/" "jsx_self_closing_element") parent 0)
|
||||
((parent-is "jsx_self_closing_element") parent js-indent-level)
|
||||
;; FIXME(Theo): This no-node catch-all should be removed. When is it needed?
|
||||
(no-node parent-bol 0)))))
|
||||
|
||||
(defvar js--treesit-keywords
|
||||
|
@ -3873,7 +3875,7 @@ See `treesit-sexp-type-regexp' for more information.")
|
|||
|
||||
;; Electric-indent.
|
||||
(setq-local electric-indent-chars
|
||||
(append "{}():;," electric-indent-chars)) ;FIXME: js2-mode adds "[]*".
|
||||
(append "{}():;,<>/" electric-indent-chars)) ;FIXME: js2-mode adds "[]*".
|
||||
(setq-local electric-layout-rules
|
||||
'((?\; . after) (?\{ . after) (?\} . before)))
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
(declare-function treesit-node-child "treesit.c")
|
||||
(declare-function treesit-node-child-by-field-name "treesit.c")
|
||||
(declare-function treesit-node-start "treesit.c")
|
||||
(declare-function treesit-node-end "treesit.c")
|
||||
(declare-function treesit-node-type "treesit.c")
|
||||
(declare-function treesit-node-parent "treesit.c")
|
||||
(declare-function treesit-query-compile "treesit.c")
|
||||
|
@ -209,50 +210,15 @@
|
|||
`((scoped_use_list path: (identifier) @font-lock-constant-face)
|
||||
(scoped_use_list path: (scoped_identifier
|
||||
name: (identifier) @font-lock-constant-face))
|
||||
|
||||
((use_as_clause alias: (identifier) @font-lock-type-face)
|
||||
(:match "^[A-Z]" @font-lock-type-face))
|
||||
((use_as_clause path: (identifier) @font-lock-type-face)
|
||||
(:match "^[A-Z]" @font-lock-type-face))
|
||||
((use_as_clause path:
|
||||
(scoped_identifier path: (_)
|
||||
name: (identifier) @font-lock-type-face))
|
||||
(:match "^[A-Z]" @font-lock-type-face))
|
||||
(use_as_clause path: (scoped_identifier name: (identifier) @default))
|
||||
|
||||
((use_declaration
|
||||
argument: (scoped_identifier
|
||||
path: (_) @font-lock-constant-face
|
||||
name: (identifier) @font-lock-type-face))
|
||||
(:match "^[A-Z]" @font-lock-type-face))
|
||||
(use_declaration
|
||||
argument: (scoped_identifier
|
||||
name: (identifier) @default))
|
||||
|
||||
(use_declaration
|
||||
argument: (scoped_identifier
|
||||
path: (scoped_identifier
|
||||
path: (_) @font-lock-constant-face
|
||||
name: (identifier) @font-lock-constant-face)
|
||||
name: (identifier) @default))
|
||||
|
||||
(use_declaration
|
||||
argument: (scoped_use_list
|
||||
path: (scoped_identifier
|
||||
path: (_) @font-lock-constant-face
|
||||
name: (identifier) @font-lock-constant-face)))
|
||||
|
||||
((use_list (identifier) @font-lock-type-face)
|
||||
(:match "^[A-Z]" @font-lock-type-face))
|
||||
(use_list (identifier) @default)
|
||||
((use_list (scoped_identifier path: (_)
|
||||
name: (identifier) @font-lock-type-face))
|
||||
(:match "^[A-Z]" @font-lock-type-face))
|
||||
(use_list (scoped_identifier path: (_)
|
||||
name: (identifier) @default))
|
||||
(use_wildcard (scoped_identifier
|
||||
name: (identifier) @font-lock-constant-face))
|
||||
|
||||
(use_wildcard [(identifier) @rust-ts-mode--fontify-scope
|
||||
(scoped_identifier
|
||||
name: (identifier) @rust-ts-mode--fontify-scope)])
|
||||
(enum_variant name: (identifier) @font-lock-type-face)
|
||||
(match_arm
|
||||
pattern: (match_pattern (_ type: (identifier) @font-lock-type-face)))
|
||||
|
@ -263,31 +229,13 @@
|
|||
(mod_item name: (identifier) @font-lock-constant-face)
|
||||
(primitive_type) @font-lock-type-face
|
||||
(type_identifier) @font-lock-type-face
|
||||
((scoped_identifier name: (identifier) @font-lock-type-face)
|
||||
(:match "^[A-Z]" @font-lock-type-face))
|
||||
((scoped_identifier path: (identifier) @font-lock-type-face)
|
||||
(:match "^[A-Z]" @font-lock-type-face))
|
||||
((scoped_identifier
|
||||
path: [(identifier) @font-lock-type-face
|
||||
(scoped_identifier
|
||||
name: (identifier) @font-lock-type-face)])
|
||||
(:match "^[A-Z]" @font-lock-type-face))
|
||||
((scoped_identifier name: (identifier) @rust-ts-mode--fontify-tail))
|
||||
((scoped_identifier path: (identifier) @font-lock-type-face)
|
||||
(:match
|
||||
"^\\(u8\\|u16\\|u32\\|u64\\|u128\\|usize\\|i8\\|i16\\|i32\\|i64\\|i128\\|isize\\|char\\|str\\)$"
|
||||
@font-lock-type-face))
|
||||
(scoped_identifier path: (_) @font-lock-constant-face
|
||||
name: (identifier) @font-lock-type-face)
|
||||
(scoped_identifier path: (scoped_identifier
|
||||
name: (identifier) @font-lock-constant-face))
|
||||
(scoped_type_identifier path: (_) @font-lock-constant-face)
|
||||
(scoped_type_identifier
|
||||
path: (scoped_identifier
|
||||
path: (_) @font-lock-constant-face
|
||||
name: (identifier) @font-lock-constant-face))
|
||||
(type_identifier) @font-lock-type-face
|
||||
;; Ensure function calls aren't highlighted as types.
|
||||
(call_expression function: (scoped_identifier name: (identifier) @default)))
|
||||
((scoped_identifier path: (identifier) @rust-ts-mode--fontify-scope))
|
||||
(type_identifier) @font-lock-type-face)
|
||||
|
||||
:language 'rust
|
||||
:feature 'property
|
||||
|
@ -303,9 +251,25 @@
|
|||
|
||||
:language 'rust
|
||||
:feature 'variable
|
||||
'((identifier) @font-lock-variable-name-face
|
||||
;; Everything in a token_tree is an identifier.
|
||||
(token_tree (identifier) @default))
|
||||
'((arguments (identifier) @font-lock-variable-name-face)
|
||||
(array_expression (identifier) @font-lock-variable-name-face)
|
||||
(assignment_expression right: (identifier) @font-lock-variable-name-face)
|
||||
(binary_expression left: (identifier) @font-lock-variable-name-face)
|
||||
(binary_expression right: (identifier) @font-lock-variable-name-face)
|
||||
(block (identifier) @font-lock-variable-name-face)
|
||||
(compound_assignment_expr right: (identifier) @font-lock-variable-name-face)
|
||||
(field_expression value: (identifier) @font-lock-variable-name-face)
|
||||
(field_initializer value: (identifier) @font-lock-variable-name-face)
|
||||
(if_expression condition: (identifier) @font-lock-variable-name-face)
|
||||
(let_condition value: (identifier) @font-lock-variable-name-face)
|
||||
(let_declaration value: (identifier) @font-lock-variable-name-face)
|
||||
(match_arm value: (identifier) @font-lock-variable-name-face)
|
||||
(match_expression value: (identifier) @font-lock-variable-name-face)
|
||||
(reference_expression value: (identifier) @font-lock-variable-name-face)
|
||||
(return_expression (identifier) @font-lock-variable-name-face)
|
||||
(tuple_expression (identifier) @font-lock-variable-name-face)
|
||||
(unary_expression (identifier) @font-lock-variable-name-face)
|
||||
(while_expression condition: (identifier) @font-lock-variable-name-face))
|
||||
|
||||
:language 'rust
|
||||
:feature 'escape-sequence
|
||||
|
@ -318,6 +282,28 @@
|
|||
'((ERROR) @font-lock-warning-face))
|
||||
"Tree-sitter font-lock settings for `rust-ts-mode'.")
|
||||
|
||||
(defun rust-ts-mode--fontify-scope (node override start end &optional tail-p)
|
||||
(let* ((case-fold-search nil)
|
||||
(face
|
||||
(cond
|
||||
((string-match-p "^[A-Z]" (treesit-node-text node))
|
||||
'font-lock-type-face)
|
||||
((and
|
||||
tail-p
|
||||
(string-match-p
|
||||
"\\`\\(?:use_list\\|call_expression\\|use_as_clause\\|use_declaration\\)\\'"
|
||||
(treesit-node-type (treesit-node-parent (treesit-node-parent node)))))
|
||||
nil)
|
||||
(t 'font-lock-constant-face))))
|
||||
(when face
|
||||
(treesit-fontify-with-override
|
||||
(treesit-node-start node) (treesit-node-end node)
|
||||
face
|
||||
override start end))))
|
||||
|
||||
(defun rust-ts-mode--fontify-tail (node override start end)
|
||||
(rust-ts-mode--fontify-scope node override start end t))
|
||||
|
||||
(defalias 'rust-ts-mode--fontify-pattern
|
||||
(and
|
||||
(treesit-available-p)
|
||||
|
|
|
@ -81,6 +81,8 @@ Argument LANGUAGE is either `typescript' or `tsx'."
|
|||
((parent-is "member_expression") parent-bol typescript-ts-mode-indent-offset)
|
||||
((parent-is "named_imports") parent-bol typescript-ts-mode-indent-offset)
|
||||
((parent-is "statement_block") parent-bol typescript-ts-mode-indent-offset)
|
||||
((parent-is "switch_case") parent-bol typescript-ts-mode-indent-offset)
|
||||
((parent-is "switch_default") parent-bol typescript-ts-mode-indent-offset)
|
||||
((parent-is "type_arguments") parent-bol typescript-ts-mode-indent-offset)
|
||||
((parent-is "variable_declarator") parent-bol typescript-ts-mode-indent-offset)
|
||||
((parent-is "arguments") parent-bol typescript-ts-mode-indent-offset)
|
||||
|
@ -101,12 +103,14 @@ Argument LANGUAGE is either `typescript' or `tsx'."
|
|||
`(((match "<" "jsx_fragment") parent 0)
|
||||
((parent-is "jsx_fragment") parent typescript-ts-mode-indent-offset)
|
||||
((node-is "jsx_closing_element") parent 0)
|
||||
((node-is "jsx_element") parent typescript-ts-mode-indent-offset)
|
||||
((match "jsx_element" "statement") parent typescript-ts-mode-indent-offset)
|
||||
((parent-is "jsx_element") parent typescript-ts-mode-indent-offset)
|
||||
((parent-is "jsx_text") parent-bol typescript-ts-mode-indent-offset)
|
||||
((parent-is "jsx_opening_element") parent typescript-ts-mode-indent-offset)
|
||||
((parent-is "jsx_expression") parent-bol typescript-ts-mode-indent-offset)
|
||||
((match "/" "jsx_self_closing_element") parent 0)
|
||||
((parent-is "jsx_self_closing_element") parent typescript-ts-mode-indent-offset)))
|
||||
;; FIXME(Theo): This no-node catch-all should be removed. When is it needed?
|
||||
(no-node parent-bol 0))))
|
||||
|
||||
(defvar typescript-ts-mode--keywords
|
||||
|
@ -377,8 +381,9 @@ See `treesit-sexp-type-regexp' for more information.")
|
|||
|
||||
;; Electric
|
||||
(setq-local electric-indent-chars
|
||||
(append "{}():;," electric-indent-chars))
|
||||
|
||||
(append "{}():;,<>/" electric-indent-chars))
|
||||
(setq-local electric-layout-rules
|
||||
'((?\; . after) (?\{ . after) (?\} . before)))
|
||||
;; Navigation.
|
||||
(setq-local treesit-defun-type-regexp
|
||||
(regexp-opt '("class_declaration"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
;;; xref.el --- Cross-referencing commands -*-lexical-binding:t-*-
|
||||
|
||||
;; Copyright (C) 2014-2023 Free Software Foundation, Inc.
|
||||
;; Version: 1.6.1
|
||||
;; Version: 1.6.2
|
||||
;; Package-Requires: ((emacs "26.1"))
|
||||
|
||||
;; This is a GNU ELPA :core package. Avoid functionality that is not
|
||||
|
|
|
@ -9918,7 +9918,12 @@ minibuffer, but don't quit the completions window."
|
|||
(with-current-buffer buffer
|
||||
(choose-completion-string
|
||||
choice buffer
|
||||
(or (and completion-use-base-affixes base-affixes)
|
||||
;; Don't allow affixes to replace the whole buffer when not
|
||||
;; in the minibuffer. Thus check for `completion-in-region-mode'
|
||||
;; to ignore non-nil value of `completion-use-base-affixes' set by
|
||||
;; `minibuffer-choose-completion'.
|
||||
(or (and (not completion-in-region-mode)
|
||||
completion-use-base-affixes base-affixes)
|
||||
base-position
|
||||
;; If all else fails, just guess.
|
||||
(list (choose-completion-guess-base-position choice)))
|
||||
|
|
30
lisp/subr.el
30
lisp/subr.el
|
@ -7029,27 +7029,17 @@ string will be displayed only if BODY takes longer than TIMEOUT seconds.
|
|||
(lambda ()
|
||||
,@body)))
|
||||
|
||||
(defun function-alias-p (func &optional noerror)
|
||||
(defun function-alias-p (func &optional _noerror)
|
||||
"Return nil if FUNC is not a function alias.
|
||||
If FUNC is a function alias, return the function alias chain.
|
||||
|
||||
If the function alias chain contains loops, an error will be
|
||||
signaled. If NOERROR, the non-loop parts of the chain is returned."
|
||||
(declare (side-effect-free t))
|
||||
(let ((chain nil)
|
||||
(orig-func func))
|
||||
(nreverse
|
||||
(catch 'loop
|
||||
(while (and (symbolp func)
|
||||
(setq func (symbol-function func))
|
||||
(symbolp func))
|
||||
(when (or (memq func chain)
|
||||
(eq func orig-func))
|
||||
(if noerror
|
||||
(throw 'loop chain)
|
||||
(signal 'cyclic-function-indirection (list orig-func))))
|
||||
(push func chain))
|
||||
chain))))
|
||||
If FUNC is a function alias, return the function alias chain."
|
||||
(declare (advertised-calling-convention (func) "30.1")
|
||||
(side-effect-free error-free))
|
||||
(let ((chain nil))
|
||||
(while (and (symbolp func)
|
||||
(setq func (symbol-function func))
|
||||
(symbolp func))
|
||||
(push func chain))
|
||||
(nreverse chain)))
|
||||
|
||||
(defun readablep (object)
|
||||
"Say whether OBJECT has a readable syntax.
|
||||
|
|
|
@ -1048,26 +1048,30 @@ example, sets a variable, use `transient-define-infix' instead.
|
|||
(setq args (plist-put args :key pop)))
|
||||
(cond
|
||||
((or (stringp car)
|
||||
(eq (car-safe car) 'lambda))
|
||||
(and (eq (car-safe car) 'lambda)
|
||||
(not (commandp car))))
|
||||
(setq args (plist-put args :description pop)))
|
||||
((and (symbolp car)
|
||||
(not (keywordp car))
|
||||
(not (commandp car))
|
||||
(commandp (cadr spec)))
|
||||
(setq args (plist-put args :description (macroexp-quote pop)))))
|
||||
(cond
|
||||
((keywordp car)
|
||||
(error "Need command, got %S" car))
|
||||
(error "Need command, got `%s'" car))
|
||||
((symbolp car)
|
||||
(setq args (plist-put args :command (macroexp-quote pop))))
|
||||
((and (commandp car)
|
||||
(not (stringp car)))
|
||||
(let ((cmd pop)
|
||||
(sym (intern (format "transient:%s:%s"
|
||||
prefix
|
||||
(or (plist-get args :description)
|
||||
(plist-get args :key))))))
|
||||
(defalias sym cmd)
|
||||
(setq args (plist-put args :command (macroexp-quote sym)))))
|
||||
(sym (intern
|
||||
(format "transient:%s:%s"
|
||||
prefix
|
||||
(let ((desc (plist-get args :description)))
|
||||
(if (and desc (or (stringp desc) (symbolp desc)))
|
||||
desc
|
||||
(plist-get args :key)))))))
|
||||
(setq args (plist-put args :command `(defalias ',sym ,cmd)))))
|
||||
((or (stringp car)
|
||||
(and car (listp car)))
|
||||
(let ((arg pop))
|
||||
|
|
|
@ -1186,12 +1186,18 @@ See `treesit-simple-indent-presets'.")
|
|||
(skip-syntax-backward "-")
|
||||
(point))))
|
||||
(cons 'prev-adaptive-prefix
|
||||
(lambda (_n parent &rest _)
|
||||
(let ((comment-start-bol
|
||||
(save-excursion
|
||||
(goto-char (treesit-node-start parent))
|
||||
(line-beginning-position))))
|
||||
(lambda (_n parent bol &rest _)
|
||||
(let (comment-start-bol
|
||||
this-line-has-prefix)
|
||||
(save-excursion
|
||||
(goto-char (treesit-node-start parent))
|
||||
(setq comment-start-bol (line-beginning-position))
|
||||
|
||||
(goto-char bol)
|
||||
(setq this-line-has-prefix
|
||||
(and (looking-at adaptive-fill-regexp)
|
||||
(match-string 1)))
|
||||
|
||||
(forward-line -1)
|
||||
(and (>= (point) comment-start-bol)
|
||||
adaptive-fill-regexp
|
||||
|
@ -1199,7 +1205,14 @@ See `treesit-simple-indent-presets'.")
|
|||
;; If previous line is an empty line, don't
|
||||
;; indent.
|
||||
(not (looking-at (rx (* whitespace) eol)))
|
||||
(match-end 0))))))
|
||||
;; Return the anchor. If the indenting line
|
||||
;; has a prefix and the previous line also
|
||||
;; has a prefix, indent to the beginning of
|
||||
;; prev line's prefix rather than the end of
|
||||
;; prev line's prefix. (Bug#61314).
|
||||
(or (and this-line-has-prefix
|
||||
(match-beginning 1))
|
||||
(match-end 0)))))))
|
||||
;; TODO: Document.
|
||||
(cons 'grand-parent
|
||||
(lambda (_n parent &rest _)
|
||||
|
@ -1336,8 +1349,11 @@ prev-adaptive-prefix
|
|||
|
||||
Goes to the beginning of previous non-empty line, and tries
|
||||
to match `adaptive-fill-regexp'. If it matches, return the
|
||||
end of the match, otherwise return nil. This is useful for a
|
||||
`indent-relative'-like indent behavior for block comments.")
|
||||
end of the match, otherwise return nil. However, if the
|
||||
current line begins with a prefix, return the beginning of
|
||||
the prefix of the previous line instead, so that the two
|
||||
prefixes aligns. This is useful for a `indent-relative'-like
|
||||
indent behavior for block comments.")
|
||||
|
||||
(defun treesit--simple-indent-eval (exp)
|
||||
"Evaluate EXP.
|
||||
|
|
|
@ -514,6 +514,10 @@ load_gccjit_if_necessary (bool mandatory)
|
|||
#define CALL2I(fun, arg1, arg2) \
|
||||
CALLN (Ffuncall, intern_c_string (STR (fun)), arg1, arg2)
|
||||
|
||||
/* Like call4 but stringify and intern. */
|
||||
#define CALL4I(fun, arg1, arg2, arg3, arg4) \
|
||||
CALLN (Ffuncall, intern_c_string (STR (fun)), arg1, arg2, arg3, arg4)
|
||||
|
||||
#define DECL_BLOCK(name, func) \
|
||||
gcc_jit_block *(name) = \
|
||||
gcc_jit_function_new_block ((func), STR (name))
|
||||
|
@ -4991,8 +4995,8 @@ DEFUN ("comp--compile-ctxt-to-file", Fcomp__compile_ctxt_to_file,
|
|||
format_string ("%s_libgccjit_repro.c", SSDATA (ebase_name)));
|
||||
|
||||
Lisp_Object tmp_file =
|
||||
Fmake_temp_file_internal (base_name, make_fixnum (0),
|
||||
build_string (".eln.tmp"), Qnil);
|
||||
CALL4I (make-temp-file, base_name, Qnil, build_string (".eln.tmp"), Qnil);
|
||||
|
||||
Lisp_Object encoded_tmp_file = ENCODE_FILE (tmp_file);
|
||||
#ifdef WINDOWSNT
|
||||
encoded_tmp_file = ansi_encode_filename (encoded_tmp_file);
|
||||
|
|
63
src/data.c
63
src/data.c
|
@ -840,7 +840,9 @@ the position will be taken. */)
|
|||
}
|
||||
|
||||
DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
|
||||
doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */)
|
||||
doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION.
|
||||
If the resulting chain of function definitions would contain a loop,
|
||||
signal a `cyclic-function-indirection' error. */)
|
||||
(register Lisp_Object symbol, Lisp_Object definition)
|
||||
{
|
||||
CHECK_SYMBOL (symbol);
|
||||
|
@ -852,6 +854,12 @@ DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
|
|||
|
||||
eassert (valid_lisp_object_p (definition));
|
||||
|
||||
/* Ensure non-circularity. */
|
||||
for (Lisp_Object s = definition; SYMBOLP (s) && !NILP (s);
|
||||
s = XSYMBOL (s)->u.s.function)
|
||||
if (EQ (s, symbol))
|
||||
xsignal1 (Qcyclic_function_indirection, symbol);
|
||||
|
||||
#ifdef HAVE_NATIVE_COMP
|
||||
register Lisp_Object function = XSYMBOL (symbol)->u.s.function;
|
||||
|
||||
|
@ -1078,7 +1086,7 @@ If CMD is not a command, the return value is nil.
|
|||
Value, if non-nil, is a list (interactive SPEC). */)
|
||||
(Lisp_Object cmd)
|
||||
{
|
||||
Lisp_Object fun = indirect_function (cmd); /* Check cycles. */
|
||||
Lisp_Object fun = indirect_function (cmd);
|
||||
bool genfun = false;
|
||||
|
||||
if (NILP (fun))
|
||||
|
@ -1168,7 +1176,7 @@ If COMMAND is not a command, the return value is nil.
|
|||
The value, if non-nil, is a list of mode name symbols. */)
|
||||
(Lisp_Object command)
|
||||
{
|
||||
Lisp_Object fun = indirect_function (command); /* Check cycles. */
|
||||
Lisp_Object fun = indirect_function (command);
|
||||
|
||||
if (NILP (fun))
|
||||
return Qnil;
|
||||
|
@ -2482,55 +2490,22 @@ If the current binding is global (the default), the value is nil. */)
|
|||
|
||||
/* If OBJECT is a symbol, find the end of its function chain and
|
||||
return the value found there. If OBJECT is not a symbol, just
|
||||
return it. If there is a cycle in the function chain, signal a
|
||||
cyclic-function-indirection error.
|
||||
|
||||
This is like Findirect_function, except that it doesn't signal an
|
||||
error if the chain ends up unbound. */
|
||||
return it. */
|
||||
Lisp_Object
|
||||
indirect_function (register Lisp_Object object)
|
||||
indirect_function (Lisp_Object object)
|
||||
{
|
||||
Lisp_Object tortoise, hare;
|
||||
|
||||
hare = tortoise = object;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (!SYMBOLP (hare) || NILP (hare))
|
||||
break;
|
||||
hare = XSYMBOL (hare)->u.s.function;
|
||||
if (!SYMBOLP (hare) || NILP (hare))
|
||||
break;
|
||||
hare = XSYMBOL (hare)->u.s.function;
|
||||
|
||||
tortoise = XSYMBOL (tortoise)->u.s.function;
|
||||
|
||||
if (EQ (hare, tortoise))
|
||||
xsignal1 (Qcyclic_function_indirection, object);
|
||||
}
|
||||
|
||||
return hare;
|
||||
while (SYMBOLP (object) && !NILP (object))
|
||||
object = XSYMBOL (object)->u.s.function;
|
||||
return object;
|
||||
}
|
||||
|
||||
DEFUN ("indirect-function", Findirect_function, Sindirect_function, 1, 2, 0,
|
||||
doc: /* Return the function at the end of OBJECT's function chain.
|
||||
If OBJECT is not a symbol, just return it. Otherwise, follow all
|
||||
function indirections to find the final function binding and return it.
|
||||
Signal a cyclic-function-indirection error if there is a loop in the
|
||||
function chain of symbols. */)
|
||||
(register Lisp_Object object, Lisp_Object noerror)
|
||||
function indirections to find the final function binding and return it. */)
|
||||
(Lisp_Object object, Lisp_Object noerror)
|
||||
{
|
||||
Lisp_Object result;
|
||||
|
||||
/* Optimize for no indirection. */
|
||||
result = object;
|
||||
if (SYMBOLP (result) && !NILP (result)
|
||||
&& (result = XSYMBOL (result)->u.s.function, SYMBOLP (result)))
|
||||
result = indirect_function (result);
|
||||
if (!NILP (result))
|
||||
return result;
|
||||
|
||||
return Qnil;
|
||||
return indirect_function (object);
|
||||
}
|
||||
|
||||
/* Extract and set vector and string elements. */
|
||||
|
|
|
@ -2116,7 +2116,7 @@ then strings and vectors are not accepted. */)
|
|||
|
||||
fun = function;
|
||||
|
||||
fun = indirect_function (fun); /* Check cycles. */
|
||||
fun = indirect_function (fun);
|
||||
if (NILP (fun))
|
||||
return Qnil;
|
||||
|
||||
|
|
|
@ -3653,6 +3653,7 @@ mutually_exclusive_p (struct re_pattern_buffer *bufp, re_char *p1,
|
|||
re_opcode_t op2;
|
||||
bool multibyte = RE_MULTIBYTE_P (bufp);
|
||||
unsigned char *pend = bufp->buffer + bufp->used;
|
||||
re_char *p2_orig = p2;
|
||||
|
||||
eassert (p1 >= bufp->buffer && p1 < pend
|
||||
&& p2 >= bufp->buffer && p2 <= pend);
|
||||
|
@ -3822,6 +3823,23 @@ mutually_exclusive_p (struct re_pattern_buffer *bufp, re_char *p1,
|
|||
case notcategoryspec:
|
||||
return ((re_opcode_t) *p1 == categoryspec && p1[1] == p2[1]);
|
||||
|
||||
case on_failure_jump_nastyloop:
|
||||
case on_failure_jump_smart:
|
||||
case on_failure_jump_loop:
|
||||
case on_failure_keep_string_jump:
|
||||
case on_failure_jump:
|
||||
{
|
||||
int mcnt;
|
||||
p2++;
|
||||
EXTRACT_NUMBER_AND_INCR (mcnt, p2);
|
||||
/* Don't just test `mcnt > 0` because non-greedy loops have
|
||||
their test at the end with an unconditional jump at the start. */
|
||||
if (p2 + mcnt > p2_orig) /* Ensure forward progress. */
|
||||
return (mutually_exclusive_p (bufp, p1, p2)
|
||||
&& mutually_exclusive_p (bufp, p1, p2 + mcnt));
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
;
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
(advice-add 'sm-test1 :around (lambda (f y) (* (funcall f y) 2)))
|
||||
(advice-remove 'sm-test1 (lambda (f y) (* (funcall f y) 5)))
|
||||
(defun sm-test1 (x) (+ x 4))
|
||||
(declare-function sm-test1 nil)
|
||||
(should (equal (sm-test1 6) 20))
|
||||
(advice-remove 'sm-test1 (lambda (f y) (* (funcall f y) 2)))
|
||||
(should (equal (sm-test1 6) 10))
|
||||
|
@ -62,6 +63,7 @@
|
|||
(ert-deftest advice-tests-advice ()
|
||||
"Test advice code."
|
||||
(defun sm-test2 (x) (+ x 4))
|
||||
(declare-function sm-test2 nil)
|
||||
(should (equal (sm-test2 6) 10))
|
||||
(defadvice sm-test2 (around sm-test activate)
|
||||
ad-do-it (setq ad-return-value (* ad-return-value 5)))
|
||||
|
@ -94,6 +96,7 @@
|
|||
(ert-deftest advice-tests-combination ()
|
||||
"Combining old style and new style advices."
|
||||
(defun sm-test5 (x) (+ x 4))
|
||||
(declare-function sm-test5 nil)
|
||||
(should (equal (sm-test5 6) 10))
|
||||
(advice-add 'sm-test5 :around (lambda (f y) (* (funcall f y) 5)))
|
||||
(should (equal (sm-test5 6) 50))
|
||||
|
@ -112,6 +115,7 @@
|
|||
(ert-deftest advice-test-called-interactively-p ()
|
||||
"Check interaction between advice and called-interactively-p."
|
||||
(defun sm-test7 (&optional x) (interactive) (+ (or x 7) 4))
|
||||
(declare-function sm-test7 nil)
|
||||
(advice-add 'sm-test7 :around
|
||||
(lambda (f &rest args)
|
||||
(list (cons 1 (called-interactively-p)) (apply f args))))
|
||||
|
@ -119,7 +123,7 @@
|
|||
(should (equal (call-interactively 'sm-test7) '((1 . t) 11)))
|
||||
(let ((smi 7))
|
||||
(advice-add 'sm-test7 :before
|
||||
(lambda (&rest args)
|
||||
(lambda (&rest _args)
|
||||
(setq smi (called-interactively-p))))
|
||||
(should (equal (list (sm-test7) smi)
|
||||
'(((1 . nil) 11) nil)))
|
||||
|
@ -137,6 +141,7 @@ This tests the currently broken case of the innermost advice to a
|
|||
function being an around advice."
|
||||
:expected-result :failed
|
||||
(defun sm-test7.2 () (interactive) (cons 1 (called-interactively-p)))
|
||||
(declare-function sm-test7.2 nil)
|
||||
(advice-add 'sm-test7.2 :around
|
||||
(lambda (f &rest args)
|
||||
(list (cons 1 (called-interactively-p)) (apply f args))))
|
||||
|
@ -147,6 +152,7 @@ function being an around advice."
|
|||
"Check interaction between filter-args advice and called-interactively-p."
|
||||
:expected-result :failed
|
||||
(defun sm-test7.3 () (interactive) (cons 1 (called-interactively-p)))
|
||||
(declare-function sm-test7.3 nil)
|
||||
(advice-add 'sm-test7.3 :filter-args #'list)
|
||||
(should (equal (sm-test7.3) '(1 . nil)))
|
||||
(should (equal (call-interactively 'sm-test7.3) '(1 . t))))
|
||||
|
|
|
@ -180,10 +180,6 @@ Return first line of the output of (describe-function-1 FUNC)."
|
|||
|
||||
(ert-deftest help-fns--analyze-function-recursive ()
|
||||
(defalias 'help-fns--a 'help-fns--b)
|
||||
(should (equal (help-fns--analyze-function 'help-fns--a)
|
||||
'(help-fns--a help-fns--b t help-fns--b)))
|
||||
;; Make a loop and see that it doesn't infloop.
|
||||
(defalias 'help-fns--b 'help-fns--a)
|
||||
(should (equal (help-fns--analyze-function 'help-fns--a)
|
||||
'(help-fns--a help-fns--b t help-fns--b))))
|
||||
|
||||
|
|
45
test/lisp/progmodes/c-ts-mode-resources/indent-preproc.erts
Normal file
45
test/lisp/progmodes/c-ts-mode-resources/indent-preproc.erts
Normal file
|
@ -0,0 +1,45 @@
|
|||
Code:
|
||||
(lambda ()
|
||||
(c-ts-mode)
|
||||
(newline)
|
||||
(indent-for-tab-command))
|
||||
|
||||
Point-Char: |
|
||||
|
||||
Name: Indents inside #if preproc
|
||||
|
||||
=-=
|
||||
static void
|
||||
free_glyph_pool (struct glyph_pool *pool)
|
||||
{
|
||||
if (pool)
|
||||
{
|
||||
#if defined GLYPH_DEBUG|
|
||||
#endif
|
||||
}
|
||||
}
|
||||
=-=
|
||||
static void
|
||||
free_glyph_pool (struct glyph_pool *pool)
|
||||
{
|
||||
if (pool)
|
||||
{
|
||||
#if defined GLYPH_DEBUG
|
||||
|
|
||||
#endif
|
||||
}
|
||||
}
|
||||
=-=-=
|
||||
|
||||
Name: Indents to 0 if #if preproc at root
|
||||
|
||||
=-=
|
||||
#if 0|
|
||||
/* */
|
||||
static void
|
||||
=-=
|
||||
#if 0
|
||||
|
|
||||
/* */
|
||||
static void
|
||||
=-=-=
|
|
@ -242,6 +242,21 @@ line 2
|
|||
*/
|
||||
=-=-=
|
||||
|
||||
Name: Block Comment prefixes (Bug#61314)
|
||||
|
||||
=-=-=
|
||||
/*
|
||||
- item1
|
||||
- item2
|
||||
- item3
|
||||
*/
|
||||
=-=-=
|
||||
/*
|
||||
- item1
|
||||
- item2
|
||||
- item3
|
||||
*/
|
||||
=-=-=
|
||||
|
||||
Code:
|
||||
(lambda ()
|
||||
|
@ -354,3 +369,19 @@ int main()
|
|||
};
|
||||
}
|
||||
=-=-=
|
||||
|
||||
Code:
|
||||
(lambda ()
|
||||
(c++-ts-mode)
|
||||
(setq-local indent-tabs-mode nil)
|
||||
(setq-local c-ts-mode-indent-offset 2)
|
||||
(indent-region (point-min) (point-max)))
|
||||
|
||||
Name: Declaration List (Namespace) (Bug#61635)
|
||||
|
||||
=-=
|
||||
namespace test {
|
||||
class Name {
|
||||
};
|
||||
}
|
||||
=-=-=
|
||||
|
|
|
@ -27,6 +27,10 @@
|
|||
(skip-unless (treesit-ready-p 'c))
|
||||
(ert-test-erts-file (ert-resource-file "indent.erts")))
|
||||
|
||||
(ert-deftest c-ts-mode-test-indentation-preproc ()
|
||||
(skip-unless (treesit-ready-p 'c))
|
||||
(ert-test-erts-file (ert-resource-file "indent-preproc.erts")))
|
||||
|
||||
(ert-deftest c-ts-mode-test-indentation-bsd ()
|
||||
(skip-unless (treesit-ready-p 'c))
|
||||
(ert-test-erts-file (ert-resource-file "indent-bsd.erts")))
|
||||
|
|
|
@ -1058,10 +1058,12 @@ final or penultimate step during initialization."))
|
|||
'(subr-tests--b subr-tests--c)))
|
||||
|
||||
(defalias 'subr-tests--d 'subr-tests--e)
|
||||
(defalias 'subr-tests--e 'subr-tests--d)
|
||||
(should-error (function-alias-p 'subr-tests--d))
|
||||
(should (equal (function-alias-p 'subr-tests--d t)
|
||||
'(subr-tests--e))))
|
||||
(should (equal (function-alias-p 'subr-tests--d)
|
||||
'(subr-tests--e)))
|
||||
|
||||
(fset 'subr-tests--f 'subr-tests--a)
|
||||
(should (equal (function-alias-p 'subr-tests--f)
|
||||
'(subr-tests--a subr-tests--b subr-tests--c))))
|
||||
|
||||
(ert-deftest test-readablep ()
|
||||
(should (readablep "foo"))
|
||||
|
|
|
@ -772,4 +772,40 @@ comparing the subr with a much slower Lisp implementation."
|
|||
"Can't set variable marked with 'make_symbol_constant'."
|
||||
(should-error (setq most-positive-fixnum 1) :type 'setting-constant))
|
||||
|
||||
(ert-deftest data-tests-fset ()
|
||||
(fset 'data-tests--fs-fun (lambda () 'moo))
|
||||
(declare-function data-tests--fs-fun nil)
|
||||
(should (equal (data-tests--fs-fun) 'moo))
|
||||
|
||||
(fset 'data-tests--fs-fun1 'data-tests--fs-fun)
|
||||
(declare-function data-tests--fs-fun1 nil)
|
||||
(should (equal (data-tests--fs-fun1) 'moo))
|
||||
|
||||
(fset 'data-tests--fs-a 'data-tests--fs-b)
|
||||
(fset 'data-tests--fs-b 'data-tests--fs-c)
|
||||
|
||||
(should-error (fset 'data-tests--fs-c 'data-tests--fs-c)
|
||||
:type 'cyclic-function-indirection)
|
||||
(fset 'data-tests--fs-d 'data-tests--fs-a)
|
||||
(should-error (fset 'data-tests--fs-c 'data-tests--fs-d)
|
||||
:type 'cyclic-function-indirection))
|
||||
|
||||
(ert-deftest data-tests-defalias ()
|
||||
(defalias 'data-tests--da-fun (lambda () 'baa))
|
||||
(declare-function data-tests--da-fun nil)
|
||||
(should (equal (data-tests--da-fun) 'baa))
|
||||
|
||||
(defalias 'data-tests--da-fun1 'data-tests--da-fun)
|
||||
(declare-function data-tests--da-fun1 nil)
|
||||
(should (equal (data-tests--da-fun1) 'baa))
|
||||
|
||||
(defalias 'data-tests--da-a 'data-tests--da-b)
|
||||
(defalias 'data-tests--da-b 'data-tests--da-c)
|
||||
|
||||
(should-error (defalias 'data-tests--da-c 'data-tests--da-c)
|
||||
:type 'cyclic-function-indirection)
|
||||
(defalias 'data-tests--da-d 'data-tests--da-a)
|
||||
(should-error (defalias 'data-tests--da-c 'data-tests--da-d)
|
||||
:type 'cyclic-function-indirection))
|
||||
|
||||
;;; data-tests.el ends here
|
||||
|
|
|
@ -872,4 +872,15 @@ This evaluates the TESTS test cases from glibc."
|
|||
(should (equal (string-match "\\`\\(?:ab\\)*\\'" "a") nil))
|
||||
(should (equal (string-match "\\`a\\{2\\}*\\'" "a") nil)))
|
||||
|
||||
(ert-deftest regexp-tests-backtrack-optimization () ;bug#61514
|
||||
;; Make sure we don't use up the regexp stack needlessly.
|
||||
(with-current-buffer (get-buffer-create "*bug*")
|
||||
(erase-buffer)
|
||||
(insert (make-string 1000000 ?x) "=")
|
||||
(goto-char (point-min))
|
||||
(should (looking-at "x*=*"))
|
||||
(should (looking-at "x*\\(=\\|:\\)"))
|
||||
(should (looking-at "x*\\(=\\|:\\)*"))
|
||||
(should (looking-at "x*=*?"))))
|
||||
|
||||
;;; regex-emacs-tests.el ends here
|
||||
|
|
Loading…
Add table
Reference in a new issue