Merge from origin/emacs-29

613de66281 Rename the newly added -ref- faces to -use-
f601e9666d Eglot: support multiple labels in same inlay hint
4a5eda7ed2 Eglot: don't paint hints outside requested region (bug#61...
11c1aa1eb1 ; * doc/misc/gnus.texi: Fix last change.
44949c292f ; Add `nnimap-user' to Gnus manual
6c7078c66f ; * lisp/progmodes/c-ts-mode.el (treesit-node-prev-siblin...
3d0a6c9baa Eglot: protect against unintended field text motion (bug#...
647e40f4a0 ; And yet another fix to eglot-current-linepos-function's...
9d0f856a16 Fix description of 'desktop-save-mode'
aee10ca1cb Adjust tree-sitter defun navigation (bug#61617)
edf5b97686 Simplify c-ts-mode--top-level-label-matcher
0f15286c53 New tree-sitter indent anchor standalone-parent used by c...

# Conflicts:
#	etc/NEWS
This commit is contained in:
Stefan Kangas 2023-02-28 06:30:13 +01:00
commit c5d319af47
23 changed files with 270 additions and 172 deletions

View file

@ -2745,10 +2745,12 @@ desktop reloading, since it bypasses the init file, where
@findex desktop-revert
You can have separate saved desktop configurations in different
directories; starting Emacs from a directory where you have a saved
desktop configuration will restore that configuration. You can save
the current desktop and reload the one saved in another directory by
typing @kbd{M-x desktop-change-dir}. Typing @kbd{M-x desktop-revert}
reverts to the previously reloaded desktop.
desktop configuration will restore that configuration, provided that
you customize @code{desktop-path} to prepend @file{.} (the current
directory) to the other directories there. You can save the current
desktop and reload the one saved in another directory by typing
@kbd{M-x desktop-change-dir}. Typing @kbd{M-x desktop-revert} reverts
to the previously reloaded desktop.
@vindex desktop-load-locked-desktop
The file in which Emacs saves the desktop is locked while the

View file

@ -3688,8 +3688,8 @@ default, from @code{font-lock-function-name-face}.
@vindex font-lock-variable-name-face
for the name of a variable being defined or declared.
@item font-lock-variable-ref-face
@vindex font-lock-variable-ref-face
@item font-lock-variable-use-face
@vindex font-lock-variable-use-face
for the name of a variable being referenced. This face inherits, by
default, from @code{font-lock-variable-name-face}.
@ -3772,8 +3772,8 @@ for properties of an object, such as the declaration of fields in a
struct. This face inherits, by default, from
@code{font-lock-variable-name-face}.
@item font-lock-property-ref-face
@vindex font-lock-property-ref-face
@item font-lock-property-use-face
@vindex font-lock-property-use-face
for properties of an object, such as use of fields in a struct. This
face inherits, by default, from @code{font-lock-property-name-face}.
@ -5093,7 +5093,15 @@ This anchor is a function that is called with 3 arguments: @var{node},
@item parent-bol
This anchor is a function that is called with 3 arguments: @var{node},
@var{parent}, and @var{bol}, and returns the first non-space character
on the line of @var{parent}.
on the line which @var{parent}'s start is on.
@item parent-bol
This anchor is a function that is called with 3 arguments: @var{node},
@var{parent}, and @var{bol}. It finds the first ancestor node
(parent, grandparent, etc) of @var{node} that starts on its own line,
and return the start of that node. ``Starting on its own line'' means
there is only whitespace character before the node on the line which
the node's start is on.
@item prev-sibling
This anchor is a function that is called with 3 arguments: @var{node},

View file

@ -14509,13 +14509,23 @@ Here's an example method that's more complex:
@end example
@table @code
@vindex nnimap-address
@item nnimap-address
The address of the server, like @samp{imap.gmail.com}.
@vindex nnimap-user
@item nnimap-user
Username to use for authentication to the @acronym{IMAP} server. This
corresponds to the value of the @samp{login} token in your
@file{~/.authinfo} file. Set this variable if you want to access
multiple accounts from the same @acronym{IMAP} server.
@vindex nnimap-server-port
@item nnimap-server-port
If the server uses a non-standard port, that can be specified here. A
typical port would be @code{"imap"} or @code{"imaps"}.
@vindex nnimap-stream
@item nnimap-stream
How @code{nnimap} should connect to the server. Possible values are:
@ -14546,6 +14556,7 @@ Non-encrypted and unsafe straight socket connection.
@end table
@vindex nnimap-authenticator
@item nnimap-authenticator
Some @acronym{IMAP} servers allow anonymous logins. In that case,
this should be set to @code{anonymous}. If this variable isn't set,
@ -14555,6 +14566,7 @@ specific login method to be used, you can set this variable to either
@code{plain}, @code{cram-md5} or @code{xoauth2}. (The latter method
requires using the @file{oauth2.el} library.)
@vindex nnimap-expunge
@item nnimap-expunge
When to expunge deleted messages. If @code{never}, deleted articles
are marked with the IMAP @code{\\Delete} flag but not automatically
@ -14570,27 +14582,32 @@ EXPUNGE nil is equivalent to @code{never}, while t will immediately
expunge ALL articles that are currently flagged as deleted
(i.e., potentially not only the article that was just deleted).
@vindex nnimap-streaming
@item nnimap-streaming
Virtually all @acronym{IMAP} server support fast streaming of data.
If you have problems connecting to the server, try setting this to
@code{nil}.
@vindex nnimap-fetch-partial-articles
@item nnimap-fetch-partial-articles
If non-@code{nil}, fetch partial articles from the server. If set to
a string, then it's interpreted as a regexp, and parts that have
matching types will be fetched. For instance, @samp{"text/"} will
fetch all textual parts, while leaving the rest on the server.
@vindex nnimap-record-commands
@item nnimap-record-commands
If non-@code{nil}, record all @acronym{IMAP} commands in the
@samp{"*imap log*"} buffer.
@vindex nnimap-use-namespaces
@item nnimap-use-namespaces
If non-@code{nil}, omit the IMAP namespace prefix in nnimap group
names. If your IMAP mailboxes are called something like @samp{INBOX}
and @samp{INBOX.Lists.emacs}, but you'd like the nnimap group names to
be @samp{INBOX} and @samp{Lists.emacs}, you should enable this option.
@vindex nnimap-keepalive-intervals
@item nnimap-keepalive-intervals
By default, nnimap will send occasional @samp{NOOP} (keepalive)
commands to the server, to keep the connection alive. This option

View file

@ -832,8 +832,8 @@ These faces are primarily meant for use with tree-sitter. They are:
'font-lock-escape-face', 'font-lock-function-call-face',
'font-lock-misc-punctuation-face', 'font-lock-number-face',
'font-lock-operator-face', 'font-lock-property-name-face',
'font-lock-property-ref-face', 'font-lock-punctuation-face',
'font-lock-regexp-face', and 'font-lock-variable-ref-face'.
'font-lock-property-use-face', 'font-lock-punctuation-face',
'font-lock-regexp-face', and 'font-lock-variable-use-face'.
+++
** New face 'variable-pitch-text'.

View file

@ -73,11 +73,11 @@ Do not call this mode function yourself. It is meant for internal use."
font-lock-keyword-face font-lock-negation-char-face
font-lock-number-face font-lock-misc-punctuation-face
font-lock-operator-face font-lock-preprocessor-face
font-lock-property-name-face font-lock-property-ref-face
font-lock-property-name-face font-lock-property-use-face
font-lock-punctuation-face
font-lock-regexp-grouping-backslash font-lock-regexp-grouping-construct
font-lock-string-face font-lock-type-face font-lock-variable-name-face
font-lock-variable-ref-face
font-lock-variable-use-face
font-lock-warning-face button link link-visited fringe
header-line tooltip mode-line mode-line-buffer-id
mode-line-emphasis mode-line-highlight mode-line-inactive

View file

@ -2046,7 +2046,7 @@ as the constructs of Haddock, Javadoc and similar systems."
"Font Lock mode face used to highlight variable names."
:group 'font-lock-faces)
(defface font-lock-variable-ref-face
(defface font-lock-variable-use-face
'((t :inherit font-lock-variable-name-face))
"Font Lock mode face used to highlight variable references."
:group 'font-lock-faces
@ -2134,7 +2134,7 @@ For example, the declaration of fields in a struct."
:group 'font-lock-faces
:version "29.1")
(defface font-lock-property-ref-face
(defface font-lock-property-use-face
'((t :inherit font-lock-property-name-face))
"Font Lock mode face used to highlight property references.
For example, property lookup of fields in a struct."

View file

@ -77,6 +77,7 @@
(declare-function treesit-node-child "treesit.c")
(declare-function treesit-node-child-by-field-name "treesit.c")
(declare-function treesit-node-type "treesit.c")
(declare-function treesit-node-prev-sibling "treesit.c")
;;; Custom variables
@ -279,6 +280,12 @@ doesn't have a child."
;; prev-sibling doesn't have a child.
(treesit-node-start prev-sibling)))
(defun c-ts-mode--standalone-grandparent (_node parent bol &rest args)
"Like the standalone-parent anchor but pass it the grandparent.
PARENT, BOL, ARGS are the same as other anchor functions."
(apply (alist-get 'standalone-parent treesit-simple-indent-presets)
parent (treesit-node-parent parent) bol args))
(defun c-ts-mode--indent-styles (mode)
"Indent rules supported by `c-ts-mode'.
MODE is either `c' or `cpp'."
@ -300,9 +307,9 @@ MODE is either `c' or `cpp'."
((parent-is "comment") prev-adaptive-prefix 0)
;; Labels.
((node-is "labeled_statement") parent-bol 0)
((node-is "labeled_statement") standalone-parent 0)
((parent-is "labeled_statement")
point-min c-ts-common-statement-offset)
c-ts-mode--standalone-grandparent c-ts-mode-indent-offset)
((node-is "preproc") point-min 0)
((node-is "#endif") point-min 0)
@ -330,7 +337,7 @@ MODE is either `c' or `cpp'."
;; Closing bracket. This should be before initializer_list
;; (and probably others) rule because that rule (and other
;; similar rules) will match the closing bracket. (Bug#61398)
((node-is "}") point-min c-ts-common-statement-offset)
((node-is "}") standalone-parent 0)
,@(when (eq mode 'cpp)
'(((node-is "access_specifier") parent-bol 0)
;; Indent the body of namespace definitions.
@ -341,25 +348,25 @@ MODE is either `c' or `cpp'."
((match nil "initializer_list" nil 1 1) parent-bol c-ts-mode-indent-offset)
((match nil "initializer_list" nil 2) c-ts-mode--anchor-prev-sibling 0)
;; Statement in enum.
((match nil "enumerator_list" nil 1 1) point-min c-ts-common-statement-offset)
((match nil "enumerator_list" nil 1 1) standalone-parent c-ts-mode-indent-offset)
((match nil "enumerator_list" nil 2) c-ts-mode--anchor-prev-sibling 0)
;; Statement in struct and union.
((match nil "field_declaration_list" nil 1 1) point-min c-ts-common-statement-offset)
((match nil "field_declaration_list" nil 1 1) standalone-parent c-ts-mode-indent-offset)
((match nil "field_declaration_list" nil 2) c-ts-mode--anchor-prev-sibling 0)
;; Statement in {} blocks.
((match nil "compound_statement" nil 1 1) point-min c-ts-common-statement-offset)
((match nil "compound_statement" nil 1 1) standalone-parent c-ts-mode-indent-offset)
((match nil "compound_statement" nil 2) c-ts-mode--anchor-prev-sibling 0)
;; Opening bracket.
((node-is "compound_statement") point-min c-ts-common-statement-offset)
((node-is "compound_statement") standalone-parent c-ts-mode-indent-offset)
;; Bug#61291.
((match "expression_statement" nil "body") point-min c-ts-common-statement-offset)
((match "expression_statement" nil "body") standalone-parent c-ts-mode-indent-offset)
;; These rules are for cases where the body is bracketless.
;; Tested by the "Bracketless Simple Statement" test.
((parent-is "if_statement") point-min c-ts-common-statement-offset)
((parent-is "for_statement") point-min c-ts-common-statement-offset)
((parent-is "while_statement") point-min c-ts-common-statement-offset)
((parent-is "do_statement") point-min c-ts-common-statement-offset)
((parent-is "if_statement") standalone-parent c-ts-mode-indent-offset)
((parent-is "for_statement") standalone-parent c-ts-mode-indent-offset)
((parent-is "while_statement") standalone-parent c-ts-mode-indent-offset)
((parent-is "do_statement") standalone-parent c-ts-mode-indent-offset)
,@(when (eq mode 'cpp)
`(((node-is "field_initializer_list") parent-bol ,(* c-ts-mode-indent-offset 2)))))))
@ -388,16 +395,13 @@ MODE is either `c' or `cpp'."
((parent-is "do_statement") parent-bol 0)
,@common))))
(defun c-ts-mode--top-level-label-matcher (node &rest _)
(defun c-ts-mode--top-level-label-matcher (node parent &rest _)
"A matcher that matches a top-level label.
NODE should be a labeled_statement."
(let ((func (treesit-parent-until
node (lambda (n)
(equal (treesit-node-type n)
"compound_statement")))))
(and (equal (treesit-node-type node)
"labeled_statement")
(not (treesit-node-top-level func "compound_statement")))))
NODE should be a labeled_statement. PARENT is its parent."
(and (equal (treesit-node-type node)
"labeled_statement")
(equal "function_definition"
(treesit-node-type (treesit-node-parent parent)))))
;;; Font-lock
@ -543,7 +547,7 @@ MODE is either `c' or `cpp'."
'((assignment_expression
left: (identifier) @font-lock-variable-name-face)
(assignment_expression
left: (field_expression field: (_) @font-lock-property-ref-face))
left: (field_expression field: (_) @font-lock-property-use-face))
(assignment_expression
left: (pointer_expression
(identifier) @font-lock-variable-name-face))
@ -579,7 +583,7 @@ MODE is either `c' or `cpp'."
:language mode
:feature 'property
'((field_identifier) @font-lock-property-ref-face)
'((field_identifier) @font-lock-property-use-face)
:language mode
:feature 'bracket
@ -656,7 +660,7 @@ OVERRIDE, START, END, and ARGS, see `treesit-font-lock-rules'."
"call_expression"))
(treesit-fontify-with-override
(treesit-node-start node) (treesit-node-end node)
'font-lock-variable-ref-face override start end)))
'font-lock-variable-use-face override start end)))
(defun c-ts-mode--fontify-defun (node override start end &rest _)
"Correctly fontify the DEFUN macro.
@ -867,6 +871,8 @@ the semicolon. This function skips the semicolon."
(when (eq c-ts-mode-indent-style 'linux)
(setq-local indent-tabs-mode t))
(setq-local c-ts-common-indent-offset 'c-ts-mode-indent-offset)
;; This setup is not needed anymore, but we might find uses for it
;; later, so I'm keeping it.
(setq-local c-ts-common-indent-type-regexp-alist
`((block . ,(rx (or "compound_statement"
"field_declaration_list"

View file

@ -154,7 +154,7 @@
:language 'cmake
:feature 'variable
:override t
'((variable) @font-lock-variable-ref-face)
'((variable) @font-lock-variable-use-face)
:language 'cmake
:feature 'error

View file

@ -708,9 +708,9 @@ compilation and evaluation time conflicts."
(treesit-font-lock-rules
:language 'c-sharp
:feature 'expression
'((conditional_expression (identifier) @font-lock-variable-ref-face)
(postfix_unary_expression (identifier)* @font-lock-variable-ref-face)
(initializer_expression (assignment_expression left: (identifier) @font-lock-variable-ref-face)))
'((conditional_expression (identifier) @font-lock-variable-use-face)
(postfix_unary_expression (identifier)* @font-lock-variable-use-face)
(initializer_expression (assignment_expression left: (identifier) @font-lock-variable-use-face)))
:language 'c-sharp
:feature 'bracket
@ -739,8 +739,8 @@ compilation and evaluation time conflicts."
:language 'c-sharp
:override t
:feature 'property
`((attribute (identifier) @font-lock-property-ref-face (attribute_argument_list))
(attribute (identifier) @font-lock-property-ref-face))
`((attribute (identifier) @font-lock-property-use-face (attribute_argument_list))
(attribute (identifier) @font-lock-property-use-face))
:language 'c-sharp
:override t
@ -878,23 +878,23 @@ compilation and evaluation time conflicts."
:override t
'((if_directive
"if" @font-lock-preprocessor-face
(identifier) @font-lock-variable-ref-face)
(identifier) @font-lock-variable-use-face)
(elif_directive
"elif" @font-lock-preprocessor-face
(identifier) @font-lock-variable-ref-face)
(identifier) @font-lock-variable-use-face)
(else_directive) @font-lock-preprocessor-face
(endif_directive) @font-lock-preprocessor-face
(define_directive
"define" @font-lock-preprocessor-face
(identifier) @font-lock-variable-ref-face)
(identifier) @font-lock-variable-use-face)
(nullable_directive) @font-lock-preprocessor-face
(pragma_directive) @font-lock-preprocessor-face
(region_directive) @font-lock-preprocessor-face
(endregion_directive) @font-lock-preprocessor-face
(region_directive
(preproc_message) @font-lock-variable-ref-face)
(preproc_message) @font-lock-variable-use-face)
(endregion_directive
(preproc_message) @font-lock-variable-ref-face))))
(preproc_message) @font-lock-variable-use-face))))
;;;###autoload
(add-to-list 'auto-mode-alist '("\\.cs\\'" . csharp-mode))

