是否可以在适当的模式下使yasnippet扩展组织模式babel部分中的代码片段?


10

例如,我有一个具有以下内容的组织模式

#+BEGIN_SRC emacs-lisp


#+END_SRC

是否可以通过这种方式配置yasnippet,以便所有emacs-lisp-mode片段都可以在该块内扩展,而不能在该块外扩展?


6
我认为“标准”方式是C-c '无论如何都要编辑这些块-在这种情况下,emacs-lisp主模式会在单独的窗口中编辑块时加载适当的yasnippet代码段(这也要注意正确的缩进)等)
VanLaser

是的,我同意VanLaser的回应。它适用于emacs支持的任何语言。
dmg

哦,是的。你是对的。您可以在答复中提出这个问题,以便我将您的答复标记为正确吗?我没想到:P
拉法·德·卡斯特罗

Answers:


7

从2017年1月22日开始,如果您设置org-src-tab-acts-nativelyorg-src-fontify-natively,则源代码块中的TAB将扩展该块语言的摘要。您可能希望设置yas-buffer-local-condition为阻止组织模式代码段遮盖阻止模式的代码段:

(defun my-org-mode-hook ()
  (setq-local yas-buffer-local-condition
              '(not (org-in-src-block-p t))))
(add-hook 'org-mode-hook #'my-org-mode-hook)

另请参见https://github.com/joaotavora/yasnippet/issues/761https://github.com/joaotavora/yasnippet/pull/760


2

为此,我使用两种方法。我有一些组织摘要可帮助我创建babel标头。例如,此代码为Babel创建C ++-14标头。我输入<s C++_并展开:

# -*- mode: snippet -*-
# name: c++_header
# key: C++_
# --
C++ :main no :flags -std=c++14 -Wall --pedantic -Werror :results output :exports both
#include <iostream>
int main()
{
   $0

   return 0;
}

然后,我使用Cc'切换到特定的语言模式,并使用该语言的代码段。然后使用Cc'返回到org文件。它运作良好。


0

正如npostavs已经回答的那样,根据一个组织模式文件中的语言,代码片段的扩展方式有所不同。

只需在Python或Emacs Lisp代码块中键入“ co”和[tab]。

#+BEGIN_SRC python :session *Python* :results output
co[tab]
# comment
#+END_SRC

#+BEGIN_SRC emacs-lisp :results value scalar
co[tab]
                                        ; comment
#+END_SRC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.