按列表中的条目替换yasnippet字段

时间:2013-08-07 15:32:20

标签: emacs

最近,我偶然发现了"A quick way to repeatedly enter a variable name in Emacs?"这个问题,要求提供一种“即时”创建和扩展代码段的方法。我还找到了由问题的作者创建的包auto-yasnippet,这可能是他的问题的结果。我非常喜欢这个包,但我想扩展功能。该软件包允许执行以下操作:

您编写以下代码段:

convert img$1.jpg -monochrome -resize 50% -rotate 180 img$1_mono.pdf

致电aya-create,输入新行并致电aya-expand:粘贴上述代码,您可以替换占位符($1$2,...)正如你对一个普通的yasnippet所做的那样。

这是一个很棒的功能,但是,如果你必须创建代码片段的许多副本并输入扩展字符串,那就不那么有趣了。如果用于扩展占位符,则传递列表(或列表列表,如果您有多个占位符)将会很不错。假设我必须将文件img_1.jpg调用上面的内容到img_9.jpg,结果应该调用img_a_mono.jpgimg_k_mono.jpg,因此可以创建列表:

(setq foo-list '( '( 1 2 3 4 5 6 7 8 9 ) '( a b c d e f g h i j k ) )

编写代码段

convert img$1.jpg -monochrome -resize 50% -rotate 180 img$2_mono.pdf

并调用扩展函数指定foo-list作为参数。 [当然,人们可以通过像number-sequence]

这样的函数动态创建这些列表

我担心自己对自己的编码不够熟练,但是,也许有人掌握了这些技能,并且看到了这个功能的使用。

1 个答案:

答案 0 :(得分:2)

我写了另一个package,现在可以完成你描述的工作。 相关摘录是:

m1\n10&convert img&s.jpg -monochrome -resize 50% -rotate 180 img&s_mono.pdf

它扩展到

convert img1.jpg -monochrome -resize 50% -rotate 180 img1_mono.pdf
convert img2.jpg -monochrome -resize 50% -rotate 180 img2_mono.pdf
convert img3.jpg -monochrome -resize 50% -rotate 180 img3_mono.pdf
convert img4.jpg -monochrome -resize 50% -rotate 180 img4_mono.pdf
convert img5.jpg -monochrome -resize 50% -rotate 180 img5_mono.pdf
convert img6.jpg -monochrome -resize 50% -rotate 180 img6_mono.pdf
convert img7.jpg -monochrome -resize 50% -rotate 180 img7_mono.pdf
convert img8.jpg -monochrome -resize 50% -rotate 180 img8_mono.pdf
convert img9.jpg -monochrome -resize 50% -rotate 180 img9_mono.pdf
convert img10.jpg -monochrome -resize 50% -rotate 180 img10_mono.pdf

语法如下:

m[<range start:=0>][<separator:= >]<range end>[lisp expr][&][format expr]

x是elisp表达式中的默认var。它将逐一进行 范围内所有数字的值。

&表示elisp expr已经结束,格式expr已经开始。 如果只有一个,它可以用作格式expr的一部分。 密钥与format的密钥相同:我只是翻译&amp;到%。

您可以在tiny.el的评论部分找到更多摘要。

UPD:expr现在可以返回一个列表

根据您的建议,这是下一步的改进。 这一个没有辅助变量(96是(- ?a 1)的值):

m1\n10listx+x96&convert img&s.jpg -monochrome -resize 50% -rotate 180 img&c_mono.pdf

这个是辅助变量。首先你定义它(当然使用tiny :):

(setq foo-list '(m 10+x97&?&c))

将此扩展为

(setq foo-list '(?a ?b ?c ?d ?e ?f ?g ?h ?i ?j ?k))

以下是你如何使用它:

m1\n10listxnthxfoo-list&convert img&s.jpg -monochrome -resize 50% -rotate 180 img&c_mono.pdf

扩展将是

convert img1.jpg -monochrome -resize 50% -rotate 180 imga_mono.pdf
convert img2.jpg -monochrome -resize 50% -rotate 180 imgb_mono.pdf
convert img3.jpg -monochrome -resize 50% -rotate 180 imgc_mono.pdf
convert img4.jpg -monochrome -resize 50% -rotate 180 imgd_mono.pdf
convert img5.jpg -monochrome -resize 50% -rotate 180 imge_mono.pdf
convert img6.jpg -monochrome -resize 50% -rotate 180 imgf_mono.pdf
convert img7.jpg -monochrome -resize 50% -rotate 180 imgg_mono.pdf
convert img8.jpg -monochrome -resize 50% -rotate 180 imgh_mono.pdf
convert img9.jpg -monochrome -resize 50% -rotate 180 imgi_mono.pdf
convert img10.jpg -monochrome -resize 50% -rotate 180 imgj_mono.pdf