使用yasnippet,在 snippet-mode下编写snippets时偶尔需要插入elisp,请问如何开启company的elisp补全呢?
比如在`(…)` 和 ${1:$(…)}插入elisp的时候。
我的company-backends如下:
((company-capf . #1=(:with company-yasnippet))
(company-semantic . #1#)
(company-dabbrev-code company-gtags company-etags company-keywords . #1#)
(company-files . #1#)
(company-dabbrev . #1#))
snippet-mode是不带elisp补全的,也不带elisp indent……简单的办法是把snippet复制到scratch里面写,写完再回来用snippet-mode的load/save功能……
哦哦,还是有点麻烦。我现在试了一下,在lisp-interaction-mode里继承了snippet-mode的snippets,然后有需要就直接在scratch里写就行,除了没有snippet-mode的语法高亮,其他都OK。
或者我直接绑定一个切换mode的快捷键,需要就切换。我还有个想法,在snippet-mode下,当光标处于``或者$()之间时,切换为lisp-mode,光标跳出来就切换为snippet-mode,估计要用正则,可是我不会elisp,哭。
我写了一个命令来插入elisp code,需要安装 edit-indirect 这个package。
;; inspired by `markdown-edit-code-block'
(defun yas-edit-elisp-indirect ()
"Insert elisp code in `snippet-mode' with `edit-indirect'."
(interactive)
;; `edit-indirect-guess-mode-function' is dynamic scope, need require
;; before use let binding, [email protected]://emacs-china.org/t/emacs/15580/2?u=cheunghsu
(require 'edit-indirect)
(unless (use-region-p) (insert "` `"))
(let* ((visual (region-active-p))
(begin (if visual (region-beginning) (- (point) 2)))
(end (if visual (region-end) (- (point) 1)))
(edit-indirect-guess-mode-function
(lambda (_parent-buffer _beg _end)
(funcall 'lisp-interaction-mode))))
(when visual (search-forward "`" nil t 1))
(save-excursion
(edit-indirect-region begin end 'display-buffer)
(unless visual (delete-char -1)))
))
1 个赞