求助:snippet-mode 插入elisp 的补全问题

使用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,哭。

https://emacs-china.org/search?q=mmm-mode

我写了一个命令来插入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, see@https://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 个赞