让company-yasnippet更好的工作

company-yasnippet的candidates应该只是在点之前工作。这样补全的时候就不会扰乱lsp的返回,我的company-backends 是(company-capf company-yasnippet).

  (defun company-yasnippet/disable-after-dot (fun command &optional arg &rest _ignore)
    (if (eq command 'prefix)
        (let ((prefix (funcall fun 'prefix)))
            (when (and prefix (not
                            (eq
                                (char-before (- (point) (length prefix)))
                                ?.)))
            prefix))
        (funcall fun command arg)))

  (advice-add #'company-yasnippet :around #'company-yasnippet/disable-after-dot)

效果 test1

3 个赞

Smart! 测试效果很不错,解决了很久的困扰,终于接近 VSC 的效果了

vim里一直就是这么工作的。我一直对比的是vim。。vsc我真没觉得那么好啊??!!vi is the best texteditor :grinning:

补全最好的还是宇宙级神器 VS。很多都是模仿它的行为,包括 vim。company-yasnippet设计的有点傻,用起来不方便。后来懒得折腾,干脆单独设置快捷键使用,搭配 ivy-snippet也凑合。但是这个方法让它显得智能点。我作了一下改进加到我的配置里:

(defun my-company-yasnippet-disable-inline (fun command &optional arg &rest _ignore)
      "Enable yasnippet but disable it inline."
      (if (eq command 'prefix)
          (when-let ((prefix (funcall fun 'prefix)))
            (unless (memq (char-before (- (point) (length prefix))) '(?. ?> ?\())
              prefix))
        (funcall fun command arg)))
(advice-add #'company-yasnippet :around #'my-company-yasnippet-disable-inline)
5 个赞

lsp本身的设计也是为了多个编辑器不单是vs ,vs其实是参考了很多编辑器的优缺点设计的,不应该是很多模仿它。就单说这个行为vim里很早之前就这样了 deoplete 和neosnippet一直都是这么工作的,那时候可没vc。补全这东西 写了这么多年 其实熟悉的语言基本上也不是强需,有时候用新的语言刚开始难免还是得靠补全。。哎。

不知道有多少人用过 VAX。2000 年左右第一次 VC6+VAX,至今印象深刻。snippet 功能和对 C++的良好支持,至今仍然是出类拔萃。现在的 VS 和 VSC 借鉴了不少行为。

这个tab是用什么做到的?tab-bat-mode吗?为什么这么好看

我最大问题是记不住 snippet 的 key,所以我都用 helm-yas-complete 来查。

那个是centaur-tabs

1 个赞

helm-yas-complete 没有这个函数名啊。。。。我都是用 ivy-yasnippet 的。

我也加一个我的改进,添加company-yasnippet的backend来源,避免和lsp搭配起来annotation显得很突兀,搭配起来就是

  (defun maple/company-yasnippet-advice (fun command &optional arg &rest _ignore)
    (if (eq command 'prefix)
        (let ((prefix (funcall fun command)))
          (unless (or (not prefix) (eq (char-before (- (point) (length prefix))) ?.)) prefix))
      (when (and arg (not (get-text-property 0 'yas-annotation-patch arg)))
        (let* ((name (get-text-property 0 'yas-annotation arg))
               (snip (format "%s (Snip)" name))
               (leng (length arg)))
          (put-text-property 0 leng 'yas-annotation snip arg)
          (put-text-property 0 leng 'yas-annotation-patch t arg)))
      (funcall fun command arg)))

另外参考 @seagle0128 配置里的my-company-yasnippet,我也改了一下,可以在当前backend与company-yasnippet里循环调用

    (defun maple/company-yasnippet ()
    (interactive)
    (let ((backend company-backend))
      (company-cancel)
      (company-begin-backend
       (if (eq backend 'company-yasnippet)
           (car company-backends)
         'company-yasnippet))))

1 个赞

默默问一句,演示里用的是什么主题,最近对monokai有些审美疲劳了

doom-horizon

我加上了doc buffer 这样就差不多和vim一样。不过不知道怎么改进了。我想是展开它在docbuffer里。yasnippet不太熟。。。试了下带$符号的markdown渲染。好奇怪 image

这个用当前的 major-mode 渲染更好吧?

是应该用当前的major-mode 渲染的 使用markdown-view-mode,没搞出来。没怎么看markdown代码。凑活这样了 image

你是转换成 markdown 格式了吗?你直接把这个 buffer 设置成当前 major-mode 就不用转换了。

设了majormode的值markdonviewmode,然后添加使用majormode渲染的设置,没出来,直接设置要传个mode进来,讲道理应该不用

你加的这个PR怎么又关掉了?好奇什么原因?我之前还一直希望有这样一个feature的来着。

用当前buffer的major-mode渲染是个不错的选择,也可以用 snippet-mode 渲染嘛。不过没有major-mode的 syntax highlighting 了。能不能两者兼顾呢?