如果你有一个 git 项目有多个子目录, 你需要定制 lsp-bridge-get-single-lang-server-by-project , 让 lsp-bridge 子目录来返回 project_name。
这样 lsp-bridge 就忽略 git 而用 lsp-bridge-get-single-lang-server-by-project 规则来查找项目的 root path.
如果你有一个 git 项目有多个子目录, 你需要定制 lsp-bridge-get-single-lang-server-by-project , 让 lsp-bridge 子目录来返回 project_name。
这样 lsp-bridge 就忽略 git 而用 lsp-bridge-get-single-lang-server-by-project 规则来查找项目的 root path.
今年时间够呛, 主要我平常都用目测来写代码, 很少用调试器, 除非是别人的项目。
动力严重不足, 但是 dap 的协议类似 lsp, 用 lsp-bridge 应该是完全可以做到的, 而且实现后性能要强很多。
ipynb 是啥?
lsp-bridge 主要就是对标性能, VSCode有多快, lsp-bridge就有多快。
就是 jupyter notebook,现在也有 emacs 插件,不过界面和 vim 模式的支持暂时没有 vscode 里面的好用。
jupyter 可以在 Web 上运行吗? 可以的话, 可以考虑结合 EAF 来用。
dap-mode 依赖 lsp-mode, 需要安装 lsp-mode 才行,然后用下面的 wrapper 可以在不启动 lsp-mode 的情况下使用 dap-mode
;; 下面的 wrapper 可以在不启动 lsp-mode 的情况下通过 lsp-workspace-root 获取正确的值
(eval-and-compile
(defun my--ensure-lsp-workspace-root()
"Ensure `lsp-workspace-root' valid."
(require 'lsp-mode)
(unless (lsp-workspace-root)
(let* ((session (lsp-session))
(lsp-auto-guess-root t)
(project-root (lsp-f-canonical (lsp--calculate-root session (buffer-file-name)))))
(unless (-contains? (lsp-session-folders session) project-root)
(cl-pushnew project-root (lsp-session-folders session))
(lsp--persist-session session))
))))
(defun my/dap-debug()
"dap-debug wrapper."
(interactive)
(require 'dap-mode)
(my--ensure-lsp-workspace-root)
(call-interactively #'dap-debug)
)
完整的 dap 配置见:GitHub - xhcoding/.emacs.d: A simple Emacs config on Windows
补全可以用了,但是定义跳转不能用,提示没有相关定义,切回lsp-mode是没问题的
最麻烦的地方是 jupyter notebook 的 web 版本的每一个单元格的编辑框就是一个 web 的编辑框,而不是 emacs 的 buffer,因此即使它可以在 eaf 里运行,也是一个普通的网页来运行。
vscode 是重写了整个 jupyter notebook 的前端,所以每一个单元格都可以当作一个正常的 vscode 的文本编辑区域来使用。
原来如此,我还以为 vscode 是用 html + CSS 来实现 jupyter notebook 的呢。
jupyter 就是在 Web 上运行上,现在个人使用体验最好的就是 google 的 colab。
eaf 需要一个额外的 leader key 才能将按键发送到浏览器,我比较习惯在浏览器中也用类 vim-mode 进行浏览,多了个 leader key 总是适应不了。
EAF可以直接用 switch_to_input_mode (Alt + z) 来切换成输入模式, 就不需要 leader key 了。
这样呀,是我蠢了 。等我后续再尝试一下 eaf。
eaf-browser访问 localhost:8888 的 jupyter notebook 感觉挺好的
h 可以看看快捷键
没有了解到这一点之前,在用 org-mode 文学编程,也挺不错
破案了,是after-change
之后的search-regexp
系把smerge依赖的matching-beginning
跟match-end
给冲走了。
不知道大佬有什么思路去修这个,我手动补了几个save-match-data
之后刚修好,pull了master之后又不好用了,因为有新的代码用了search-regexp
你详细写一下这个重现步骤和问题吧,我有点没看懂你说的东西。
在smerge-mode下,在conflict marker里跑smerge-keep-lower
<<<<<<< HEAD
this.code.doThat(true, false);
=======
this.code.doThis(true);
this.var = blah;
>>>>>>> b66071d1 (refactor: fix bug)
这个smerge最后会用到下面的code
;; /usr/local/share/emacs/29.0.90/lisp/vc/smerge-mode.el.gz:299
(defun smerge-keep-n (n)
(smerge-remove-props (match-beginning 0) (match-end 0))
;; We used to use replace-match, but that did not preserve markers so well.
(delete-region (match-end n) (match-end 0)) ;; lsp-bridge会监控到变化,search-backward-regexp 会代替掉global的matching beginning
(delete-region (match-beginning 0) (match-beginning n))) ;; match-beginning已经被修改 (match-beginning n)会返回nil, delete-region失败
我在我的旧版本里wrap了几个地方,但是pull了master之后就不work了。这个不能从根本上解决问题
manual上是这么写的,但lsp bridge应该不是process filter functions也不算process sentinels?
Emacs automatically saves and restores the match data when it runs process filter functions (see Process Filter Functions) and process sentinels (see Sentinels: Detecting Process Status Changes).
这个黑名单试一下?
试过了不work
;; Send change_file request to trigger LSP completion.
(when (or (lsp-bridge-call-file-api-p)
(lsp-bridge-is-remote-file))
(lsp-bridge-call-file-api "change_file"
lsp-bridge--before-change-begin-pos
lsp-bridge--before-change-end-pos
length
(buffer-substring-no-properties begin end)
(lsp-bridge--position)
(acm-char-before) ;; <====== 这行已经破坏了match
(buffer-name)
(acm-get-input-prefix)))
;; Complete other non-LSP backends.
(lsp-bridge-complete-other-backends)
看不懂你说的啥意思。