前言

上一篇文章讲了如何如何在 Emacs 中使用 Snippet 来快速编写代码,提高效率。

虽然很多插件已经为我们准备好了现成的模板,但有时我们需要一些个性化的代码片段。

今天,我们就一起来学习如何在Emacs中创建自己的Snippets吧!

自定义 Snippet

要开始创建自己的代码片段,只需在Emacs中按下 M-x 然后输入 yas-new-snippet,或者直接使用快捷键 C-c C-n。

这将打开一个新的编辑窗口,并且自动进入 snippet-mode 。里面预设了一些基本信息,看起来像这样:

1
2
3
4
# -*- mode: snippet -*-
# name:
# key:
# --
  • name 是 Snippet 的名称

  • key 当你需要调用这个片段时,只需要输入这里的关键词,再按 Tab 键就能触发代码的自动填充。

    #-- 后面的内容就是展开后的内容

编写完成后使用 C-c C-c 来保存。

模板语法

Snippet 中可以插入任意的文本,不过 $` 是特殊的,需要使用 \ 转义。

$Snippet 中表示这个地方的内容需要手动输入,帮我占着这个位置,也就是占位符,可以通过 TAB 在占位符之间切换。

$ 通常跟随一个数字,表示第几个位置,例如 $1 表示第一个位置,展开后光标默认就在这个地方,以此类推。

占位符还可以有默认值,它需要跟者一对 {} ,然后用 : 分割位置和默认值。也可以不用数字直接写默认值 ${var}

例如: 这是一个 ${1:100} 测试 展开后光标会停在 100 的左边,然后一旦你输入内容后,100 就会被替换,用 TAB 就会跳到下一个 100 就会保留。

$0 表示所有占位符都确认后光标所停在的位置。

比如在 for 循环,我们希望最后光标在循环体里,这时候 $0 就非常有用。

下面是 pythonfor insnippet ,当输完后就会进入到循环体里,这样方便编写逻辑。

1
2
for ${var} in ${collection}:
    $0

执行 Emacs Lisp 代码

Emacs Lisp 代码使用 ` 包裹,将会在扩展的时候执行这个代码,从而可以动态的生成一些片段

比如想要插入当前时间可以这么写

1
2
3
4
5
# -*- mode: snippet -*-
# name: time
# key: time
# --
`(current-time-string)`

总结

  • 使用 yas-new-snippet 创建新的 Snippet
  • $ 表示占位符,后面的数字表示光标移动的顺序,可以使用 ${number:default value} 添加默认值
  • 使用 ` 编写的代码会在展开的时候执行

参考

Writing snippets