Xal*_*dew 5 emacs elisp yasnippet
最近才开始将 yasnippet 用于 emacs 并且非常喜欢它的工作方式,但是我遇到了一个小麻烦,如果可能的话,我需要一些帮助来解决。
我特别喜欢的一个片段是“for”片段,即:
# -*- mode: snippet -*-
# name: for
# key: for
# --
for (${1:i = 0}; ${2:i < N}; ${3:i++}) {
$0
}
Run Code Online (Sandbox Code Playgroud)
然而,我最近开始从事一个我们有不同编码风格的项目。只需将上面的代码片段更改为将起始大括号位置更改为:
# -*- mode: snippet -*-
# name: for
# key: for
# --
for (${1:i = 0}; ${2:i < N}; ${3:i++})
{
$0
}
Run Code Online (Sandbox Code Playgroud)
然而,我想轻松地在不同的项目之间切换,从而在不同的编码风格之间切换,而无需手动更改片段或创建许多重复项。所以我认为应该可以在代码片段中编写一些 elisp 代码来自动适应当前活动的编码风格。
环顾一些 Emacs/elisp 文档,我发现了所谓的 c-hanging-brace-alist ( GNU doc ),我觉得我应该能够以某种方式使用它。但是,我从未真正在 elisp 中进行过任何编程,而且我不确定如何实现这一点。任何帮助或建议将不胜感激!
这是一个建议:
定义一个变量来保存当前的编码风格:
(setq current-coding-style 'default)
Run Code Online (Sandbox Code Playgroud)定义一个命令以在默认样式和新项目中使用的样式之间切换,并将其绑定到您选择的键序列:
(defun toggle-coding-style ()
(interactive)
(if (eq current-coding-style 'default)
(setq current-coding-style 'special)
(setq current-coding-style 'default)))
(global-set-key (kbd "C-c t") 'toggle-coding-style) ;; Replace C-c t
;; with another binding
;; if you like
Run Code Online (Sandbox Code Playgroud)定义一个函数,根据当前“活动”的编码风格放置左大括号:
(defun place-brace ()
(if (eq current-coding-style 'default) " {" "\n{"))
Run Code Online (Sandbox Code Playgroud)将代码片段中的左大括号替换for为对此函数的调用(如此处所述,可以通过将任意 Elisp 代码括在反引号中来将其嵌入到代码片段中):
# -*- mode: snippet -*-
# name: for
# key: for
# --
for (${1:i = 0}; ${2:i < N}; ${3:i++})`(place-brace)`
$0
}
Run Code Online (Sandbox Code Playgroud)完成此操作后,您需要在编码样式(以及相应的代码片段扩展)之间切换所需要做的就是按C-c t。