Merge from origin/emacs-29
836044f329
Fix c-ts-mode preproc directive indentation64980a59b6
; * lisp/files.el (hack-local-variables): Fix typo in the...a7cd125d49
More robustly unspoof HOME in Eglot tests (bug#61637)6c66dbd02c
Turn on Eglot inlay hints by default246f5b541c
Update ts modes missed in4c16fd3a51
to use column-00bfba49ca7
Robustify Eglot for "transient" projectsea5fd375bb
Fix documentation of 'normal-mode' in buffers that don't ...4c16fd3a51
Change tree-sitter indent anchor 'point-min' to 'column-0'f47b393015
Fix go-ts-mode multi-line string indentation (bug#61923)e0bf2da3db
; More accurate doc strings for 'window-at' and 'window-a...
This commit is contained in:
commit
6fb8a4dff7
16 changed files with 144 additions and 55 deletions
|
@ -473,9 +473,12 @@ specify which mode you prefer.
|
|||
If you have changed the major mode of a buffer, you can return to
|
||||
the major mode Emacs would have chosen automatically, by typing
|
||||
@kbd{M-x normal-mode}. This is the same function that
|
||||
@code{find-file} calls to choose the major mode. It also processes
|
||||
the file's @samp{-*-} line or local variables list (if any).
|
||||
@xref{File Variables}.
|
||||
@code{find-file} calls to choose the major mode. If the buffer is
|
||||
visiting a file, this command also processes the file's @samp{-*-}
|
||||
line and file-local variables list (if any). @xref{File Variables}.
|
||||
If the buffer doesn't visit a file, the command processes only the
|
||||
major mode specification, if any, in the @samp{-*-} line and in the
|
||||
file-local variables list.
|
||||
|
||||
@vindex change-major-mode-with-file-name
|
||||
The commands @kbd{C-x C-w} and @code{set-visited-file-name} change to
|
||||
|
|
|
@ -5117,10 +5117,10 @@ This anchor is a function that is called with 3 arguments: @var{node},
|
|||
@var{parent}, and @var{bol}, and returns the first non-whitespace
|
||||
character on the previous line.
|
||||
|
||||
@item point-min
|
||||
@item column-0
|
||||
This anchor is a function that is called with 3 arguments: @var{node},
|
||||
@var{parent}, and @var{bol}, and returns the beginning of the buffer.
|
||||
This is useful as the beginning of the buffer is always at column 0.
|
||||
@var{parent}, and @var{bol}, and returns the beginning of the current
|
||||
line, which is at column 0.
|
||||
|
||||
@item comment-start
|
||||
This anchor is a function that is called with 3 arguments: @var{node},
|
||||
|
|
|
@ -2775,7 +2775,11 @@ not set local variables (though we do notice a mode specified with -*-.)
|
|||
|
||||
`enable-local-variables' is ignored if you run `normal-mode' interactively,
|
||||
or from Lisp without specifying the optional argument FIND-FILE;
|
||||
in that case, this function acts as if `enable-local-variables' were t."
|
||||
in that case, this function acts as if `enable-local-variables' were t.
|
||||
|
||||
If invoked in a buffer that doesn't visit a file, this function
|
||||
processes only the major mode specification in the -*- line and
|
||||
the local variables spec."
|
||||
(interactive)
|
||||
(kill-all-local-variables)
|
||||
(unless delay-mode-hooks
|
||||
|
@ -3925,9 +3929,6 @@ variables.
|
|||
|
||||
Uses `hack-local-variables-apply' to apply the variables.
|
||||
|
||||
See `hack-local-variables--find-variables' for the meaning of
|
||||
HANDLE-MODE.
|
||||
|
||||
If `enable-local-variables' or `local-enable-local-variables' is
|
||||
nil, or INHIBIT-LOCALS is non-nil, this function disregards all
|
||||
normal local variables. If `inhibit-local-variables-regexps'
|
||||
|
@ -3937,7 +3938,14 @@ applied.
|
|||
|
||||
Variables present in `permanently-enabled-local-variables' will
|
||||
still be evaluated, even if local variables are otherwise
|
||||
inhibited."
|
||||
inhibited.
|
||||
|
||||
If HANDLE-MODE is t, the function only checks whether a \"mode:\"
|
||||
is specified, and returns the corresponding mode symbol, or nil.
|
||||
In this case, try to ignore minor-modes, and return only a major-mode.
|
||||
If HANDLE-MODE is nil, the function gathers all the specified local
|
||||
variables. If HANDLE-MODE is neither nil nor t, the function gathers
|
||||
all the specified local variables, but ignores any settings of \"mode:\"."
|
||||
;; We don't let inhibit-local-variables-p influence the value of
|
||||
;; enable-local-variables, because then it would affect dir-local
|
||||
;; variables. We don't want to search eg tar files for file local
|
||||
|
|
|
@ -299,6 +299,23 @@ PARENT and BOL are like other anchor functions."
|
|||
;; prev-sibling doesn't have a child.
|
||||
(treesit-node-start prev-sibling)))
|
||||
|
||||
(defun c-ts-mode--standalone-parent-skip-preproc (_n parent &rest _)
|
||||
"Like the standalone-parent anchor but skips preproc nodes.
|
||||
PARENT is the same as other anchor functions."
|
||||
(save-excursion
|
||||
(treesit-node-start
|
||||
(treesit-parent-until
|
||||
;; Use PARENT rather than NODE, to handle the case where NODE is
|
||||
;; nil.
|
||||
parent (lambda (node)
|
||||
(and node
|
||||
(not (string-match "preproc" (treesit-node-type node)))
|
||||
(progn
|
||||
(goto-char (treesit-node-start node))
|
||||
(looking-back (rx bol (* whitespace))
|
||||
(line-beginning-position)))))
|
||||
t))))
|
||||
|
||||
(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."
|
||||
|
@ -309,8 +326,8 @@ PARENT, BOL, ARGS are the same as other anchor functions."
|
|||
"Indent rules supported by `c-ts-mode'.
|
||||
MODE is either `c' or `cpp'."
|
||||
(let ((common
|
||||
`(((parent-is "translation_unit") point-min 0)
|
||||
((query "(ERROR (ERROR)) @indent") point-min 0)
|
||||
`(((parent-is "translation_unit") column-0 0)
|
||||
((query "(ERROR (ERROR)) @indent") column-0 0)
|
||||
((node-is ")") parent 1)
|
||||
((node-is "]") parent-bol 0)
|
||||
((node-is "else") parent-bol 0)
|
||||
|
@ -330,13 +347,28 @@ MODE is either `c' or `cpp'."
|
|||
((parent-is "labeled_statement")
|
||||
c-ts-mode--standalone-grandparent c-ts-mode-indent-offset)
|
||||
|
||||
((node-is "preproc") point-min 0)
|
||||
((node-is "#endif") point-min 0)
|
||||
((match "preproc_call" "compound_statement") point-min 0)
|
||||
;; Preproc directives
|
||||
((node-is "preproc") column-0 0)
|
||||
((node-is "#endif") column-0 0)
|
||||
((match "preproc_call" "compound_statement") column-0 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)
|
||||
;; Top-level things under a preproc directive. Note that
|
||||
;; "preproc" matches more than one type: it matches
|
||||
;; preproc_if, preproc_elif, etc.
|
||||
((n-p-gp nil "preproc" "translation_unit") column-0 0)
|
||||
;; Indent rule for an empty line after a preproc directive.
|
||||
((and no-node (parent-is ,(rx (or "\n" "preproc"))))
|
||||
c-ts-mode--standalone-parent-skip-preproc c-ts-mode--preproc-offset)
|
||||
;; Statement under a preproc directive, the first statement
|
||||
;; indents against parent, the rest statements indent to
|
||||
;; their prev-sibling.
|
||||
((match nil ,(rx "preproc_" (or "if" "elif")) nil 3 3)
|
||||
c-ts-mode--standalone-parent-skip-preproc c-ts-mode-indent-offset)
|
||||
((match nil "preproc_ifdef" nil 2 2)
|
||||
c-ts-mode--standalone-parent-skip-preproc c-ts-mode-indent-offset)
|
||||
((match nil "preproc_else" nil 1 1)
|
||||
c-ts-mode--standalone-parent-skip-preproc c-ts-mode-indent-offset)
|
||||
((parent-is "preproc") c-ts-mode--anchor-prev-sibling 0)
|
||||
|
||||
((parent-is "function_definition") parent-bol 0)
|
||||
((parent-is "conditional_expression") first-sibling 0)
|
||||
|
@ -392,14 +424,14 @@ MODE is either `c' or `cpp'."
|
|||
`((gnu
|
||||
;; Prepend rules to set highest priority
|
||||
((match "while" "do_statement") parent 0)
|
||||
(c-ts-mode--top-level-label-matcher point-min 1)
|
||||
(c-ts-mode--top-level-label-matcher column-0 1)
|
||||
,@common)
|
||||
(k&r ,@common)
|
||||
(linux
|
||||
;; Reference:
|
||||
;; https://www.kernel.org/doc/html/latest/process/coding-style.html,
|
||||
;; and script/Lindent in Linux kernel repository.
|
||||
((node-is "labeled_statement") point-min 0)
|
||||
((node-is "labeled_statement") column-0 0)
|
||||
,@common)
|
||||
(bsd
|
||||
((node-is "}") parent-bol 0)
|
||||
|
|
|
@ -1079,7 +1079,8 @@ variable (which see) can query the value `eglot-lsp-context' to
|
|||
decide whether a given directory is a project containing a
|
||||
suitable root directory for a given LSP server's purposes."
|
||||
(let ((eglot-lsp-context t))
|
||||
(or (project-current) `(transient . ,default-directory))))
|
||||
(or (project-current)
|
||||
`(transient . ,(expand-file-name default-directory)))))
|
||||
|
||||
;;;###autoload
|
||||
(defun eglot (managed-major-mode project class contact language-id
|
||||
|
@ -1922,6 +1923,7 @@ If it is activated, also signal textDocument/didOpen."
|
|||
(eglot--signal-textDocument/didOpen)
|
||||
;; Run user hook after 'textDocument/didOpen' so server knows
|
||||
;; about the buffer.
|
||||
(eglot-inlay-hints-mode 1)
|
||||
(run-hooks 'eglot-managed-mode-hook))))
|
||||
|
||||
(add-hook 'after-change-major-mode-hook 'eglot--maybe-activate-editing-mode)
|
||||
|
@ -3645,8 +3647,7 @@ If NOERROR, return predicate, else erroring function."
|
|||
(cond (eglot-inlay-hints-mode
|
||||
(if (eglot--server-capable :inlayHintProvider)
|
||||
(jit-lock-register #'eglot--update-hints 'contextual)
|
||||
(eglot--warn
|
||||
"No :inlayHintProvider support. Inlay hints will not work.")))
|
||||
(eglot-inlay-hints-mode -1)))
|
||||
(t
|
||||
(jit-lock-unregister #'eglot--update-hints)
|
||||
(remove-overlays nil nil 'eglot--inlay-hint t))))
|
||||
|
|
|
@ -67,11 +67,12 @@
|
|||
|
||||
(defvar go-ts-mode--indent-rules
|
||||
`((go
|
||||
((parent-is "source_file") point-min 0)
|
||||
((parent-is "source_file") column-0 0)
|
||||
((node-is ")") parent-bol 0)
|
||||
((node-is "]") parent-bol 0)
|
||||
((node-is "}") parent-bol 0)
|
||||
((node-is "labeled_statement") no-indent)
|
||||
((node-is "labeled_statement") no-indent 0)
|
||||
((parent-is "raw_string_literal") no-indent 0)
|
||||
((parent-is "argument_list") parent-bol go-ts-mode-indent-offset)
|
||||
((parent-is "block") parent-bol go-ts-mode-indent-offset)
|
||||
((parent-is "communication_case") parent-bol go-ts-mode-indent-offset)
|
||||
|
|
|
@ -69,10 +69,10 @@
|
|||
|
||||
(defvar java-ts-mode--indent-rules
|
||||
`((java
|
||||
((parent-is "program") point-min 0)
|
||||
((parent-is "program") column-0 0)
|
||||
((match "}" "element_value_array_initializer")
|
||||
parent-bol 0)
|
||||
((node-is "}") point-min c-ts-common-statement-offset)
|
||||
((node-is "}") column-0 c-ts-common-statement-offset)
|
||||
((node-is ")") parent-bol 0)
|
||||
((node-is "else") parent-bol 0)
|
||||
((node-is "]") parent-bol 0)
|
||||
|
@ -80,15 +80,15 @@
|
|||
c-ts-common-comment-start-after-first-star -1)
|
||||
((parent-is "comment") prev-adaptive-prefix 0)
|
||||
((parent-is "text_block") no-indent)
|
||||
((parent-is "class_body") point-min c-ts-common-statement-offset)
|
||||
((parent-is "class_body") column-0 c-ts-common-statement-offset)
|
||||
((parent-is "array_initializer") parent-bol java-ts-mode-indent-offset)
|
||||
((parent-is "annotation_type_body") point-min c-ts-common-statement-offset)
|
||||
((parent-is "interface_body") point-min c-ts-common-statement-offset)
|
||||
((parent-is "constructor_body") point-min c-ts-common-statement-offset)
|
||||
((parent-is "annotation_type_body") column-0 c-ts-common-statement-offset)
|
||||
((parent-is "interface_body") column-0 c-ts-common-statement-offset)
|
||||
((parent-is "constructor_body") column-0 c-ts-common-statement-offset)
|
||||
((parent-is "enum_body_declarations") parent-bol 0)
|
||||
((parent-is "enum_body") point-min c-ts-common-statement-offset)
|
||||
((parent-is "switch_block") point-min c-ts-common-statement-offset)
|
||||
((parent-is "record_declaration_body") point-min c-ts-common-statement-offset)
|
||||
((parent-is "enum_body") column-0 c-ts-common-statement-offset)
|
||||
((parent-is "switch_block") column-0 c-ts-common-statement-offset)
|
||||
((parent-is "record_declaration_body") column-0 c-ts-common-statement-offset)
|
||||
((query "(method_declaration (block _ @indent))") parent-bol java-ts-mode-indent-offset)
|
||||
((query "(method_declaration (block (_) @indent))") parent-bol java-ts-mode-indent-offset)
|
||||
((parent-is "local_variable_declaration") parent-bol java-ts-mode-indent-offset)
|
||||
|
@ -121,7 +121,7 @@
|
|||
((parent-is "case_statement") parent-bol java-ts-mode-indent-offset)
|
||||
((parent-is "labeled_statement") parent-bol java-ts-mode-indent-offset)
|
||||
((parent-is "do_statement") parent-bol java-ts-mode-indent-offset)
|
||||
((parent-is "block") point-min c-ts-common-statement-offset)))
|
||||
((parent-is "block") column-0 c-ts-common-statement-offset)))
|
||||
"Tree-sitter indent rules.")
|
||||
|
||||
(defvar java-ts-mode--keywords
|
||||
|
|
|
@ -557,7 +557,7 @@ a statement container is a node that matches
|
|||
(let ((common
|
||||
`(
|
||||
;; Slam all top level nodes to the left margin
|
||||
((parent-is "program") point-min 0)
|
||||
((parent-is "program") column-0 0)
|
||||
|
||||
;; Do not indent here docs or the end. Not sure why it
|
||||
;; takes the grand-parent but ok fine.
|
||||
|
|
|
@ -71,7 +71,7 @@
|
|||
|
||||
(defvar rust-ts-mode--indent-rules
|
||||
`((rust
|
||||
((parent-is "source_file") point-min 0)
|
||||
((parent-is "source_file") column-0 0)
|
||||
((node-is ")") parent-bol 0)
|
||||
((node-is "]") parent-bol 0)
|
||||
((node-is "}") (and parent parent-bol) 0)
|
||||
|
|
|
@ -69,7 +69,7 @@
|
|||
"Rules used for indentation.
|
||||
Argument LANGUAGE is either `typescript' or `tsx'."
|
||||
`((,language
|
||||
((parent-is "program") point-min 0)
|
||||
((parent-is "program") column-0 0)
|
||||
((node-is "}") parent-bol 0)
|
||||
((node-is ")") parent-bol 0)
|
||||
((node-is "]") parent-bol 0)
|
||||
|
|
|
@ -2441,8 +2441,9 @@ If the variable `delay-mode-hooks' is non-nil, does not do anything,
|
|||
just adds the HOOKS to the list `delayed-mode-hooks'.
|
||||
Otherwise, runs hooks in the sequence: `change-major-mode-after-body-hook',
|
||||
`delayed-mode-hooks' (in reverse order), HOOKS, then runs
|
||||
`hack-local-variables', runs the hook `after-change-major-mode-hook', and
|
||||
finally evaluates the functions in `delayed-after-hook-functions' (see
|
||||
`hack-local-variables' (if the buffer is visiting a file),
|
||||
runs the hook `after-change-major-mode-hook', and finally
|
||||
evaluates the functions in `delayed-after-hook-functions' (see
|
||||
`define-derived-mode').
|
||||
|
||||
Major mode functions should use this instead of `run-hooks' when
|
||||
|
|
|
@ -1254,7 +1254,10 @@ See `treesit-simple-indent-presets'.")
|
|||
(goto-char bol)
|
||||
(forward-line -1)
|
||||
(skip-chars-forward " \t"))))
|
||||
(cons 'point-min (lambda (&rest _) (point-min)))
|
||||
(cons 'column-0 (lambda (_n _p bol &rest _)
|
||||
(save-excursion
|
||||
(goto-char bol)
|
||||
(line-beginning-position))))
|
||||
;; TODO: Document.
|
||||
(cons 'and (lambda (&rest fns)
|
||||
(lambda (node parent bol &rest _)
|
||||
|
@ -1358,9 +1361,9 @@ prev-line
|
|||
|
||||
Returns the first non-whitespace character on the previous line.
|
||||
|
||||
point-min
|
||||
column-0
|
||||
|
||||
Returns the beginning of buffer, which is always at column 0.
|
||||
Returns the beginning of the current line, which is at column 0.
|
||||
|
||||
comment-start
|
||||
|
||||
|
|
|
@ -4143,6 +4143,10 @@ X and Y are FRAME-relative pixel coordinates. A coordinate on an
|
|||
edge shared by two windows is attributed to the window on the
|
||||
right (or below). Return nil if no such window can be found.
|
||||
|
||||
Tool-bar and tab-bar pseudo-windows are ignored by this function:
|
||||
if the specified coordinates are in any of these two windows, this
|
||||
function returns nil.
|
||||
|
||||
Optional argument FRAME must specify a live frame and defaults to
|
||||
the selected one. Optional argument NO-OTHER non-nil means to
|
||||
return nil if the window located at the specified coordinates has
|
||||
|
|
|
@ -1729,8 +1729,11 @@ window_from_coordinates (struct frame *f, int x, int y,
|
|||
DEFUN ("window-at", Fwindow_at, Swindow_at, 2, 3, 0,
|
||||
doc: /* Return window containing coordinates X and Y on FRAME.
|
||||
FRAME must be a live frame and defaults to the selected one.
|
||||
The top left corner of the frame is considered to be row 0,
|
||||
column 0. */)
|
||||
X and Y are measured in units of canonical columns and rows.
|
||||
The top left corner of the frame is considered to be column 0, row 0.
|
||||
Tool-bar and tab-bar pseudo-windows are ignored by this function: if
|
||||
the specified coordinates are in any of these two windows, this
|
||||
function returns nil. */)
|
||||
(Lisp_Object x, Lisp_Object y, Lisp_Object frame)
|
||||
{
|
||||
struct frame *f = decode_live_frame (frame);
|
||||
|
|
|
@ -44,3 +44,37 @@ static void
|
|||
/* */
|
||||
static void
|
||||
=-=-=
|
||||
|
||||
Code:
|
||||
(lambda ()
|
||||
(c-ts-mode)
|
||||
(setq-local indent-tabs-mode nil)
|
||||
(setq-local c-ts-mode-indent-offset 2)
|
||||
(c-ts-mode-set-style 'gnu)
|
||||
(indent-region (point-min) (point-max)))
|
||||
|
||||
Name: Prev-Sibling When Prev-Sibling is Preproc
|
||||
|
||||
=-=
|
||||
static void
|
||||
free_glyph_pool (struct glyph_pool *pool)
|
||||
{
|
||||
if (pool)
|
||||
{
|
||||
#if defined GLYPH_DEBUG
|
||||
int c = 1;
|
||||
#endif
|
||||
int check_this = 3;
|
||||
|
||||
#ifdef stuff
|
||||
int c = 1;
|
||||
#elif defined stuff
|
||||
int e = 5;
|
||||
#else
|
||||
int d = 11;
|
||||
int f = 11;
|
||||
#endif
|
||||
int check_this = 3;
|
||||
}
|
||||
}
|
||||
=-=-=
|
||||
|
|
|
@ -103,22 +103,21 @@ then restored."
|
|||
(set (car spec) (cadr spec)))
|
||||
((stringp (car spec)) (push spec file-specs))))
|
||||
(unwind-protect
|
||||
(let* ((home (getenv "HOME"))
|
||||
(process-environment
|
||||
(let* ((process-environment
|
||||
(append
|
||||
`(;; Set XDF_CONFIG_HOME to /dev/null to prevent
|
||||
;; user-configuration to have an influence on
|
||||
;; language servers. (See github#441)
|
||||
"XDG_CONFIG_HOME=/dev/null"
|
||||
;; ... on the flip-side, a similar technique by
|
||||
;; Emacs's test makefiles means that HOME is set to
|
||||
;; /nonexistent. This breaks some common
|
||||
;; installations for LSP servers like pylsp, making
|
||||
;; these tests mostly useless, so we hack around it
|
||||
;; here with a great big hack.
|
||||
;; Emacs's test makefiles means that HOME is
|
||||
;; spoofed to /nonexistent, or sometimes /tmp.
|
||||
;; This breaks some common installations for LSP
|
||||
;; servers like pylsp, rust-analyzer making these
|
||||
;; tests mostly useless, so we hack around it here
|
||||
;; with a great big hack.
|
||||
,(format "HOME=%s"
|
||||
(if (file-exists-p home) home
|
||||
(format "/home/%s" (getenv "USER")))))
|
||||
(expand-file-name (format "~%s" (user-login-name)))))
|
||||
process-environment))
|
||||
;; Prevent "Can't guess python-indent-offset ..." messages.
|
||||
(python-indent-guess-indent-offset-verbose . nil)
|
||||
|
|
Loading…
Add table
Reference in a new issue