用于不同编码风格的 Emacs Yasnippet

标签 emacs elisp yasnippet

最近刚开始将 yasnippet 用于 emacs,并且非常喜欢它的工作方式,但是我遇到了一个小麻烦,如果可能的话,我希望得到一些帮助来解决。

我特别喜欢的一个片段是“for”片段,即:

# -*- 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 中进行过任何编程,而且我不确定如何实现这一点。任何帮助或建议将不胜感激!

最佳答案

这是一个建议:

  • 定义一个变量来保存当前的编码风格:
    (setq current-coding-style 'default)
    
  • 定义一个命令以在默认样式和新项目中使用的样式之间切换,并将其绑定(bind)到您选择的键序列:
    (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
    
  • 定义一个根据当前“事件”的编码样式放置左大括号的函数:
    (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。

    关于用于不同编码风格的 Emacs Yasnippet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25949306/

    相关文章:

    regex - 正则表达式作为触发器

    emacs - 我可以更改 Emacs 查找文件的历史记录吗?

    emacs - 在 emacs lisp 中启动进程,该进程在 lisp 程序结束后继续

    elisp - 针对 "kill-ring-save"的建议

    Emacs:仅加载必要的 yasnippets

    python - Emacs 中的 Rope 和 Yasnippet

    emacs - 尝试使用捕获时的组织模式设置问题

    c - 重命名结构成员及其在文件中的所有用法

    vim - 在 Emacs viper 模式下禁用 ESC 作为元数据?

    Emacs -- 如何删除覆盖(列表形式)