Closed getong closed 10 months ago
应该是最新版支持的 lsp-bridge-enable-inlay-hint 选项, 你更新到最新版没有这个提示吗?
我更新到最新的版本了,rust代码有效果,但flutter没有效果。
给一个测试代码?
https://github.com/bizz84/complete-flutter-course/ complete-flutter-course/ecommerce_app/lib/main.dart
code with andrea
emacs config
(use-package flutter
:straight t
:after dart-mode
:config
(defun my/flutter-goto-logs-buffer()
"Go to buffer logs buffer."
(interactive)
(let ((buffer (get-buffer flutter-buffer-name)))
(unless buffer
(user-error "flutter is not running."))
(switch-to-buffer buffer)
(goto-line (point-max))))
:bind (:map dart-mode-map
("C-c C-r" . #'flutter-run-or-hot-reload)
("C-c C-l" . #'my/flutter-goto-logs-buffer))
:hook (dart-mode . flutter-test-mode)
:custom
;; sdk path will be the parent-parent directory of flutter cli
(flutter-sdk-path (directory-file-name
(file-name-directory
(directory-file-name
(file-name-directory (file-truename (executable-find "flutter")))))))
)
;;Optional Flutter packages, run app from desktop without emulator
(use-package hover
:straight t)
(use-package flutter-l10n-flycheck
:straight t
:after flutter
:config (flutter-l10n-flycheck-setup))
(use-package dart-mode
:straight t
:mode
("\\.dart\\'" . dart-mode)
;;:defines (projectile-project-root-files-bottom-up)
:if (or (executable-find "dart") (executable-find "flutter"))
:bind (:map dart-mode-map
("C-c C-f" . dart-format-buffer)
("C-c C-c" . my/dart-run-file))
:config
(defun my/dart-run-file ()
"Execute the code of the current file."
(interactive)
(compile (format "dart %s" (buffer-file-name))))
;; (with-eval-after-load "projectile"
;; (add-to-list 'projectile-project-root-files-bottom-up "pubspec.yaml")
;; (add-to-list 'projectile-project-root-files-bottom-up "BUILD")
;; (add-to-list 'projectile-globally-ignored-file-suffixes "inject.dart")
;; (add-to-list 'projectile-globally-ignored-file-suffixes "inject.summary")
;; )
:hook
((dart-mode . flutter-test-mode)
;; (dart-mode . lsp-mode)
)
)
(use-package lsp-bridge
:straight '(lsp-bridge :type git :host github :repo "manateelazycat/lsp-bridge"
:files (:defaults "*.el" "*.py" "acm" "core" "langserver" "multiserver" "resources")
:build (:not compile))
:defer t
:commands (lsp-bridge-mode)
;; (add-hook 'lsp-bridge-mode-hook #'lsp-bridge-mode-hook-func)
:hook
((
dart-mode
python-mode
;; emacs-lisp-mode
lua-mode
c++-mode
go-mode
c-mode) . lsp-bridge-mode)
((rust-mode rustic-mode) . setup-lsp-bridge-rust-mode)
:bind (:map lsp-bridge-mode-map
("M-." . lsp-bridge-find-def)
("M-n ." . lsp-bridge-find-def-other-window)
("M-n i" . lsp-bridge-find-impl)
("M-n I" . lsp-bridge-find-impl-other-window)
("M-," . lsp-bridge-find-def-return)
("M-?" . lsp-bridge-find-references)
("M-n r" . lsp-bridge-rename)
("M-n l" . lsp-bridge-diagnostic-list)
("M-n n" . lsp-bridge-diagnostic-jump-next)
("M-n p" . lsp-bridge-diagnostic-jump-prev)
("M-n h" . lsp-bridge-popup-documentation)
("M-n u" . lsp-bridge-popup-documentation-scroll-up)
("M-n d" . lsp-bridge-popup-documentation-scroll-down)
;; ("C-c M-f" . lsp-bridge-code-format) ;; replace by blacken
)
:custom
(tabnine-bridge-binaries-folder (expand-file-name "~/.backup-emacs/tabnine-bridge/tabnine-binaries"))
(lsp-bridge-enable-log nil)
(lsp-bridge-symbols-enable-which-func t)
(acm-enable-icon t)
(acm-enable-doc t)
(acm-enable-tabnine t)
(acm-enable-quick-access t)
(lsp-bridge-enable-inlay-hint t)
(lsp-bridge-find-def-select-in-open-windows t)
(lsp-bridge-signature-show-function 'lsp-bridge-signature-show-with-frame)
(lsp-bridge-signature-show-with-frame-position 'top-right)
(lsp-bridge-enable-completion-in-minibuffer t)
(acm-backend-yas-match-by-trigger-keyword t)
;; (lsp-bridge-signature-show-function 'lsp-bridge-signature-posframe)
(lsp-bridge-c-lsp-server "ccls")
(acm-enable-codeium t)
(lsp-bridge-enable-signature-help t)
(lsp-bridge-complete-manually t)
(codeium-download-url-prefix "https://ghproxy.com/https://github.com/Exafunction/codeium/releases/download/language-server-v")
:config
;; (global-lsp-bridge-mode)
(defun find-rust-prj-root (dir)
"Find the Rust project root of DIR."
(file-truename(locate-dominating-file dir "Cargo.toml")))
(defun setup-lsp-bridge-rust-mode ()
(setq-local lsp-bridge-get-project-path-by-filepath #'find-rust-prj-root)
(lsp-bridge-mode)
)
)
我看了一下, 你截图这个应该不是 inlay hint 协议, 我分析了 dart 启动日志, 它初始化返回的时候明确返回了 inlayHintProvider: false (通过 lsp-bridge-enable-log 选项打开可以看到)
你这个应该是 dart lsp server 自己实现的私有协议 https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/tool/lsp_spec/README.md#darttextdocumentpublishclosinglabels-notification
我这边看了一下, 主要是我的 dart 环境没配好, 导致打开任意 dart 文件都有很多类型错误诊断。
想推进这个功能, 需要你提供帮助:
修改 dart-analysis-server.json 文件内容为
{
"name": "dart-analysis-server",
"languageId": "dart",
"command": [
"dart",
"language-server",
"--client-id",
"emacs.lsp-bridge"
],
"settings": {},
"initializationOptions": {
"closingLabels": true
}
}
打开 lsp-bridge-enable-log 选项 (仅调试用, 正常写代码需要关闭这个选项, 这个选项耗费性能) 然后检查 lsp-bridge buffer, 搜索 dart/textDocument/publishClosingLabels 消息, 如果有 range 字段的信息, 请粘贴到 github 上
理论上 dart 私有协议 closingLabels 的消息可以对接到 LSP 标准 inlay hint 协议上
the output:
--- [09:51:56.211519] Recv dart/textDocument/publishClosingLabels notification from 'dart-analysis-server' for project complete-flutter-course
{
"jsonrpc": "2.0",
"method": "dart/textDocument/publishClosingLabels",
"params": {
"labels": [
{
"label": "ProviderContainer",
"range": {
"end": {
"character": 3,
"line": 30
},
"start": {
"character": 20,
"line": 25
}
}
},
{
"label": "UncontrolledProviderScope",
"range": {
"end": {
"character": 3,
"line": 41
},
"start": {
"character": 9,
"line": 38
}
}
}
],
"uri": "file:///Users/gerald/test/flutter/complete-flutter-course/ecommerce_app/lib/main.dart"
}
}
我这边没有完整的 Dart 环境, 没法获取 closing label 消息。
我根据你返回的消息, 盲写了一个补丁 https://github.com/manateelazycat/lsp-bridge/commit/574f97729af33c59666e0a38cd31d64eae20611a
你可以更新测试看看, 欢迎发PR 。 ;)
有效果了,太感谢了。可以微调一下吗?追加的widget名称放在分号后面可能比较好,而且跟前面的代码是有空格间隔的。你可以看看上面的效果图,对比一下。
效果很好,非常感谢。
这个在多层嵌套代码中很实用。
这个是使用lsp-dart产出的效果。