emacs yasnippet 产生复杂的模板


#1

自己经常写latex 以及Matlab 代码,经常有一些有规律的代码反复输入,因此,自己想给这个内容创建一个Snippet, 比如 Matlab 里面,使用 Subplot 这个函数,我需要产生产生一个mxn 格式的图像绘制,代码如下(产生一个2x2的绘制,是一个特殊的例子): subplot(2,2,1);imshow();title(’’); subplot(2,2,2);imshow();title(’’); subplot(2,2,3);imshow();title(’’); subplot(2,2,4);imshow();title(’’); 加入我想产生一个随意的subplot ,可以使用这个插件实现吗?一个自己经常写段代码,感觉手实在太麻烦了。


#2

yasnippet 并不支持循环。我建议的解决方法是一个snippet 生成一个subplot,但是其中的参数通过扫描前面的内容自动填充。比如第一个subplot(2,2,1)写好了之后,下次再弄同一个snippet的时候他自动填充subplot(2,2,2).

yasnippet在展开一个snippet之前会检查他的condition directive,这里可以写一些elisp代码。 看我的一个go-lang 里面method的例子.


#3

建议你首先排版一下自己的问题,你现在的排版很难阅读,具体信息可以搜索“markdown 语法”。


#4

总结一下楼主的问题:要根据某时刻的具体情况来输出不定行数的代码。

看起来这里不定的部分只是1 2这些(他们在展开之前就确定了),而yas的应用场景是,输出一些文字,然后让用户在预定义的slot间输入和跳转,所以我感觉这里不需要用yas 哦如果要用 输入abbrev - 展开 这样的用法,而不是快捷键的话,还是要用yas。

yas有command模式,直接用elisp代码定义展开后的所有行为(比如展开quit执行kill-emacs),当然是无所不能,可以做到OP的需求的。具体这里我有两种做法:

  1. 两次read-from-minibuffer来让用户输入矩阵的行和列,然后yas-expand-snippet/insert
  2. 展开后读取abbrev前面的数字来得到行和列,比如规定2,2 plot输出对应2X2矩阵的模板代码,那么展开变成2,2_,往回找到前面形如\d+,\d+_的文字,取到两个数,删掉它们,再按取到的数生成模板代码。

command型snippet这里有个例子: