在 spacemacs 中插入代码片段的最佳方法是什么

What is the best way to insert a snippet of code in spacemacs

我有一个函数,它基本上插入 function () {}; 但正确缩进并且光标定位正确:

(defun insert-function-js ()
  (insert "function () {
};"))

(define-key evil-normal-state-map (kbd "SPC dg")
  (lambda ()
    (interactive)
    (call-interactively 'evil-insert)
    (insert-function-js)
    (evil-force-normal-state)
    (call-interactively 'evil-visual-char)
    (call-interactively 'evil-previous-line)
    (call-interactively 'indent-region)
    (call-interactively 'evil-open-below)))

这看起来很麻烦。我想有更好的方法来编写这个功能!更好地利用 elisp 功能的一种。

感谢您的帮助!

作为第一个问题的答案,您可以使用 yasnippet 和基于 Spacemacs [1] 提供的 function 片段的片段来为您完成此操作:

# -*- mode: snippet; require-final-newline: nil -*-
# name: my-function
# key: fn 
# --
function () {
         [=10=]
};

如果您将此片段放入 ~/.emacs.d/private/snippets/ 中的新文件中,您可以通过键入 fn 然后按 M-/ [2 ].如果 yas-indent-line 设置为 'auto(在 Spacemacs 中默认设置),那么函数应该正确缩进,代码段中的 [=17=] 在插入后将光标置于该位置.

yasnippet-扩展形成一个单一的撤消操作。


[1] 默认的 function 片段可以在 ~/.emacs.d/elpa/yasnippet-<VERSION>/snippets/js-mode

中找到

[2] 使用默认的 Spacemacs 绑定,这会调用 hippie-expand,后者又会调用 yas-expand.