View file

@ -486,7 +486,8 @@ This can be useful when using docker to run a language server.")
(WorkspaceEdit () (:changes :documentChanges))
(WorkspaceSymbol (:name :kind) (:containerName :location :data))
(InlayHint (:position :label) (:kind :textEdits :tooltip :paddingLeft
:paddingRight :data)))
:paddingRight :data))
(InlayHintLabelPart (:value) (:tooltip :location :command)))
"Alist (INTERFACE-NAME . INTERFACE) of known external LSP interfaces.
INTERFACE-NAME is a symbol designated by the spec as
@ -641,7 +642,7 @@ Honor `eglot-strict-mode'."
Honor `eglot-strict-mode'."
(declare (indent 1) (debug (sexp &rest form)))
(let ((e (cl-gensym "jsonrpc-lambda-elem")))
`(lambda (,e) (eglot--dbind ,cl-lambda-list ,e ,@body))))
`(lambda (,e) (cl-block nil (eglot--dbind ,cl-lambda-list ,e ,@body)))))
(cl-defmacro eglot--dcase (obj &rest clauses)
"Like `pcase', but for the LSP object OBJ.
@ -1440,6 +1441,12 @@ CONNECT-ARGS are passed as additional arguments to
(let ((warning-minimum-level :error))
(display-warning 'eglot (apply #'format format args) :warning)))
(defalias 'eglot--bol
(if (fboundp 'pos-bol) #'pos-bol
(lambda (&optional n) (let ((inhibit-field-text-motion t))
(line-beginning-position n))))
"Return position of first character in current line.")
;;; Encoding fever
;;;
@ -1453,21 +1460,24 @@ CONNECT-ARGS are passed as additional arguments to
(defvar eglot-current-linepos-function #'eglot-utf-16-linepos
"Function calculating position relative to line beginning.
This is the inverse of `eglot-move-to-linepos-function' (which see).
It is a function of no arguments returning the number of code units
or bytes or codepoints corresponding to the current position of point,
relative to line beginning, as expected by the function that is the
value of `eglot-move-to-linepos-function'.")
It is a function of no arguments considering the text from line
beginning up to current point. The return value is the number of
UTF code units needed to encode that text from the LSP server's
perspective. This may be a number of octets, 16-bit words or
Unicode code points, depending on whether the LSP server's
`positionEncoding' capability is UTF-8, UTF-16 or UTF-32,
respectively. Position of point should remain unaltered if that
return value is fed through the corresponding inverse function
`eglot-move-to-linepos-function' (which see).")
(defun eglot-utf-8-linepos ()
"Calculate number of UTF-8 bytes from line beginning."
(length (encode-coding-region (line-beginning-position) (point)
'utf-8-unix t)))
(length (encode-coding-region (eglot--bol) (point) 'utf-8-unix t)))
(defun eglot-utf-16-linepos (&optional lbp)
"Calculate number of UTF-16 code units from position given by LBP.
LBP defaults to `line-beginning-position'."
(/ (- (length (encode-coding-region (or lbp (line-beginning-position))
LBP defaults to `eglot--bol'."
(/ (- (length (encode-coding-region (or lbp (eglot--bol))
;; Fix github#860
(min (point) (point-max)) 'utf-16 t))
2)
@ -1475,7 +1485,7 @@ LBP defaults to `line-beginning-position'."
(defun eglot-utf-32-linepos ()
"Calculate number of Unicode codepoints from line beginning."
(- (point) (line-beginning-position)))
(- (point) (eglot--bol)))
(defun eglot--pos-to-lsp-position (&optional pos)
"Convert point POS to LSP position."
@ -1509,7 +1519,7 @@ encoding and Eglot will set this variable automatically.")
(defun eglot-move-to-utf-8-linepos (n)
"Move to line's Nth byte as computed by LSP's UTF-8 criterion."
(let* ((bol (line-beginning-position))
(let* ((bol (eglot--bol))
(goal-byte (+ (position-bytes bol) n))
(eol (line-end-position)))
(goto-char bol)
@ -1520,7 +1530,7 @@ encoding and Eglot will set this variable automatically.")
(defun eglot-move-to-utf-16-linepos (n)
"Move to line's Nth code unit as computed by LSP's UTF-16 criterion."
(let* ((bol (line-beginning-position))
(let* ((bol (eglot--bol))
(goal-char (+ bol n))
(eol (line-end-position)))
(goto-char bol)
@ -1535,8 +1545,7 @@ encoding and Eglot will set this variable automatically.")
;; columns, which can be different from LSP characters in case of
;; `whitespace-mode', `prettify-symbols-mode', etc. (github#296,
;; github#297)
(goto-char (min (+ (line-beginning-position) n)
(line-end-position))))
(goto-char (min (+ (eglot--bol) n) (line-end-position))))
(defun eglot--lsp-position-to-point (pos-plist &optional marker)
"Convert LSP position POS-PLIST to Emacs point.
@ -2186,7 +2195,7 @@ COMMAND is a symbol naming the command."
(eglot--widening
(goto-char (point-min))
(setq beg
(line-beginning-position
(eglot--bol
(1+ (plist-get (plist-get range :start) :line))))
(setq end
(line-end-position
@ -2626,7 +2635,7 @@ Try to visit the target file for a richer summary line."
(collect (lambda ()
(eglot--widening
(pcase-let* ((`(,beg . ,end) (eglot--range-region range))
(bol (progn (goto-char beg) (line-beginning-position)))
(bol (progn (goto-char beg) (eglot--bol)))
(substring (buffer-substring bol (line-end-position)))
(hi-beg (- beg bol))
(hi-end (- (min (line-end-position) end) bol)))
@ -2977,7 +2986,7 @@ for which LSP on-type-formatting should be requested."
(looking-back
(regexp-opt
(cl-coerce (cl-getf completion-capability :triggerCharacters) 'list))
(line-beginning-position))))
(eglot--bol))))
:exit-function
(lambda (proxy status)
(when (memq status '(finished exact))
@ -3587,20 +3596,30 @@ If NOERROR, return predicate, else erroring function."
(paint-hint
(eglot--lambda ((InlayHint) position kind label paddingLeft paddingRight)
(goto-char (eglot--lsp-position-to-point position))
(let ((ov (make-overlay (point) (point)))
(left-pad (and paddingLeft (not (memq (char-before) '(32 9)))))
(right-pad (and paddingRight (not (memq (char-after) '(32 9)))))
(text (if (stringp label)
label (plist-get (elt label 0) :value))))
(overlay-put ov 'before-string
(propertize
(concat (and left-pad " ") text (and right-pad " "))
'face (pcase kind
(1 'eglot-type-hint-face)
(2 'eglot-parameter-hint-face)
(_ 'eglot-inlay-hint-face))))
(overlay-put ov 'eglot--inlay-hint t)
(overlay-put ov 'eglot--overlay t)))))
(when (or (> (point) to) (< (point) from)) (cl-return))
(let ((left-pad (and paddingLeft
(not (memq (char-before) '(32 9))) " "))
(right-pad (and paddingRight
(not (memq (char-after) '(32 9))) " ")))
(cl-flet
((do-it (text lpad rpad)
(let ((ov (make-overlay (point) (point))))
(overlay-put ov 'before-string
(propertize
(concat lpad text rpad)
'face (pcase kind
(1 'eglot-type-hint-face)
(2 'eglot-parameter-hint-face)
(_ 'eglot-inlay-hint-face))))
(overlay-put ov 'eglot--inlay-hint t)
(overlay-put ov 'eglot--overlay t))))
(if (stringp label) (do-it label left-pad right-pad)
(cl-loop
for i from 0 for ldetail across label
do (eglot--dbind ((InlayHintLabelPart) value) ldetail
(do-it value
(and (zerop i) left-pad)
(and (= i (1- (length label))) right-pad))))))))))
(jsonrpc-async-request
(eglot--current-server-or-lose)
:textDocument/inlayHint

View file

@ -178,12 +178,12 @@
:language 'go
:feature 'property
'((selector_expression field: (field_identifier) @font-lock-property-ref-face)
(keyed_element (_ (identifier) @font-lock-property-ref-face)))
'((selector_expression field: (field_identifier) @font-lock-property-use-face)
(keyed_element (_ (identifier) @font-lock-property-use-face)))
:language 'go
:feature 'variable
'((identifier) @font-lock-variable-ref-face)
'((identifier) @font-lock-variable-use-face)
:language 'go
:feature 'escape-sequence

View file

@ -244,7 +244,7 @@
name: (identifier) @font-lock-variable-name-face)
(element_value_pair
key: (identifier) @font-lock-property-ref-face)
key: (identifier) @font-lock-property-use-face)
(formal_parameter
name: (identifier) @font-lock-variable-name-face)
@ -255,14 +255,14 @@
:override t
:feature 'expression
'((method_invocation
object: (identifier) @font-lock-variable-ref-face)
object: (identifier) @font-lock-variable-use-face)
(method_invocation
name: (identifier) @font-lock-function-call-face)
(argument_list (identifier) @font-lock-variable-name-face)
(expression_statement (identifier) @font-lock-variable-ref-face))
(expression_statement (identifier) @font-lock-variable-use-face))
:language 'java
:feature 'bracket

View file

@ -3563,13 +3563,13 @@ This function is intended for use in `after-change-functions'."
:language 'javascript
:feature 'property
'(((property_identifier) @font-lock-property-ref-face
'(((property_identifier) @font-lock-property-use-face
(:pred js--treesit-property-not-function-p
@font-lock-property-ref-face))
@font-lock-property-use-face))
(pair value: (identifier) @font-lock-variable-ref-face)
(pair value: (identifier) @font-lock-variable-use-face)
((shorthand_property_identifier) @font-lock-property-ref-face))
((shorthand_property_identifier) @font-lock-property-use-face))
:language 'javascript
:feature 'assignment
@ -3681,8 +3681,8 @@ For OVERRIDE, START, END, see `treesit-font-lock-rules'."
(treesit-fontify-with-override
(treesit-node-start node) (treesit-node-end node)
(pcase (treesit-node-type node)
("identifier" 'font-lock-variable-ref-face)
("property_identifier" 'font-lock-property-ref-face))
("identifier" 'font-lock-variable-use-face)
("property_identifier" 'font-lock-property-use-face))
override start end)))
(defun js--treesit-defun-name (node)

View file

@ -101,7 +101,7 @@
:language 'json
:feature 'pair
:override t ; Needed for overriding string face on keys.
'((pair key: (_) @font-lock-property-ref-face))
'((pair key: (_) @font-lock-property-use-face))
:language 'json
:feature 'error
:override t

View file

@ -1147,7 +1147,7 @@ fontified."
@font-lock-variable-name-face)
(assignment left: (attribute
attribute: (identifier)
@font-lock-property-ref-face))
@font-lock-property-use-face))
(pattern_list (identifier)
@font-lock-variable-name-face)
(tuple_pattern (identifier)
@ -1184,12 +1184,12 @@ fontified."
:feature 'property
:language 'python
'((attribute
attribute: (identifier) @font-lock-property-ref-face)
attribute: (identifier) @font-lock-property-use-face)
(class_definition
body: (block
(expression_statement
(assignment left:
(identifier) @font-lock-property-ref-face)))))
(identifier) @font-lock-property-use-face)))))
:feature 'operator
:language 'python

View file

@ -292,11 +292,11 @@ values of OVERRIDE"
:language language
:feature 'global
'((global_variable) @font-lock-variable-ref-face)
'((global_variable) @font-lock-variable-use-face)
:language language
:feature 'instance
'((instance_variable) @font-lock-variable-ref-face)
'((instance_variable) @font-lock-variable-use-face)
:language language
:feature 'method-definition

View file

@ -239,8 +239,8 @@
:language 'rust
:feature 'property
'((field_identifier) @font-lock-property-ref-face
(shorthand_field_initializer (identifier) @font-lock-property-ref-face))
'((field_identifier) @font-lock-property-use-face
(shorthand_field_initializer (identifier) @font-lock-property-use-face))
;; Must be under type, otherwise some imports can be highlighted as constants.
:language 'rust
@ -251,25 +251,25 @@
:language 'rust
:feature 'variable
'((arguments (identifier) @font-lock-variable-ref-face)
(array_expression (identifier) @font-lock-variable-ref-face)
(assignment_expression right: (identifier) @font-lock-variable-ref-face)
(binary_expression left: (identifier) @font-lock-variable-ref-face)
(binary_expression right: (identifier) @font-lock-variable-ref-face)
(block (identifier) @font-lock-variable-ref-face)
(compound_assignment_expr right: (identifier) @font-lock-variable-ref-face)
(field_expression value: (identifier) @font-lock-variable-ref-face)
(field_initializer value: (identifier) @font-lock-variable-ref-face)
(if_expression condition: (identifier) @font-lock-variable-ref-face)
(let_condition value: (identifier) @font-lock-variable-ref-face)
(let_declaration value: (identifier) @font-lock-variable-ref-face)
(match_arm value: (identifier) @font-lock-variable-ref-face)
(match_expression value: (identifier) @font-lock-variable-ref-face)
(reference_expression value: (identifier) @font-lock-variable-ref-face)
(return_expression (identifier) @font-lock-variable-ref-face)
(tuple_expression (identifier) @font-lock-variable-ref-face)
(unary_expression (identifier) @font-lock-variable-ref-face)
(while_expression condition: (identifier) @font-lock-variable-ref-face))
'((arguments (identifier) @font-lock-variable-use-face)
(array_expression (identifier) @font-lock-variable-use-face)
(assignment_expression right: (identifier) @font-lock-variable-use-face)
(binary_expression left: (identifier) @font-lock-variable-use-face)
(binary_expression right: (identifier) @font-lock-variable-use-face)
(block (identifier) @font-lock-variable-use-face)
(compound_assignment_expr right: (identifier) @font-lock-variable-use-face)
(field_expression value: (identifier) @font-lock-variable-use-face)
(field_initializer value: (identifier) @font-lock-variable-use-face)
(if_expression condition: (identifier) @font-lock-variable-use-face)
(let_condition value: (identifier) @font-lock-variable-use-face)
(let_declaration value: (identifier) @font-lock-variable-use-face)
(match_arm value: (identifier) @font-lock-variable-use-face)
(match_expression value: (identifier) @font-lock-variable-use-face)
(reference_expression value: (identifier) @font-lock-variable-use-face)
(return_expression (identifier) @font-lock-variable-use-face)
(tuple_expression (identifier) @font-lock-variable-use-face)
(unary_expression (identifier) @font-lock-variable-use-face)
(while_expression condition: (identifier) @font-lock-variable-use-face))
:language 'rust
:feature 'escape-sequence

View file

@ -249,9 +249,9 @@ Argument LANGUAGE is either `typescript' or `tsx'."
(public_field_definition
name: (property_identifier) @font-lock-property-name-face)
(pair key: (property_identifier) @font-lock-property-ref-face)
(pair key: (property_identifier) @font-lock-property-use-face)
((shorthand_property_identifier) @font-lock-property-ref-face))
((shorthand_property_identifier) @font-lock-property-use-face))
:language language
:feature 'expression
@ -272,7 +272,7 @@ Argument LANGUAGE is either `typescript' or `tsx'."
:language language
:feature 'pattern
`((pair_pattern
key: (property_identifier) @font-lock-property-ref-face
key: (property_identifier) @font-lock-property-use-face
value: [(identifier) @font-lock-variable-name-face
(assignment_pattern left: (identifier) @font-lock-variable-name-face)])

View file

@ -1399,8 +1399,8 @@ for determining whether point is within a selector."
:feature 'query
:language 'css
'((keyword_query) @font-lock-property-ref-face
(feature_name) @font-lock-property-ref-face)
'((keyword_query) @font-lock-property-use-face
(feature_name) @font-lock-property-use-face)
:feature 'bracket
:language 'css

View file

@ -92,8 +92,8 @@
:language 'toml
:feature 'pair
:override t ; Needed for overriding string face on keys.
'((bare_key) @font-lock-property-ref-face
(quoted_key) @font-lock-property-ref-face
'((bare_key) @font-lock-property-use-face
(quoted_key) @font-lock-property-use-face
(table ("[" @font-lock-bracket-face
(_) @font-lock-type-face
"]" @font-lock-bracket-face))

View file

@ -94,22 +94,22 @@
:feature 'property
:override t
'((block_mapping_pair
key: (flow_node (plain_scalar (string_scalar) @font-lock-property-ref-face)))
key: (flow_node (plain_scalar (string_scalar) @font-lock-property-use-face)))
(block_mapping_pair
key: (flow_node
[(double_quote_scalar) (single_quote_scalar)] @font-lock-property-ref-face))
[(double_quote_scalar) (single_quote_scalar)] @font-lock-property-use-face))
(flow_mapping
(_ key: (flow_node (plain_scalar (string_scalar) @font-lock-property-ref-face))))
(_ key: (flow_node (plain_scalar (string_scalar) @font-lock-property-use-face))))
(flow_mapping
(_ key:
(flow_node
[(double_quote_scalar) (single_quote_scalar)] @font-lock-property-ref-face)))
[(double_quote_scalar) (single_quote_scalar)] @font-lock-property-use-face)))
(flow_sequence
(_ key: (flow_node (plain_scalar (string_scalar) @font-lock-property-ref-face))))
(_ key: (flow_node (plain_scalar (string_scalar) @font-lock-property-use-face))))
(flow_sequence
(_ key:
(flow_node
[(double_quote_scalar) (single_quote_scalar)] @font-lock-property-ref-face))))
[(double_quote_scalar) (single_quote_scalar)] @font-lock-property-use-face))))
:language 'yaml
:feature 'error

View file

@ -1227,6 +1227,16 @@ See `treesit-simple-indent-presets'.")
(goto-char (treesit-node-start parent))
(back-to-indentation)
(point))))
(cons 'standalone-parent
(lambda (_n parent &rest _)
(save-excursion
(catch 'term
(while parent
(goto-char (treesit-node-start parent))
(when (looking-back (rx bol (* whitespace))
(line-beginning-position))
(throw 'term (point)))
(setq parent (treesit-node-parent parent)))))))
(cons 'prev-sibling (lambda (node &rest _)
(treesit-node-start
(treesit-node-prev-sibling node))))
@ -1323,6 +1333,11 @@ parent-bol
Returns the beginning of non-space characters on the line where
PARENT is on.
standalone-parent
Finds the first ancestor node (parent, grandparent, etc) that
starts on its own line, and return the start of that node.
prev-sibling
Returns the start of NODE's previous sibling.
@ -1854,10 +1869,23 @@ This is a tree-sitter equivalent of `beginning-of-defun'.
Behavior of this function depends on `treesit-defun-type-regexp'
and `treesit-defun-skipper'."
(interactive "^p")
(when (treesit-beginning-of-thing treesit-defun-type-regexp arg)
(when treesit-defun-skipper
(funcall treesit-defun-skipper))
t))
(let ((orig-point (point))
(success nil))
(catch 'done
(dotimes (_ 2)
(when (treesit-beginning-of-thing treesit-defun-type-regexp arg)
(when treesit-defun-skipper
(funcall treesit-defun-skipper)
(setq success t)))
;; If we end up at the same point, it means we went to the
;; next beg-of-defun, but defun skipper moved point back to
;; where we started, in this case we just move one step
;; further.
(if (or (eq arg 0) (not (eq orig-point (point))))
(throw 'done success)
(setq arg (if (> arg 0) (1+ arg) (1- arg))))))))
(defun treesit-end-of-defun (&optional arg _)
"Move forward to next end of defun.
@ -1869,9 +1897,21 @@ This is a tree-sitter equivalent of `end-of-defun'. Behavior of
this function depends on `treesit-defun-type-regexp' and
`treesit-defun-skipper'."
(interactive "^p\nd")
(when (treesit-end-of-thing treesit-defun-type-regexp arg)
(when treesit-defun-skipper
(funcall treesit-defun-skipper))))
(let ((orig-point (point)))
(catch 'done
(dotimes (_ 2) ; Not making progress is better than infloop.
(when (treesit-end-of-thing treesit-defun-type-regexp arg)
(when treesit-defun-skipper
(funcall treesit-defun-skipper)))
;; If we end up at the same point, it means we went to the
;; prev end-of-defun, but defun skipper moved point back to
;; where we started, in this case we just move one step
;; further.
(if (or (eq arg 0) (not (eq orig-point (point))))
(throw 'done nil)
(setq arg (if (> arg 0) (1+ arg) (1- arg))))))))
(defvar-local treesit-text-type-regexp "\\`comment\\'"
"A regexp that matches the node type of textual nodes.
@ -2027,9 +2067,9 @@ REGEXP and PRED are the same as in `treesit-thing-at-point'."
;;
;; prev-end (tricky):
;; 1. prev-sibling exists
;; -> If you think about it, we are already at prev-sibling's end!
;; So we need to go one step further, either to
;; prev-prev-sibling's end, or parent's prev-sibling's end, etc.
;; -> If we are already at prev-sibling's end, we need to go one
;; step further, either to prev-prev-sibling's end, or parent's
;; prev-sibling's end, etc.
;; 2. prev-sibling is nil but parent exists
;; -> Obviously we don't want to go to parent's end, instead, we
;; want to go to parent's prev-sibling's end. Again, we recurse
@ -2079,18 +2119,24 @@ function is called recursively."
;; ...forward.
(if (and (eq side 'beg)
;; Should we skip the defun (recurse)?
(cond (next (not recursing)) ; [1] (see below)
(parent t) ; [2]
(t nil)))
;; Special case: go to next beg-of-defun. Set POS
;; to the end of next-sib/parent defun, and run one
;; more step. If there is a next-sib defun, we only
;; need to recurse once, so we don't need to recurse
;; if we are already recursing [1]. If there is no
(cond (next (and (not recursing) ; [1] (see below)
(eq pos (funcall advance next))))
(parent t))) ; [2]
;; Special case: go to next beg-of-defun, but point
;; is already on beg-of-defun. Set POS to the end
;; of next-sib/parent defun, and run one more step.
;; If there is a next-sib defun, we only need to
;; recurse once, so we don't need to recurse if we
;; are already recursing [1]. If there is no
;; next-sib but a parent, keep stepping out
;; (recursing) until we got out of the parents until
;; (1) there is a next sibling defun, or (2) no more
;; parents [2].
;;
;; If point on beg-of-defun but we are already
;; recurring, that doesn't count as special case,
;; because we have already made progress (by moving
;; the end of next before recurring.)
(setq pos (or (treesit--navigate-thing
(treesit-node-end (or next parent))
1 'beg regexp pred t)
@ -2099,9 +2145,9 @@ function is called recursively."
(setq pos (funcall advance (or next parent))))
;; ...backward.
(if (and (eq side 'end)
(cond (prev (not recursing))
(parent t)
(t nil)))
(cond (prev (and (not recursing)
(eq pos (funcall advance prev))))
(parent t)))
;; Special case: go to prev end-of-defun.
(setq pos (or (treesit--navigate-thing
(treesit-node-start (or prev parent))

View file

@ -977,22 +977,22 @@ and \"]\"."
(defvar treesit--ert-defun-navigation-nested-master
;; START PREV-BEG NEXT-END PREV-END NEXT-BEG
'((0 103 105 102 106) ; Between Beg of parent & 1st sibling.
'((0 103 105 102 104) ; Between Beg of parent & 1st sibling.
(1 103 105 102 106) ; Beg of 1st sibling.
(2 104 105 102 106) ; Inside 1st sibling.
(3 104 107 102 109) ; End of 1st sibling.
(4 104 107 102 109) ; Between 1st sibling & 2nd sibling.
(5 104 107 102 109) ; Beg of 2nd sibling.
(3 104 107 102 106) ; End of 1st sibling.
(4 104 107 105 106) ; Between 1st sibling & 2nd sibling.
(5 104 107 105 109) ; Beg of 2nd sibling.
(6 106 107 105 109) ; Inside 2nd sibling.
(7 106 108 105 109) ; End of 2nd sibling.
(8 106 108 105 109) ; Between 2nd sibling & end of parent.
(9 103 110 102 nil) ; End of parent.
(8 106 108 107 109) ; Between 2nd sibling & end of parent.
(9 103 110 102 109) ; End of parent.
(100 nil 102 nil 103) ; Before 1st parent.
(100 nil 102 nil 101) ; Before 1st parent.
(101 nil 102 nil 103) ; Beg of 1st parent.
(102 101 108 nil 109) ; Between 1st & 2nd parent.
(103 101 108 nil 109) ; Beg of 2nd parent.
(110 109 nil 108 nil) ; After 3rd parent.
(102 101 108 102 103) ; Between 1st & 2nd parent.
(103 101 108 102 109) ; Beg of 2nd parent.
(110 109 nil 110 nil) ; After 3rd parent.
)
"Master of nested navigation test.
@ -1000,7 +1000,7 @@ This basically says, e.g., \"start with point on marker 0, go to
the prev-beg, now point should be at marker 103\", etc.")
(defvar treesit--ert-defun-navigation-top-level-master
;; START PREV-BEG NEXT-END NEXT-BEG PREV-END
;; START PREV-BEG NEXT-END PREV-END NEXT-BEG
'((0 103 108 102 109) ; Between Beg of parent & 1st sibling.
(1 103 108 102 109) ; Beg of 1st sibling.
(2 103 108 102 109) ; Inside 1st sibling.
@ -1010,14 +1010,14 @@ the prev-beg, now point should be at marker 103\", etc.")
(6 103 108 102 109) ; Inside 2nd sibling.
(7 103 108 102 109) ; End of 2nd sibling.
(8 103 108 102 109) ; Between 2nd sibling & end of parent.
(9 103 110 102 nil) ; End of parent.
(9 103 110 102 109) ; End of parent.
;; Top-level defuns should be identical to the nested test.
(100 nil 102 nil 103) ; Before 1st parent.
(100 nil 102 nil 101) ; Before 1st parent.
(101 nil 102 nil 103) ; Beg of 1st parent.
(102 101 108 nil 109) ; Between 1st & 2nd parent.
(103 101 108 nil 109) ; Beg of 2nd parent.
(110 109 nil 108 nil) ; After 3rd parent.
(102 101 108 102 103) ; Between 1st & 2nd parent.
(103 101 108 102 109) ; Beg of 2nd parent.
(110 109 nil 110 nil) ; After 3rd parent.
)
"Master of top-level navigation test.")