lsp-bridge -- 速度最快的语法补全插件

lsp-bridge远程补全技术的架构图

8 个赞

忘记了查找定义的功能也需要支持远程文件, 才推送补丁修复了这个问题。

lsp-bridge 能在 M-: RET (也就是 eval-expression 的回显区)里使用么?

理论上是可以的,因为elisp补全本身就是线程搜索,但是一般不会这样用,minibuffer空间太小了,移动光标不方便。

有这个想法是因为之前还在用corfu时,它的这个配置可以开启 minibuffer 补全,M-: 时就很好用:

相关代码:

;; src: https://github.com/minad/corfu#completing-in-the-minibuffer 

;; 1. 
(defun corfu-enable-in-minibuffer ()
  "Enable Corfu in the minibuffer if `completion-at-point' is bound."
  (when (where-is-internal #'completion-at-point (list (current-local-map)))
    ;; (setq-local corfu-auto nil) ;; Enable/disable auto completion
    (setq-local corfu-echo-delay nil ;; Disable automatic echo and popup
                corfu-popupinfo-delay nil)
    (corfu-mode 1)))
(add-hook 'minibuffer-setup-hook #'corfu-enable-in-minibuffer)

;; 2. 
(defun corfu-enable-always-in-minibuffer ()
  "Enable Corfu in the minibuffer if Vertico/Mct are not active."
  (unless (or (bound-and-true-p mct--active)
              (bound-and-true-p vertico--input)
              (eq (current-local-map) read-passwd-map))
    ;; (setq-local corfu-auto nil) ;; Enable/disable auto completion
    (setq-local corfu-echo-delay nil ;; Disable automatic echo and popup
                corfu-popupinfo-delay nil)
    (corfu-mode 1)))
(add-hook 'minibuffer-setup-hook #'corfu-enable-always-in-minibuffer 1)

期待猫大有空时顺手实现一个 ( :stuck_out_tongue_winking_eye:

这个倒不难,zsbd

1 个赞

Done

https://github.com/manateelazycat/lsp-bridge/commit/9b86c50984578c554189105cdd38aef12ebb2019

3 个赞

测试了,好用好用,多谢大佬~

1 个赞
  • 安装好lsp-bridge,试图在本地Emacs中使用 M-x lsp-bridge-open-remote-file 访问服务器文件时报错:

Connet user@ip_addr:port failed, please make sure 'lsp_bridge.py' has start at server.

  • 安装lsp-bridge的过程如下:

    • 在server上clone下来lsp-bridge的代码
    • python lsp-bridge/lsp_bridge.py
    • pip install pyright
  • 本地Emacs的访问命令为:

    • M-x lsp-bridge-open-remote-file user@ip_addr:port/home/user/file
  • 服务器上已存储本地机器的公钥。

  • 环境:

    • 本机 Windows10, 服务器 Ubuntu 22.04 Server
    • 服务器有conda环境,但pyright和相关依赖安装在非conda环境中,在非conda环境中运行lsp_bridge.py脚本

粘贴一下远程 lsp_bridge.py 的终端输出和本地 Emacs *lsp-bridge* buffer 的日志。

很奇怪呀。

你用终端模拟器, 用同样的 user@ip:/path/file 可以直接用公钥登录服务器?

使用Windows终端测试,结果是:

  • ssh user@ip_addr:port 不能连接
  • ssh user@ip_addr -p port 可以连接

我知道了, 我的SSH公钥是读取 ~/.ssh 目录下的第一个 *.pub 文件。

你Windows的公钥估计不是存在在这个目录的, 导致 lsp-bridge 无法正常登录到远程服务器。

可能这里被Emacs翻译成了C:\Users\name\AppData\Roaming\.ssh,但公钥确实不在这个目录下边,我去试试改一下。

谢谢大佬回复!

1 个赞

如果可以的话, 可以提一个补丁, 看看把Windows默认的SSH公钥位置加上去, 这样其他 lsp-bridge/windows 用户就不会挂了。

猫哥,我在Emacs里用eshell测试了一下上面的路径问题

  • 从结果来看,Emacs没有把他翻译成C:\Users\name\AppData\Roaming\.ssh
  • 另外也将~/.ssh复制到C:\Users\name\AppDataRoaming目录下了,仍不能连接远端。
  • 可能相关的两点:
    • 我使用了purcell的插件exec-path-from-shell
    • 远程存在conda环境,但lsp_bridge.py使用系统python环境运行的

那只能一点点加print语句看卡在什么地方了。

1 个赞

请问一下为什么补全的选项不是按照相关性排列呢?

比如App.vue文件里面

但是在neovim里面

所用的最小化配置(lsp-bridge已经git pull了)

add-to-list 'load-path "~/.emacs.d/.local/straight/repos/yasnippet")
(add-to-list 'load-path "~/.emacs.d/.local/straight/repos/posframe")
(add-to-list 'load-path "~/.emacs.d/.local/straight/repos/markdown-mode")
(add-to-list 'load-path "~/.emacs.d/.local/straight/repos/lsp-bridge")
(require 'yasnippet)
(yas-global-mode 1)
(require 'posframe)
(require 'markdown-mode)
(require 'lsp-bridge)
(global-lsp-bridge-mode)

有些人喜欢字符少的放前面, 有些人喜欢相关性, 众口难调。