Copilot 非官方插件

是不是需要更新了?

我用的straight 不知道咋更新,重装一下就好了

请问如何让copilot和corfu一起使用呢?刚入门corfu,想达到跟company如此配置类型的效果:

(defun my-tab ()
  (interactive)
  (or (copilot-accept-completion)
      (company-indent-or-complete-common nil)))

(use-package! copilot
  :hook (prog-mode . copilot-mode)
  :hook (text-mode . copilot-mode)
  :bind (("C-TAB" . 'copilot-accept-completion-by-word)
         ("C-<tab>" . 'copilot-accept-completion-by-word)
         :map company-active-map
         ("<tab>" . 'my-tab)
         ("TAB" . 'my-tab)
         :map company-mode-map
         ("<tab>" . 'my-tab)
         ("TAB" . 'my-tab)))

我直接给copilot加了几个单独的快捷键

  :config
  (bind-key "M-C" 'copilot-accept-completion)
  (bind-key "M-L" 'copilot-clear-overlay)
  (bind-key "M-N" 'copilot-next-completion)
  (bind-key "M-P" 'copilot-previous-completion)

可以通过 C-h k 来看当前某个快捷键(比如 tab)绑定在了哪个 keymap 里,然后用类似的方法替换一下就好了。

等你配好了 corfu 不如来分享一波配置,我塞到 readme 里去(或者你来提 PR 也行)。

1 个赞

你试试

(defun my-tab ()
  (interactive)
  (or (copilot-accept-completion)
      (corfu-complete)))

话说能参考 GitHub - 50ways2sayhard/tabnine-capf: A capf version of company-tabnine: https://github.com/TommyX12/company-tabnine 直接使用 capf 么

这样可以像下面那样通过 cape 把几个后端聚合到一起:

  (when (fboundp #'tabnine-completion-at-point)
    (add-hook 'eglot-managed-mode-hook
            (defun merge-eglot-with-tabnine ()
              (remove-hook 'completion-at-point-functions #'eglot-completion-at-point t)
              (add-hook 'completion-at-point-functions
                        (cape-super-capf
                         #'tabnine-completion-at-point
                         #'eglot-completion-at-point) nil t))))

肯定是可以的,其实最开始我想写成 company 后端来着。

问题在于,copilot 给的补全是多行的,没法完整地作为候选项显示。

另一个问题是,copilot 的补全有网络延迟,通常是一两百毫秒,这可能会导致别的补全得等 copilot,整个体验会下降。

嗯嗯,明白了。tabnine 也有延迟,我这边貌似没有就不显示,不过多行确实是问题,那现在这样也挺好。

emacs 29 和懒猫的lsp-bridge 一起使用时,鼠标的位置不太对诶,在np后面,理应在nump后面,有什么解决方法嘛

可复现的配置在 dotfiles/init-emacs.el at master · lyjdwh/dotfiles · GitHub

image

见 readme 里的 known issues,把一个兼容性选项关了就好。

不知道有没有更好的解决方法。。。

我又折腾了一会,似乎彻底解决了这个心头大患(光标位置正常+没有兼容性问题

2 个赞

在我这里确实彻底解决了,开了annotate-mode也没问题,光标位置也正常 :+1: image

我之前也是这么写的,记得有个问题是按下tab只能接受corfu的补全。我现在换回company了,等以后有时间了再试试~

现在使用corfu 和 cape 的一些后端,copilot 光标位置就正常了

但是再加上 lsp-bridge (目前也使用corfu),光标位置和补全窗口就会在当前输入位置和copilot补全末端 来回跳跃 -_-

似乎还有些兼容性问题

可以用 dotfiles/init-emacs.el at master · lyjdwh/dotfiles · GitHub 测试下

我用 company-box 也有这个问题 之前的两种方案似乎没这个问题,但又有别的问题

难受啊,三种方案都不完美

company-box 和 corfu 都是用的 child-frame,同样的 child-frame 感觉会有通用地方法滴

或者 就根据补全前端设置具体使用哪个方案了

ps: 之前我用 company-box 搭配 copilot ,挺完美的

修了一下,但我只测了 company-box 。

原因是 posn-at-point 得到的位置是 overlay 里 after-string 结束的位置。(参考 motion - Calculating cursor position excluding the overlay after-string - Emacs Stack Exchange

于是 advice 了一波

现在corfu 能用了,但还有个问题,每次copilot 更新补全时,光标会跳到 copilot补全末端 然后再自动跳回来,如果copilot 更新补全比较频繁,光标来回跳就看着不太舒服

修了 (之前某个版本误删东西引入的 bug

1 个赞