刚刚开始使用yasnippet进行emacs,并且非常喜欢它的工作方式,但是我遇到了一些小麻烦,如果可能的话,我会帮助解决一些问题。
我特别喜欢的一个片段是" for" -snippet,即:
# -*- mode: snippet -*-
# name: for
# key: for
# --
for (${1:i = 0}; ${2:i < N}; ${3:i++}) {
$0
}
但是我最近开始研究一个我们有不同编码风格的项目。只需将上面的片段更改为将起始位置放置到:
# -*- mode: snippet -*-
# name: for
# key: for
# --
for (${1:i = 0}; ${2:i < N}; ${3:i++})
{
$0
}
然而,我想在不同的项目之间轻松切换,从而在不同的编码风格之间切换,而无需手动更改片段或创建许多重复项。因此,我认为应该可以在代码段中编写一些elisp代码,以自动适应当前活动的编码风格。
环顾一些Emacs / elisp文档,我找到了所谓的c-hanging-brace-alist(GNU doc),我觉得我应该可以以某种方式使用它。但是我从未在elisp中做过任何编程,而且我不确定如何实现这一点。任何帮助或建议将不胜感激!
答案 0 :(得分:1)
这是一个建议:
定义一个变量来保存当前的编码样式:
(setq current-coding-style 'default)
定义一个命令,在默认样式和新项目中使用的样式之间切换,并将其绑定到您选择的键序列:
(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
定义一个函数,根据当前编码样式放置左括号&#34;激活&#34;:
(defun place-brace ()
(if (eq current-coding-style 'default) " {" "\n{"))
通过调用此函数替换for
代码段中的左括号(如here所述,任意Elisp代码可以通过将其封装在反引号中嵌入到代码段中):
# -*- mode: snippet -*-
# name: for
# key: for
# --
for (${1:i = 0}; ${2:i < N}; ${3:i++})`(place-brace)`
$0
}
有了这个,你需要做的就是在编码样式(和相应的片段扩展)之间切换,按 C-c t 。
答案 1 :(得分:0)
我也想知道最近如何以较少侵入性和更一般的方式做到这一点, 幸运的是,我在yasnippet项目中找到了一个关于此的问题: Convert snippets to your brace style · Issue #728 · joaotavora/yasnippet - github.com
简而言之,维护者建议使用yas-after-exit-snippet-hook
来实现它,
这是我接下来的内容:
;; https://en.wikipedia.org/wiki/Indentation_style
;; auto/allman/k&r
(setq my-yasnippet-brace-style 'auto)
;; see https://github.com/joaotavora/yasnippet/issues/728
(setq yas-after-exit-snippet-hook
#'(lambda ()
(let* ((begin yas-snippet-beg)
(end yas-snippet-end)
(snippet (buffer-substring-no-properties begin end))
(point (point))
rep
new-snippet)
(unless (eq 'auto my-yasnippet-brace-style)
(setq rep (case my-yasnippet-brace-style
('allman ")\n{")
(('k&r t) ") {")))
(setq new-snippet (replace-regexp-in-string ")[ \t\r\n]*{" rep snippet))
(delete-region begin end)
(insert new-snippet)
;; XXX what's the proper way to retain point? save-excursion doesn't work.
(goto-char (+ point (- (length new-snippet) (length snippet))))
(indent-region begin end)))))
希望这可能会有所帮助。