zbelial / lspce

LSP Client for Emacs implemented as a module using rust.
GNU General Public License v3.0
154 stars 11 forks source link

可以实现Format功能吗? #21

Closed lynnux closed 7 months ago

lynnux commented 7 months ago

作者大大好,这个包很好,我很想拿它代替eglot,速度很快,不足的就是缺少format功能,是否有计划实现呢?

lynnux commented 7 months ago

另外这里记录下一些发现的问题:

  1. 当用python时会选择两个server,但选择其中之一后会提示:lspce--connect: No valid server.,发现是lspce--choose-server的问题,这个只会返回nil,我用的是vertico,看代码你好像用的ivy,不知道是不是这个原因?我直接在lspce-server-programs去掉一个python server解决。
  2. 对没有server的文件开启lspce-mode,如xml文件打开lspce-mode,补全会报错:
    
    Debugger entered--Lisp error: (wrong-type-argument hash-table-p nil)
    gethash("completionProvider" nil)
    lspce--server-capable("completionProvider")
    (and t (lspce--server-capable "completionProvider"))
    (let* ((completion-capability (and t (lspce--server-capable "completionProvider")))) (if completion-capability (let* ((trigger-chars (lspce--server-capable-chain "completionProvider" "triggerCharacters")) (bounds (bounds-of-thing-at-point 'symbol)) (bounds-start (lspce--completion-bounds-start (cl-first bounds) trigger-chars)) (sort-completions #'(lambda (completions) (cl-sort completions ... :key ...))) done? (cached-proxies :none) (proxies #'(lambda nil (let* ... ... ...))) (resolved (make-hash-table)) (resolve-maybe #'(lambda (lsp-item) (or ... ...)))) (list bounds-start (point) #'(lambda (probe pred action) (let (collection) (cond ... ... ... ... ...))) :annotation-function #'(lambda (proxy) (if lspce-completion-no-annotation nil (let* ... ... ... ...))) :company-require-match 'never :company-kind #'(lambda (proxy) (let* (... ...) (if kind ...))) :company-deprecated #'(lambda (proxy) (let (... tags deprecated) (progn ... ...) (or ... ...))) :company-doc-buffer #'(lambda (proxy) (let* (... ...) (if formatted ...))) :company-prefix-length (save-excursion (if (car bounds) (progn (goto-char ...))) (if (hash-table-p completion-capability) (progn (looking-back ... ...)))) :exit-function #'(lambda (proxy status) (if (memq status ...) (progn ...))))) nil))
    lspce-completion-at-point()
    corfu--capf-wrapper(lspce-completion-at-point)
    run-hook-wrapped(corfu--capf-wrapper lspce-completion-at-point)
    corfu--auto-complete-deferred((#<window 3 on xxx.xml> #<buffer xxx.xml> 232 871))
    apply(corfu--auto-complete-deferred (#<window 3 on xxx.xml> #<buffer xxx.xml> 232 871))
    timer-event-handler([t 26006 4541 696078 nil corfu--auto-complete-deferred ((#<window 3 on xxx.xml> #<buffer xxx.xml> 232 871)) nil 0 nil])
lynnux commented 7 months ago

找到format代替品了:https://github.com/lassik/emacs-format-all-the-code/blob/master/format-all.el。其实我就用cpp和xml的format,还没到必须用lsp的format地步

zbelial commented 7 months ago

作者大大好,这个包很好,我很想拿它代替eglot,速度很快,不足的就是缺少format功能,是否有计划实现呢?

当时开始做lspce之前就大概确定了一个原则,Emacs本身已经有且足够好的功能,就不再实现lsp里同类的功能了,Emacs本身的indent我觉得足够满足我需要了,就没实现format。

  • 当用python时会选择两个server,但选择其中之一后会提示:lspce--connect: No valid server.,发现是lspce--choose-server的问题,这个只会返回nil,我用的是vertico,看代码你好像用的ivy,不知道是不是这个原因?我直接在lspce-server-programs去掉一个python server解决。

  • 对没有server的文件开启lspce-mode,如xml文件打开lspce-mode,补全会报错:

这两个问题我再看一下(我先把这个issue打开了,省得忘了)。总体上来说,lspce比其它几个lsp客户端稳定性应该要稍差一些,有些问题在我的环境里不会出现,但因为用户少,就没爆出来了。

最后,感谢试用,感谢反馈。欢迎继续反馈问题 :)

zbelial commented 7 months ago
  1. 当用python时会选择两个server,但选择其中之一后会提示:lspce--connect: No valid server.,发现是lspce--choose-server的问题,这个只会返回nil,我用的是vertico,看代码你好像用的ivy,不知道是不是这个原因?我直接在lspce-server-programs去掉一个python server解决。

    1. 对没有server的文件开启lspce-mode,如xml文件打开lspce-mode,补全会报错:

这两个问题我都尝试改了一下,你可以再试试。

lynnux commented 7 months ago

谢谢,我测试最新的这两个问题已经都解决了。 还有个小问题就是如果server有问题,比如rust安装后有个rust-analyzer占位,但实际没有lsp功能,运行它会报错,这时lspce-mode开启会卡死emacs,查了下发现有个lspce-connect-server-timeout可以控制卡死时间,也就是说lspce connect是同步的。不知道这个好改不,eglot好像connect也是同步的,但有个变量eglot-sync-connect设置为nil就不卡了。这个小问题可以改也可以不改,已经有卡住经验了下次就知道去查server问题了。

zbelial commented 7 months ago

改成完全非同步的工作量稍微大点,最近时间也不多,可能得过段时间才能再看。 有的server(譬如typescript的deno),shutdown也可能卡。我后面一起考虑下怎么改吧。暂时只能先忍受一下这个问题

zbelial commented 7 months ago

这个issue我就先关闭了,后面如果需要再打开。

lynnux commented 7 months ago

改成完全非同步的工作量稍微大点,最近时间也不多,可能得过段时间才能再看。 有的server(譬如typescript的deno),shutdown也可能卡。我后面一起考虑下怎么改吧。暂时只能先忍受一下这个问题

嗯嗯,对的,有个机子shutdown也卡了一次,但我工作的机子暂时没复现。