emacs-diffs
[Top][All Lists]
Advanced

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

master 861d3db634 1/4: Merge from origin/emacs-29


From: Eli Zaretskii
Subject: master 861d3db634 1/4: Merge from origin/emacs-29
Date: Sun, 1 Jan 2023 05:51:51 -0500 (EST)

branch: master
commit 861d3db6343dcd793c54f79a38e0187b4755ee81
Merge: 7822fcbebd 72a81e2022
Author: Eli Zaretskii <eliz@gnu.org>
Commit: Eli Zaretskii <eliz@gnu.org>

    Merge from origin/emacs-29
    
    72a81e2022 ; * lisp/treesit.el (treesit-simple-indent-presets): Fix t...
    ddfeee3e8a Build recipe interactively in treesit-install-language-gra...
    6837469780 ; Add REVISION to treesit-language-source-alist
    0dc788aa01 ; Remove GRAMMAR-DIR from treesit-language-source-alist
    f9aef67c36 Tweak csharp-mode font-lock-settings (bug#60376)
    46362c0a3a ; * doc/lispref/tips.texi (Documentation Tips): Add indexing.
    9a386b682e Revert a recent change which causes errors
    9871ee8b14 ; More fixes for documentation of 'defalias'
    f309651b67 ; Fix handling of 'not' by 'buffer-match-p'
    9292f595a7 ; Fix typos
    43c7e05a2a Fix misspelled functions in shortdoc groups
    01acecc79c Simplify introduction of use-package manual
    2a7e072e53 ; Fix documentation of 'defalias'
    eee2aeca25 Fix python-shell-buffer-substring when retrieving a single...
    bfdad6c4e5 ; Fix recent treesit-related changes
---
 ChangeLog.1                                        |  2 +-
 ChangeLog.2                                        |  2 +-
 ChangeLog.3                                        | 20 ++---
 .../html-manual/Parser_002dbased-Indentation.html  |  2 +-
 doc/lispref/ChangeLog.1                            |  2 +-
 doc/lispref/buffers.texi                           | 18 ++--
 doc/lispref/functions.texi                         | 14 ++--
 doc/lispref/parsing.texi                           |  6 +-
 doc/lispref/tips.texi                              |  4 +
 doc/misc/use-package.texi                          | 16 +---
 lisp/ChangeLog.16                                  | 10 +--
 lisp/ChangeLog.17                                  |  2 +-
 lisp/emacs-lisp/chart.el                           |  2 +-
 lisp/emacs-lisp/shortdoc.el                        |  8 +-
 lisp/emacs-lisp/subr-x.el                          |  2 +-
 lisp/eshell/esh-var.el                             |  2 +-
 lisp/gnus/ChangeLog.2                              |  2 +-
 lisp/gnus/ChangeLog.3                              |  2 +-
 lisp/gnus/message.el                               |  2 +-
 lisp/mh-e/ChangeLog.1                              |  2 +-
 lisp/obsolete/rlogin.el                            |  2 +-
 lisp/org/org-capture.el                            |  2 +-
 lisp/org/org-element.el                            |  2 +-
 lisp/progmodes/csharp-mode.el                      | 53 +++++++-----
 lisp/progmodes/python.el                           | 47 +++++++----
 lisp/subr.el                                       |  2 +-
 lisp/textmodes/bibtex.el                           |  2 +-
 lisp/treesit.el                                    | 98 ++++++++++++++--------
 lisp/vc/pcvs-parse.el                              |  2 +-
 src/ChangeLog.11                                   |  2 +-
 src/treesit.c                                      | 10 +--
 test/lisp/emacs-lisp/shortdoc-tests.el             |  9 ++
 test/lisp/progmodes/python-tests.el                | 64 ++++++++++++++
 33 files changed, 269 insertions(+), 146 deletions(-)

diff --git a/ChangeLog.1 b/ChangeLog.1
index a8df1c0420..16b5f7bae0 100644
--- a/ChangeLog.1
+++ b/ChangeLog.1
@@ -4302,7 +4302,7 @@
        (install-arch-indep): Don't install-etc for self-contained ns builds.
 
        * configure.in (GCC_TEST_OPTIONS, NON_GCC_TEST_OPTIONS) <darwin>:
-       No longer unconditonally add /sw directories.  (Bug#2280)
+       No longer unconditionally add /sw directories.  (Bug#2280)
 
        * Makefile.in (install-arch-dep): Depend on install-arch-indep.
        (install-arch-indep): Depend on install-leim.
diff --git a/ChangeLog.2 b/ChangeLog.2
index 5d4c1afc36..bd2433a494 100644
--- a/ChangeLog.2
+++ b/ChangeLog.2
@@ -11843,7 +11843,7 @@
 
 2016-01-05  Alan Mackenzie  <acm@muc.de>
 
-       Make C++ buffers writeable when writing their initial text properties.
+       Make C++ buffers writable when writing their initial text properties.
 
        This is a correction to yesterday's CC Mode patch.
 
diff --git a/ChangeLog.3 b/ChangeLog.3
index bff2f7a66d..6085daa791 100644
--- a/ChangeLog.3
+++ b/ChangeLog.3
@@ -10733,7 +10733,7 @@
 
        Bump lisp/progmodes/project.el version to 0.7.1
 
-       Amont other things exposes the new project-buffers generic function to
+       Among other things exposes the new project-buffers generic function to
        ELPA users.
 
        * lisp/progmodes/project.el (Version): Bump to 0.7.1
@@ -25218,7 +25218,7 @@
 
 2021-05-12  Richard Stallman  <rms@gnu.org>
 
-       Little improvements in rmail.el.  Recognize encryped override headers.
+       Little improvements in rmail.el.  Recognize encrypted override headers.
 
        * lisp/mail/rmail.el (rmail-simplified-subject): Delete `[External] :'.
        (rmail-reply): In encrypted message, search for other header fields
@@ -27333,7 +27333,7 @@
 
 2021-04-24  Glenn Morris  <rgm@gnu.org>
 
-       Simlify top-level Makefile since admin is always included
+       Simplify top-level Makefile since admin is always included
 
        * Makefile.in (clean_dirs, distclean_dirs, maintainer_clean_dirs):
        Add admin directories.
@@ -27668,7 +27668,7 @@
        * lisp/international/mule-cmds.el (ucs-names):
        * lisp/progmodes/ebrowse.el (ebrowse-read):
        * test/src/coding-tests.el (benchmark-decoder): Avoid lowering
-       gc-cons-treshold.
+       gc-cons-threshold.
 
 2021-04-22  Stefan Kangas  <stefan@marxist.se>
 
@@ -46569,7 +46569,7 @@
        Fix syntax of symbol and punctuation characters
 
        * lisp/international/characters.el: Adjust syntax of punctuation
-       and symbol charcaters to follow that of Unicode properties.
+       and symbol characters to follow that of Unicode properties.
        (Bug#44974)
 
 2021-01-02  Andrea Corallo  <akrl@sdf.org>
@@ -63457,9 +63457,9 @@
 
 2020-09-30  Lars Ingebrigtsen  <larsi@gnus.org>
 
-       Fix isearch-group-* colors on low-colour displays
+       Fix isearch-group-* colors on low-color displays
 
-       * lisp/isearch.el (isearch-group-1): On low-colour displays, just
+       * lisp/isearch.el (isearch-group-1): On low-color displays, just
        use the normal isearch color (bug#43702).
        (isearch-group-2 etc): Ditto.
 
@@ -123828,7 +123828,7 @@
 
        * doc/lispref/text.texi (Special Properties): For the hook property
        modification-hooks, state that inhibit-modification-hooks is NOT bound 
to
-       non-nil when calling its functions.  For the hooks insert-in-fron-hooks 
and
+       non-nil when calling its functions.  For the hooks 
insert-in-front-hooks and
        insert-behind-hooks, state that that variable does get bound to non-nil.
 
 2019-06-24  Hong Xu  <hong@topbug.net>
@@ -156545,7 +156545,7 @@
        Obsolete Flymake's flymake-diagnostic-types-alist
 
        That variable was an association between symbols and properties,
-       effecively duplicating symbol's property lists.  It is simpler to just
+       effectively duplicating symbol's property lists.  It is simpler to just
        put properties on symbols.  Backward compatibility to the old variable
        has been kept.
 
@@ -190693,7 +190693,7 @@
        Support multi-lingual detection of SEE ALSO man sections
 
        * lisp/man.el (Man-see-also-regexp): Add support for SEE ALSO
-       section detection in several langages: French, German, Spanish,
+       section detection in several languages: French, German, Spanish,
        Portuguese, Italian, Polish, Turkish, Japanese, Chinese.  (Bug#28142)
 
 2017-08-26  Paul Eggert  <eggert@cs.ucla.edu>
diff --git 
a/admin/notes/tree-sitter/html-manual/Parser_002dbased-Indentation.html 
b/admin/notes/tree-sitter/html-manual/Parser_002dbased-Indentation.html
index 95005de6d1..1d48398bbc 100644
--- a/admin/notes/tree-sitter/html-manual/Parser_002dbased-Indentation.html
+++ b/admin/notes/tree-sitter/html-manual/Parser_002dbased-Indentation.html
@@ -240,7 +240,7 @@ expression <code>treesit-comment-start</code> (see <a 
href="Tree_002dsitter-majo
 the comment node.
 </p>
 </dd>
-<dt 
id='index-coment_002dstart_002dskip'><span><code>coment-start-skip</code><a 
href='#index-coment_002dstart_002dskip' class='copiable-anchor'> 
&para;</a></span></dt>
+<dt 
id='index-coment_002dstart_002dskip'><span><code>comment-start-skip</code><a 
href='#index-coment_002dstart_002dskip' class='copiable-anchor'> 
&para;</a></span></dt>
 <dd><p>This anchor is a function that is called with 3 arguments: 
<var>node</var>,
 <var>parent</var>, and <var>bol</var>, and returns the position after the
 comment-start token and any whitespace characters following that
diff --git a/doc/lispref/ChangeLog.1 b/doc/lispref/ChangeLog.1
index 361e816bc3..cc4ff37ccb 100644
--- a/doc/lispref/ChangeLog.1
+++ b/doc/lispref/ChangeLog.1
@@ -2201,7 +2201,7 @@
        * doclicense.texi: Update to latest version from FSF.
        These are just minor editorial changes.
        * elisp.texi (GNU Free Documentation License)
-       (GNU General Public Licens):
+       (GNU General Public License):
        Provide sectioning, since doclicense.texi no longer does that.
 
        * loading.texi (Named Features): @ -> @@ to fix typo.
diff --git a/doc/lispref/buffers.texi b/doc/lispref/buffers.texi
index c40e088293..57d627a420 100644
--- a/doc/lispref/buffers.texi
+++ b/doc/lispref/buffers.texi
@@ -977,17 +977,15 @@ first argument is @var{buffer-or-name} and the second is 
@var{arg}
 A cons-cell @code{(@var{oper} . @var{expr})} where @var{oper} is one
 of
 @table @code
-@item not
-Satisfied if @var{expr} doesn't satisfy @code{buffer-match-p} with
+@item (not @var{cond})
+Satisfied if @var{cond} doesn't satisfy @code{buffer-match-p} with
 the same buffer and @code{arg}.
-@item or
-Satisfied if @var{expr} is a list and @emph{any} condition in
-@var{expr} satisfies @code{buffer-match-p}, with the same buffer and
-@code{arg}.
-@item and
-Satisfied if @var{expr} is a list and @emph{all} conditions in
-@var{expr} satisfy @code{buffer-match-p}, with the same buffer and
-@code{arg}.
+@item (or @var{conds}@dots{})
+Satisfied if @emph{any} condition in @var{conds} satisfies
+@code{buffer-match-p}, with the same buffer and @code{arg}.
+@item (and @var{conds}@dots{})
+Satisfied if @emph{all} the conditions in @var{conds} satisfy
+@code{buffer-match-p}, with the same buffer and @code{arg}.
 @item derived-mode
 Satisfied if the buffer's major mode derives from @var{expr}.
 @item major-mode
diff --git a/doc/lispref/functions.texi b/doc/lispref/functions.texi
index 9d5a266191..a0ee59df7e 100644
--- a/doc/lispref/functions.texi
+++ b/doc/lispref/functions.texi
@@ -700,8 +700,10 @@ redefinition from unintentional redefinition.
 @defun defalias name definition &optional doc
 @anchor{Definition of defalias}
 This function defines the symbol @var{name} as a function, with
-definition @var{definition} (which can be any valid Lisp function).
-Its return value is @emph{undefined}.
+definition @var{definition}.  @var{definition} can be any valid Lisp
+function or macro, or a special form (@pxref{Special Forms}), or a
+keymap (@pxref{Keymaps}), or a vector or string (a keyboard macro).
+The return value of @code{defalias} is @emph{undefined}.
 
 If @var{doc} is non-@code{nil}, it becomes the function documentation
 of @var{name}.  Otherwise, any documentation provided by
@@ -713,10 +715,10 @@ If @var{name} has a @code{defalias-fset-function} 
property, however,
 the associated value is used as a function to call in place of @code{fset}.
 
 The proper place to use @code{defalias} is where a specific function
-name is being defined---especially where that name appears explicitly in
-the source file being loaded.  This is because @code{defalias} records
-which file defined the function, just like @code{defun}
-(@pxref{Unloading}).
+or macro name is being defined---especially where that name appears
+explicitly in the source file being loaded.  This is because
+@code{defalias} records which file defined the function, just like
+@code{defun} (@pxref{Unloading}).
 
 By contrast, in programs that manipulate function definitions for other
 purposes, it is better to use @code{fset}, which does not keep such
diff --git a/doc/lispref/parsing.texi b/doc/lispref/parsing.texi
index 8803991b72..aaf9d7060a 100644
--- a/doc/lispref/parsing.texi
+++ b/doc/lispref/parsing.texi
@@ -154,9 +154,9 @@ them.
 @end defun
 
 @defun treesit-language-abi-version language
-This function returns the language grammar @acronym{ABI} version of
-language grammar for @var{language} loaded by Emacs.  If
-@var{language} is unavailable, this function returns @code{nil}.
+This function returns the @acronym{ABI} version of the language
+grammar library loaded by Emacs for @var{language}.  If @var{language}
+is unavailable, this function returns @code{nil}.
 @end defun
 
 @heading Concrete syntax tree
diff --git a/doc/lispref/tips.texi b/doc/lispref/tips.texi
index 3216a35395..d5c7eedff5 100644
--- a/doc/lispref/tips.texi
+++ b/doc/lispref/tips.texi
@@ -689,6 +689,10 @@ line.  This looks nice in the source code, but looks 
bizarre when users
 view the documentation.  Remember that the indentation before the
 starting double-quote is not part of the string!
 
+@cindex quoting apostrophe and grave accent in doc strings
+@cindex apostrophe, quoting in documentation strings
+@cindex grave accent, quoting in documentation strings
+@cindex escaping apostrophe and grave accent in doc strings
 @item
 When documentation should display an ASCII apostrophe or grave accent,
 use @samp{\\='} or @samp{\\=`} in the documentation string literal so
diff --git a/doc/misc/use-package.texi b/doc/misc/use-package.texi
index c587d23d74..1d0e38a1ec 100644
--- a/doc/misc/use-package.texi
+++ b/doc/misc/use-package.texi
@@ -132,19 +132,9 @@ do.
 @cindex quick-start instructions
 
 This chapter provides instructions and examples for quickly getting
-started with use-package.  The first thing you need to do is make sure
-that @file{use-package} itself is loaded.  To do that, put this at the
-top of your init file:
-
-@lisp
-(require 'use-package)
-@end lisp
-
-@cindex declaration
-The above makes the @code{use-macro} available for us in the rest of
-your init file.  In this manual, we say that each call to
-@code{use-macro} is a @dfn{declaration}, to highlight the declarative
-nature of its syntax.
+started with use-package.  In this manual, we say that each call to
+the @code{use-package} macro in your init file is a @dfn{declaration},
+to highlight the declarative nature of its syntax.
 
 To unconditionally load a package named @samp{foo}, add the following
 declaration to your init file:
diff --git a/lisp/ChangeLog.16 b/lisp/ChangeLog.16
index ef230bf9ed..d2480c6fa3 100644
--- a/lisp/ChangeLog.16
+++ b/lisp/ChangeLog.16
@@ -10968,8 +10968,8 @@
        * comint.el (comint-history-isearch-end):
        Use `isearch-search-fun-default'.
        (comint-history-isearch-search): Use `isearch-search-fun-default'
-       and remove spacial case for `isearch-word'.
-       (comint-history-isearch-wrap): Remove spacial case for
+       and remove special case for `isearch-word'.
+       (comint-history-isearch-wrap): Remove special case for
        `isearch-word'.
 
        * hexl.el (hexl-isearch-search-function):
@@ -10982,13 +10982,13 @@
        Use `isearch-search-fun-default'.
 
        * simple.el (minibuffer-history-isearch-search):
-       Use `isearch-search-fun-default' and remove spacial case for
+       Use `isearch-search-fun-default' and remove special case for
        `isearch-word'.
-       (minibuffer-history-isearch-wrap): Remove spacial case for
+       (minibuffer-history-isearch-wrap): Remove special case for
        `isearch-word'.
 
        * textmodes/reftex-global.el (reftex-isearch-wrap-function):
-       Remove spacial case for `isearch-word'.
+       Remove special case for `isearch-word'.
        (reftex-isearch-isearch-search): Use `isearch-search-fun-default'.
 
 2012-05-28  Agustín Martín Domingo  <agustin.martin@hispalinux.es>
diff --git a/lisp/ChangeLog.17 b/lisp/ChangeLog.17
index 57620513e3..021ddd0b2b 100644
--- a/lisp/ChangeLog.17
+++ b/lisp/ChangeLog.17
@@ -15465,7 +15465,7 @@
 2013-12-12  Fabián Ezequiel Gallina  <fgallina@gnu.org>
 
        * progmodes/python.el (python-indent-context)
-       (python-indent-calculate-indentation): Fix auto-identation
+       (python-indent-calculate-indentation): Fix auto-indentation
        behavior for comment blocks.  (Bug#15916)
 
 2013-12-12  Nathan Trapuzzano  <nbtrap@nbtrap.com>  (tiny change)
diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
index 16c2c34740..b154a131a4 100644
--- a/lisp/emacs-lisp/chart.el
+++ b/lisp/emacs-lisp/chart.el
@@ -517,7 +517,7 @@ cons cells of the form (NAME . NUM).  See `sort' for more 
details."
     (if (eobp) (newline num))
     (if (< x 0) (setq x 0))
     (if (< y 0) (setq y 0))
-    ;; Now, a quicky column moveto/forceto method.
+    ;; Now, a quickie column moveto/forceto method.
     (or (= (move-to-column x) x)
        (let ((p (point)))
          (indent-to x)
diff --git a/lisp/emacs-lisp/shortdoc.el b/lisp/emacs-lisp/shortdoc.el
index 90f81d740f..86baca54e9 100644
--- a/lisp/emacs-lisp/shortdoc.el
+++ b/lisp/emacs-lisp/shortdoc.el
@@ -421,8 +421,8 @@ A FUNC form can have any number of `:no-eval' (or 
`:no-value'),
   (file-readable-p
    :no-eval (file-readable-p "/tmp/foo")
    :eg-result t)
-  (file-writeable-p
-   :no-eval (file-writeable-p "/tmp/foo")
+  (file-writable-p
+   :no-eval (file-writable-p "/tmp/foo")
    :eg-result t)
   (file-accessible-directory-p
    :no-eval (file-accessible-directory-p "/tmp")
@@ -652,8 +652,8 @@ A FUNC form can have any number of `:no-eval' (or 
`:no-value'),
    :eval (mapcan #'list '(1 2 3)))
   (mapc
    :eval (mapc #'insert '("1" "2" "3")))
-  (reduce
-   :eval (reduce #'+ '(1 2 3)))
+  (seq-reduce
+   :eval (seq-reduce #'+ '(1 2 3) 0))
   (mapconcat
    :eval (mapconcat #'identity '("foo" "bar") "|"))
   "Predicates"
diff --git a/lisp/emacs-lisp/subr-x.el b/lisp/emacs-lisp/subr-x.el
index 415f8db52c..c7ce02e501 100644
--- a/lisp/emacs-lisp/subr-x.el
+++ b/lisp/emacs-lisp/subr-x.el
@@ -334,7 +334,7 @@ as the new values of the bound variables in the recursive 
invocation."
 (defun string-glyph-split (string)
   "Split STRING into a list of strings representing separate glyphs.
 This takes into account combining characters and grapheme clusters:
-if compositions are enbaled, each sequence of characters composed
+if compositions are enabled, each sequence of characters composed
 on display into a single grapheme cluster is treated as a single
 indivisible unit."
   (let ((result nil)
diff --git a/lisp/eshell/esh-var.el b/lisp/eshell/esh-var.el
index 61e9af01a4..807a8ecc44 100644
--- a/lisp/eshell/esh-var.el
+++ b/lisp/eshell/esh-var.el
@@ -216,7 +216,7 @@ nil.  If SIMPLE-FUNCTION is non-nil, call the function with 
no
 arguments and then pass its return value to `eshell-apply-indices'.
 
 When VALUE is a function, it's read-only by default.  To make it
-writeable, use the (GET . SET) form described above.  If SET is a
+writable, use the (GET . SET) form described above.  If SET is a
 function, it takes two arguments: a list of indices (currently
 always nil, but reserved for future enhancement), and the new
 value to set.
diff --git a/lisp/gnus/ChangeLog.2 b/lisp/gnus/ChangeLog.2
index 4ac69b575f..292e8fbe5b 100644
--- a/lisp/gnus/ChangeLog.2
+++ b/lisp/gnus/ChangeLog.2
@@ -8859,7 +8859,7 @@
        signencrypt.
        * mml-sec.el (mml-secure-message-encrypt-pgpmime): Ditto.
        * mml.el (mml-generate-mime-1): Change logic so a part which is
-       both signed & encryped is processed in one operation (rather than
+       both signed & encrypted is processed in one operation (rather than
        two separate ops: sign, then encrypt).
        * mml2015.el (mml2015-gpg-extract-signature-details): Give some
        indication if a message is signed by an expired key.
diff --git a/lisp/gnus/ChangeLog.3 b/lisp/gnus/ChangeLog.3
index bf64780799..7242307333 100644
--- a/lisp/gnus/ChangeLog.3
+++ b/lisp/gnus/ChangeLog.3
@@ -17348,7 +17348,7 @@
        * rfc2047.el (rfc2047-quote-special-characters-in-quoted-strings):
        New function.
        (rfc2047-encode-message-header, rfc2047-encode-region): Use it.
-       (rfc2047-strip-backslashes-in-quoted-strings): New fnction.
+       (rfc2047-strip-backslashes-in-quoted-strings): New function.
        (rfc2047-decode-region): Use it; add optional argument `address-mime'.
        (rfc2047-decode-string): Ditto.
        (rfc2047-decode-address-region): New function.
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index 6c10a4ae97..272e6bf4b7 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -2822,7 +2822,7 @@ systematically send encrypted emails when possible."
 
 The value must be a list of three elements, all strings:
 - Key ID, in hexadecimal form;
-- Key URL or ASCII armoured key; and
+- Key URL or ASCII armored key; and
 - Protection preference, one of: \"unprotected\", \"sign\",
   \"encrypt\" or \"signencrypt\".
 
diff --git a/lisp/mh-e/ChangeLog.1 b/lisp/mh-e/ChangeLog.1
index d6893fb9ec..f3053f3a25 100644
--- a/lisp/mh-e/ChangeLog.1
+++ b/lisp/mh-e/ChangeLog.1
@@ -761,7 +761,7 @@
        below, docstring was usually completely rewritten. Use "on"
        instead of "t" in docstring to match what is seen in customization
        buffer. Use headline capitalization. Standardize on "Auto-detect"
-       text when option has that capibility.
+       text when option has that capability.
        (mh): Since we work on more than one type of Emacs, use Emacs
        instead of GNU Emacs. Prefer GNU mailutils over GNU Mailutils.
        (mh-variant): s/Autodetect at startup/Auto-detect/.
diff --git a/lisp/obsolete/rlogin.el b/lisp/obsolete/rlogin.el
index 6a06300ae3..935209650e 100644
--- a/lisp/obsolete/rlogin.el
+++ b/lisp/obsolete/rlogin.el
@@ -95,7 +95,7 @@ This variable becomes local to a buffer when set in any 
fashion for it.
 It is better to use the function of the same name to change the behavior of
 directory tracking in an rlogin session once it has begun, rather than
 simply setting this variable, since the function does the necessary
-re-synching of directories."
+re-syncing of directories."
   :type '(choice (const :tag "off" nil)
                 (const :tag "ftp" t)
                 (other :tag "local" local))
diff --git a/lisp/org/org-capture.el b/lisp/org/org-capture.el
index b26afeb036..4e65706315 100644
--- a/lisp/org/org-capture.el
+++ b/lisp/org/org-capture.el
@@ -1700,7 +1700,7 @@ Expansion occurs in a temporary Org mode buffer."
              (condition-case error
                  (insert-file-contents filename)
                (error
-                (insert (format "%%![couldn not insert %s: %s]"
+                (insert (format "%%![could not insert %s: %s]"
                                 filename
                                 error))))))))
       ;; Mark %() embedded elisp for later evaluation.
diff --git a/lisp/org/org-element.el b/lisp/org/org-element.el
index ace1cc1a98..aa618a088a 100644
--- a/lisp/org/org-element.el
+++ b/lisp/org/org-element.el
@@ -5299,7 +5299,7 @@ indentation removed from its contents."
 ;; mechanism is robust enough to preserve total order among elements
 ;; even when the tree is only partially synchronized.
 ;;
-;; The cache code debuggin is fairly complex because cache request
+;; The cache code debugging is fairly complex because cache request
 ;; state is often hard to reproduce.  An extensive diagnostics
 ;; functionality is built into the cache code to assist hunting bugs.
 ;; See `org-element--cache-self-verify', 
`org-element--cache-self-verify-frequency',
diff --git a/lisp/progmodes/csharp-mode.el b/lisp/progmodes/csharp-mode.el
index 33a5f7046f..4bd5d15fb1 100644
--- a/lisp/progmodes/csharp-mode.el
+++ b/lisp/progmodes/csharp-mode.el
@@ -692,25 +692,47 @@ compilation and evaluation time conflicts."
 
 (defvar csharp-ts-mode--font-lock-settings
   (treesit-font-lock-rules
+   :language 'c-sharp
+   :feature 'expression
+   '((conditional_expression (identifier) @font-lock-variable-name-face)
+     (postfix_unary_expression (identifier)* @font-lock-variable-name-face)
+     (assignment_expression (identifier) @font-lock-variable-name-face))
+
+   :language 'c-sharp
+   :feature 'bracket
+   '((["(" ")" "[" "]" "{" "}"]) @font-lock-bracket-face)
+
+   :language 'c-sharp
+   :feature 'delimiter
+   '((["," ":" ";"]) @font-lock-delimiter-face)
+
+   :language 'c-sharp
+   :feature 'error
+   '((ERROR) @font-lock-warning-face)
+
    :language 'c-sharp
    :override t
    :feature 'comment
-   '((comment)  @font-lock-comment-face)
+   '((comment) @font-lock-comment-face)
+
    :language 'c-sharp
    :override t
    :feature 'keyword
    `([,@csharp-ts-mode--keywords] @font-lock-keyword-face
      (modifier) @font-lock-keyword-face
      (this_expression) @font-lock-keyword-face)
+
    :language 'c-sharp
    :override t
-   :feature 'attribute
+   :feature 'property
    `((attribute (identifier) @font-lock-property-face 
(attribute_argument_list))
      (attribute (identifier) @font-lock-property-face))
+
    :language 'c-sharp
    :override t
    :feature 'escape-sequence
    '((escape_sequence) @font-lock-escape-face)
+
    :language 'c-sharp
    :override t
    :feature 'literal
@@ -718,6 +740,7 @@ compilation and evaluation time conflicts."
      (real_literal) @font-lock-number-face
      (null_literal) @font-lock-constant-face
      (boolean_literal) @font-lock-constant-face)
+
    :language 'c-sharp
    :override t
    :feature 'string
@@ -730,6 +753,7 @@ compilation and evaluation time conflicts."
       "$\""
       "@$\""
       "$@\""] @font-lock-string-face)
+
    :language 'c-sharp
    :override t
    :feature 'type
@@ -750,14 +774,14 @@ compilation and evaluation time conflicts."
       target: (identifier) @font-lock-type-face)
      (type_of_expression (identifier) @font-lock-type-face)
      (object_creation_expression (identifier) @font-lock-type-face))
+
    :language 'c-sharp
    :feature 'definition
    :override t
    '((qualified_name (identifier) @font-lock-type-face)
      (using_directive (identifier) @font-lock-type-face)
      (using_directive (name_equals
-                       (identifier) @font-lock-type-face
-                       ["="] @default-face))
+                       (identifier) @font-lock-type-face))
 
      (enum_declaration (identifier) @font-lock-type-face)
      (enum_member_declaration (identifier) @font-lock-variable-name-face)
@@ -820,24 +844,11 @@ compilation and evaluation time conflicts."
 
      (binary_expression (identifier) @font-lock-variable-name-face)
      (argument (identifier) @font-lock-variable-name-face))
-   :language 'c-sharp
-   :feature 'expression
-   '((conditional_expression (identifier) @font-lock-variable-name-face)
-     (postfix_unary_expression (identifier)* @font-lock-variable-name-face)
-     (assignment_expression (identifier) @font-lock-variable-name-face))
-   :language 'c-sharp
-   :feature 'bracket
-   '((["(" ")" "[" "]" "{" "}"]) @font-lock-bracket-face)
-
-   :language 'c-sharp
-   :feature 'delimiter
-   '((["," ":" ";"]) @font-lock-delimiter-face)
 
    :language 'c-sharp
    :feature 'escape-sequence
    :override t
-   '((escape_sequence) @font-lock-escape-face
-     (ERROR) @font-lock-warning-face)))
+   '((escape_sequence) @font-lock-escape-face)))
 
 ;;;###autoload
 (add-to-list 'auto-mode-alist '("\\.cs\\'" . csharp-mode))
@@ -908,9 +919,9 @@ Key bindings:
   (setq-local treesit-font-lock-settings csharp-ts-mode--font-lock-settings)
   (setq-local treesit-font-lock-feature-list
               '(( comment definition)
-                ( keyword string escape-sequence type)
-                ( attribute constant expression literal)
-                ( bracket delimiter)))
+                ( keyword string type)
+                ( constant escape-sequence expression literal property)
+                ( bracket delimiter error)))
 
   ;; Imenu.
   (setq-local treesit-simple-imenu-settings
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 07f86d3155..694b897cc0 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -1192,7 +1192,7 @@ fontified."
   "Check whether NODE is a variable.
 NODE's type should be \"identifier\"."
   ;; An identifier can be a function/class name, a property, or a
-  ;; variables.  This funtion filters out function/class names and
+  ;; variables.  This function filters out function/class names and
   ;; properties.
   (pcase (treesit-node-type (treesit-node-parent node))
     ((or "function_definition" "class_definition") nil)
@@ -3736,19 +3736,35 @@ the python shell:
      appending extra empty lines so tracebacks are correct.
   3. When the region sent is a substring of the current buffer, a
      coding cookie is added.
-  4. Wraps indented regions under an \"if True:\" block so the
-     interpreter evaluates them correctly."
-  (let* ((start (save-excursion
-                  ;; If we're at the start of the expression, and
-                  ;; there's just blank space ahead of it, then expand
-                  ;; the region to include the start of the line.
-                  ;; This makes things work better with the rest of
-                  ;; the data we're sending over.
+  4. When the region consists of a single statement, leading
+     whitespaces will be removed.  Otherwise, wraps indented
+     regions under an \"if True:\" block so the interpreter
+     evaluates them correctly."
+  (let* ((single-p (save-restriction
+                     (narrow-to-region start end)
+                     (= (progn
+                          (goto-char start)
+                          (python-nav-beginning-of-statement))
+                        (progn
+                          (goto-char end)
+                          (python-nav-beginning-of-statement)))))
+         (start (save-excursion
+                  ;; If we're at the start of the expression, and if
+                  ;; the region consists of a single statement, then
+                  ;; remove leading whitespaces, else if there's just
+                  ;; blank space ahead of it, then expand the region
+                  ;; to include the start of the line.  This makes
+                  ;; things work better with the rest of the data
+                  ;; we're sending over.
                   (goto-char start)
-                  (if (string-blank-p
-                       (buffer-substring (line-beginning-position) start))
-                      (line-beginning-position)
-                    start)))
+                  (if single-p
+                      (progn
+                        (skip-chars-forward "[:space:]" end)
+                        (point))
+                    (if (string-blank-p
+                         (buffer-substring (line-beginning-position) start))
+                        (line-beginning-position)
+                      start))))
          (substring (buffer-substring-no-properties start end))
          (starts-at-point-min-p (save-restriction
                                   (widen)
@@ -3772,7 +3788,7 @@ the python shell:
       (python-mode)
       (when fillstr
         (insert fillstr))
-      (when (not toplevel-p)
+      (when (and (not single-p) (not toplevel-p))
         (forward-line -1)
         (insert "if True:\n")
         (delete-region (point) (line-end-position)))
@@ -3816,7 +3832,8 @@ code inside blocks delimited by \"if __name__== 
\\='__main__\\=':\".
 When called interactively SEND-MAIN defaults to nil, unless it's
 called with prefix argument.  When optional argument MSG is
 non-nil, forces display of a user-friendly message if there's no
-process running; defaults to t when called interactively."
+process running; defaults to t when called interactively.  The
+substring to be sent is retrieved using `python-shell-buffer-substring'."
   (interactive
    (list (region-beginning) (region-end) current-prefix-arg t))
   (let* ((string (python-shell-buffer-substring start end (not send-main)
diff --git a/lisp/subr.el b/lisp/subr.el
index 69e6198e1b..17116a9b3c 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -7063,7 +7063,7 @@ CONDITION is either:
   * `major-mode': the buffer matches if the buffer's major mode
     is eq to the cons-cell's cdr.  Prefer using `derived-mode'
     instead when both can work.
-  * `not': the cdr is interpreted as a negation of a condition.
+  * `not': the cadr is interpreted as a negation of a condition.
   * `and': the cdr is a list of recursive conditions, that all have
     to be met.
   * `or': the cdr is a list of recursive condition, of which at
diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el
index 2390974288..9dec998f7e 100644
--- a/lisp/textmodes/bibtex.el
+++ b/lisp/textmodes/bibtex.el
@@ -4093,7 +4093,7 @@ move point to the beginning of buffer.  Return the new 
location of point."
   (interactive)
   (beginning-of-line)
   ;; `bibtex-any-valid-entry-type' would fail if users "disable"
-  ;; an entry by chosing an invalid entry type.
+  ;; an entry by choosing an invalid entry type.
   (or (looking-at bibtex-any-entry-maybe-empty-head)
       (re-search-backward bibtex-any-entry-maybe-empty-head nil 'move))
   (point))
diff --git a/lisp/treesit.el b/lisp/treesit.el
index 8f6354fde2..545659e996 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -1177,7 +1177,6 @@ See `treesit-simple-indent-presets'.")
                                          fns)))))
         (cons 'not (lambda (fn)
                      (lambda (node parent bol &rest _)
-                       (debug)
                        (not (funcall fn node parent bol)))))
         (cons 'list (lambda (&rest fns)
                       (lambda (node parent bol &rest _)
@@ -1649,7 +1648,7 @@ friends."
 ;; TODO: I'm not entirely sure how would this go, so I only documented
 ;; the "defun" functions and didn't document any "thing" functions.
 ;; We should also document `treesit-block-type-regexp' and support it
-;; in major modes if we can meaningfully intergrate hideshow: I tried
+;; in major modes if we can meaningfully integrate hideshow: I tried
 ;; and failed, we need SomeOne that understands hideshow to look at
 ;; it.  (BTW, hideshow should use its own
 ;; `treesit-hideshow-block-type-regexp'.)
@@ -2653,23 +2652,47 @@ window."
 ;;; Install & build language grammar
 
 (defvar treesit-language-source-alist nil
-  "Configures how to download tree-sitter language grammars.
-This should be an alist of
+  "Configuration for downloading and installing tree-sitter language grammars.
 
-    (LANG . (URL SOURCE-DIR GRAMMAR-DIR CC C++))
+The value should be an alist where each element has the form
+
+    (LANG . (URL REVISION SOURCE-DIR CC C++))
 
 Only LANG and URL are mandatory.  LANG is the language symbol.
-URL is the repository's url.
+URL is the Git repository URL for the grammar.
 
-SOURCE-DIR is the relative directory in the repository in which
-the grammar.c file resides, default to \"src\".
+REVISION is the Git tag or branch of the desired version,
+defaulting to the latest default branch.
 
-GRAMMAR-DIR is the relative grammar directory in the repository
-in which the grammar.js file resides, default to \"\".
+SOURCE-DIR is the relative subdirectory in the repository in which
+the grammar's parser.c file resides, defaulting to \"src\".
 
-CC and C++ are C and C++ compilers, default to \"cc\" and
+CC and C++ are C and C++ compilers, defaulting to \"cc\" and
 \"c++\", respectively.")
 
+(defun treesit--install-language-grammar-build-recipe (lang)
+  "Interactively build a recipe for LANG and return it.
+See `treesit-language-source-alist' for details."
+  (when (y-or-n-p (format "There is no recipe for %s, do you want to build it 
interactively?" lang))
+    (cl-labels ((empty-string-to-nil (string)
+                  (if (equal string "") nil string)))
+      (list
+       lang
+       (read-string
+        "Enter the URL of the Git repository of the language grammar: ")
+       (empty-string-to-nil
+        (read-string
+         "Enter the tag or branch (default: default branch): "))
+       (empty-string-to-nil
+        (read-string
+         "Enter the subdirectory in which the parser.c file resides (default: 
\"src\"): "))
+       (empty-string-to-nil
+        (read-string
+         "Enter the C compiler to use (default: auto-detect): "))
+       (empty-string-to-nil
+        (read-string
+         "Enter the C++ compiler to use (default: auto-detect): "))))))
+
 (defun treesit-install-language-grammar (lang)
   "Build and install the tree-sitter language grammar library for LANG.
 
@@ -2682,17 +2705,21 @@ executable programs, such as the C/C++ compiler and 
linker."
   (interactive (list (intern
                       (completing-read
                        "Language: "
-                       (mapcar #'car treesit-language-source-alist)
-                       nil t))))
-  (condition-case err
-      (apply #'treesit--install-language-grammar-1
-             ;; The nil is OUT-DIR.
-             (cons nil (assoc lang treesit-language-source-alist)))
-    (error
-     (display-warning
-      'treesit
-      (format "Error encountered when installing language grammar: %s"
-              err))))
+                       (mapcar #'car treesit-language-source-alist)))))
+  (when-let ((recipe
+              (or (assoc lang treesit-language-source-alist)
+                  (treesit--install-language-grammar-build-recipe
+                   lang))))
+    (condition-case err
+        (apply #'treesit--install-language-grammar-1
+               ;; The nil is OUT-DIR.
+               (cons nil recipe))
+      (error
+       (display-warning
+        'treesit
+        (format "Error encountered when installing language grammar: %s"
+                err)))))
+
   ;; Check that the installed language grammar is loadable.
   (pcase-let ((`(,available . ,err)
                (treesit-language-available-p lang t)))
@@ -2720,22 +2747,21 @@ content as signal data, and erase buffer afterwards."
     (erase-buffer)))
 
 (defun treesit--install-language-grammar-1
-    (out-dir lang url &optional source-dir grammar-dir cc c++)
+    (out-dir lang url &optional revision source-dir cc c++)
   "Install and compile a tree-sitter language grammar library.
 
 OUT-DIR is the directory to put the compiled library file.  If it
 is nil, the \"tree-sitter\" directory under user's Emacs
-configuration directory is used (and automatically created if not
-exist).
+configuration directory is used (and automatically created if it
+does not exist).
 
-For LANG, URL, SOURCE-DIR, GRAMMAR-DIR, CC, C++, see
+For LANG, URL, REVISION, SOURCE-DIR, GRAMMAR-DIR, CC, C++, see
 `treesit-language-source-alist'.  If anything goes wrong, this
 function signals an error."
   (let* ((lang (symbol-name lang))
          (default-directory (make-temp-file "treesit-workdir" t))
          (workdir (expand-file-name "repo"))
          (source-dir (expand-file-name (or source-dir "src") workdir))
-         (grammar-dir (expand-file-name (or grammar-dir "") workdir))
          (cc (or cc (seq-find #'executable-find '("cc" "gcc" "c99"))
                  ;; If no C compiler found, just use cc and let
                  ;; `call-process' signal the error.
@@ -2750,14 +2776,16 @@ function signals an error."
     (unwind-protect
         (with-temp-buffer
           (message "Cloning repository")
-          ;; git clone xxx --depth 1 --quiet workdir
-          (treesit--call-process-signal
-           "git" nil t nil "clone" url "--depth" "1" "--quiet"
-           workdir)
-          ;; cp "${grammardir}"/grammar.js "${sourcedir}"
-          (copy-file (expand-file-name "grammar.js" grammar-dir)
-                     (expand-file-name "grammar.js" source-dir)
-                     t t)
+          ;; git clone xxx --depth 1 --quiet [-b yyy] workdir
+          (if revision
+              (treesit--call-process-signal
+               "git" nil t nil "clone" url "--depth" "1" "--quiet"
+               "-b" revision workdir)
+            (treesit--call-process-signal
+             "git" nil t nil "clone" url "--depth" "1" "--quiet"
+             workdir))
+          ;; We need to go into the source directory because some
+          ;; header files use relative path (#include "../xxx").
           ;; cd "${sourcedir}"
           (setq default-directory source-dir)
           (message "Compiling library")
diff --git a/lisp/vc/pcvs-parse.el b/lisp/vc/pcvs-parse.el
index 77c5469a17..5b4c3019ca 100644
--- a/lisp/vc/pcvs-parse.el
+++ b/lisp/vc/pcvs-parse.el
@@ -435,7 +435,7 @@ The remaining KEYS are passed directly to 
`cvs-create-fileinfo'."
        ;; Conflict
        (and
         (cvs-match (concat "C \\(.*" qfile "\\)$") (path 1) (type 'CONFLICT))
-        ;; C might be followed by a "spurious" U for non-mergable files
+        ;; C might be followed by a "spurious" U for non-mergeable files
         (cvs-or (cvs-match (concat "U \\(.*" qfile "\\)$")) t))
        ;; Successful merge
        (cvs-match (concat "M \\(.*" qfile "\\)$") (path 1))
diff --git a/src/ChangeLog.11 b/src/ChangeLog.11
index 77180262ac..8517e5cc3c 100644
--- a/src/ChangeLog.11
+++ b/src/ChangeLog.11
@@ -3294,7 +3294,7 @@
 2010-10-09  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
        * gnutls.c (syms_of_gnutls): All the bootprops are keywords.
-       (emacs_gnutls_write): Remove the debuggin fsync call.
+       (emacs_gnutls_write): Remove the debugging fsync call.
        (emacs_gnutls_read): Return -1 if we got an error from
        gnutls_read.  This allows us to actually read lots of data from
        the GnuTLS stream.
diff --git a/src/treesit.c b/src/treesit.c
index 974d2fc451..e87bfc3429 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -632,7 +632,7 @@ treesit_load_language (Lisp_Object language_symbol,
   return lang;
 }
 
-DEFUN ("treesit-language-available-p", Ftreesit_langauge_available_p,
+DEFUN ("treesit-language-available-p", Ftreesit_language_available_p,
        Streesit_language_available_p,
        1, 2, 0,
        doc: /* Return non-nil if LANGUAGE exists and is loadable.
@@ -679,14 +679,14 @@ is non-nil, return the oldest compatible ABI version.  */)
     return make_fixnum (TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION);
 }
 
-DEFUN ("treesit-language-version", Ftreesit_language_abi_version,
+DEFUN ("treesit-language-abi-version", Ftreesit_language_abi_version,
        Streesit_language_abi_version,
        0, 1, 0,
-       doc: /* Return the language ABI version of the tree-sitter LANGUAGE.
-Return nil if LANGUAGE is not available.  */)
+       doc: /* Return the ABI version of the tree-sitter grammar for LANGUAGE.
+Return nil if a grammar library for LANGUAGE is not available.  */)
   (Lisp_Object language)
 {
-  if (NILP (Ftreesit_langauge_available_p (language, Qnil)))
+  if (NILP (Ftreesit_language_available_p (language, Qnil)))
     return Qnil;
   else
     {
diff --git a/test/lisp/emacs-lisp/shortdoc-tests.el 
b/test/lisp/emacs-lisp/shortdoc-tests.el
index 8515b9fdfb..3938902fa7 100644
--- a/test/lisp/emacs-lisp/shortdoc-tests.el
+++ b/test/lisp/emacs-lisp/shortdoc-tests.el
@@ -21,6 +21,7 @@
 
 (require 'ert)
 (require 'shortdoc)
+(require 'subr-x) ; `string-pad' in shortdoc group needed at run time
 
 (defun shortdoc-tests--tree-contains (tree fun)
   "Whether TREE contains a call to FUN."
@@ -44,6 +45,14 @@
                 (should (shortdoc-tests--tree-contains expr fun))))
             (setq props (cddr props))))))))
 
+(ert-deftest shortdoc-all-functions-fboundp ()
+  "Check that all functions listed in shortdoc groups are `fboundp'."
+  (dolist (group shortdoc--groups)
+    (dolist (item group)
+      (when (consp item)
+        (let ((fun (car item)))
+          (should (fboundp fun)))))))
+
 (ert-deftest shortdoc-all-groups-work ()
   "Test that all defined shortdoc groups display correctly."
   (dolist (group (mapcar (lambda (x) (car x)) shortdoc--groups))
diff --git a/test/lisp/progmodes/python-tests.el 
b/test/lisp/progmodes/python-tests.el
index 17d6d8aa70..930234a12f 100644
--- a/test/lisp/progmodes/python-tests.el
+++ b/test/lisp/progmodes/python-tests.el
@@ -4456,6 +4456,70 @@ def foo():
                      (point-max))
                     "# -*- coding: utf-8 -*-\n\nif True:\n        # 
Whitespace\n\n    print ('a')\n\n"))))
 
+(ert-deftest python-shell-buffer-substring-13 ()
+  "Check substring from indented single statement."
+  (python-tests-with-temp-buffer
+   "
+def foo():
+    a = 1
+"
+   (should (string= (python-shell-buffer-substring
+                     (python-tests-look-at "a = 1")
+                     (pos-eol))
+                    "# -*- coding: utf-8 -*-\n\na = 1"))))
+
+(ert-deftest python-shell-buffer-substring-14 ()
+  "Check substring from indented single statement spanning multiple lines."
+  (python-tests-with-temp-buffer
+   "
+def foo():
+    a = \"\"\"Some
+    string\"\"\"
+"
+   (should (string= (python-shell-buffer-substring
+                     (python-tests-look-at "a = \"\"\"Some")
+                     (pos-eol 2))
+                    "# -*- coding: utf-8 -*-\n\na = \"\"\"Some\n    
string\"\"\""))))
+
+(ert-deftest python-shell-buffer-substring-15 ()
+  "Check substring from partial statement."
+  (python-tests-with-temp-buffer
+   "
+def foo():
+    a = 1
+"
+   (should (string= (python-shell-buffer-substring
+                     (python-tests-look-at "    a = 1")
+                     (python-tests-look-at " = 1"))
+                    "# -*- coding: utf-8 -*-\n\na"))))
+
+(ert-deftest python-shell-buffer-substring-16 ()
+  "Check substring from partial statement."
+  (python-tests-with-temp-buffer
+   "
+def foo():
+    a = 1
+"
+   (should (string= (python-shell-buffer-substring
+                     (python-tests-look-at "1")
+                     (1+ (point)))
+                    "# -*- coding: utf-8 -*-\n\n1"))))
+
+(ert-deftest python-shell-buffer-substring-17 ()
+  "Check substring from multiline string."
+  (python-tests-with-temp-buffer
+   "
+def foo():
+    s = \"\"\"
+    a = 1
+    b = 2
+\"\"\"
+"
+   (should (string= (python-shell-buffer-substring
+                     (python-tests-look-at "a = 1")
+                     (python-tests-look-at "\"\"\""))
+                    "# -*- coding: utf-8 -*-\n\nif True:\n    a = 1\n    b = 
2\n\n"))))
+
 
 
 ;;; Shell completion



reply via email to

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