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)
效果
3 个赞
Smart! 测试效果很不错,解决了很久的困扰,终于接近 VSC 的效果了
vim里一直就是这么工作的。我一直对比的是vim。。vsc我真没觉得那么好啊??!!vi is the best texteditor
补全最好的还是宇宙级神器 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
来查。
helm-yas-complete
没有这个函数名啊。。。。我都是用 ivy-yasnippet
的。
xiyang
13
我也加一个我的改进,添加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 个赞
xiyang
14
默默问一句,演示里用的是什么主题,最近对monokai
有些审美疲劳了
我加上了doc buffer 这样就差不多和vim一样。不过不知道怎么改进了。我想是展开它在docbuffer里。yasnippet不太熟。。。试了下带$符号的markdown渲染。好奇怪
是应该用当前的major-mode 渲染的 使用markdown-view-mode,没搞出来。没怎么看markdown代码。凑活这样了
你是转换成 markdown 格式了吗?你直接把这个 buffer 设置成当前 major-mode 就不用转换了。
设了majormode的值markdonviewmode,然后添加使用majormode渲染的设置,没出来,直接设置要传个mode进来,讲道理应该不用
你加的这个PR怎么又关掉了?好奇什么原因?我之前还一直希望有这样一个feature的来着。
用当前buffer的major-mode渲染是个不错的选择,也可以用 snippet-mode
渲染嘛。不过没有major-mode的 syntax highlighting 了。能不能两者兼顾呢?