请教一个关于yasnippet模板制作的问题


#1

我是个不称职的程序员,翻墙困难看不了官方的教程 :joy:

我想要达到的效果可能是这样:

$1    $2       $3

其中的$2为一个变长的字符串,我希望在有多行上述文本,并且$2长度不一致的时候,$3能够对齐,请问能否实现?应该怎么设置模板?


#2

看楼主的描述,楼主可能需要的不是 yas,而是类似于下面这种的包:

https://github.com/Lindydancer/dynamic-spaces


#3

楼主是想在 yasnippet 模版里实现对齐吧,而不是用 yasnippet 来实现对齐。

也许可以考虑从 minibuffer 依次读入参数 $1、$2、$3,然后计算剩余空格数量,最后动态输出对齐的模版。


#4

我在emacs上还处于学习阶段,目前使用的是spacemacs的程序包。

3楼的答案我可能不是特别明白意思和效果。

2楼的插件看起来和我的目的差不多了,但是能否更深入一步?比如我用yasnippet制作一个table,当输入tb4x3这样的东西时,展开成为一个4行3列的表格,然后从第一个单元格开始快速的切换,并且还能实现每列的首字母对齐,这样可以实现吗?


#5

为什么不用 org table ?


#6

对不起,我具体说一下我的应用场景吧:

我编辑C文件,头部一般放一个CHANGELOG的注释表格。看起来大概像是这样

/**
 * CHANGELOG
 ***********************************************************************************
 * DATE                    AUTHOR                      DESCRIPTION
 * $DATE1                  $SOMENAME                   DES1
 * $DATE2                  $OTHERLENGHT                DES2
 */

我希望把插入表格和插入一行都作为一个yas快速输入,但是修改者名字长度不同的时候我希望描述可以自动对齐。。


#7

yas + dynamic-spaces 不行吗?你可以先试一下,然后把你不满意的地方再拿过来讨论。


#8

应该是可以的,我想请教一下可以把dynamic spaces内置到yas的模板里面吗?


#9

没有必要,你可以用 yas 先插入骨架,然后开启 DS 就行了,DS 是一个 minor mode。也可以设置 C mode 默认开启 DS。


#10

好的,多谢!我先尝试一下。


#11
# -*- mode: snippet -*-
# name: parameter-aligment
# key: pa
# type: command
# --
(let ((yas-good-grace nil)
      (parm1 (read-string "Parameter 1: "))
      (parm2 (read-string "Parameter 2: "))
      (parm3 (read-string "Parameter 3: "))
      (parm4 (read-string "Parameter 4: ")))
  (yas-expand-snippet
   (concat
    "// *****************************************************************************\n"
    "// " (format "%-50s, %s\n" parm1 parm2)
    "// " (format "%-50s, %s\n" parm3 parm4)
    "// *****************************************************************************\n"
    )))

输入 pa 按 TAB 补全,根据提示依次输入长度不一的参数名,例如:

a
b
ccccccccccccc
ddddddddddddddddddd

得到:

// *****************************************************************************
// a                                                 , b
// ccccccccccccc                                     , ddddddddddddddddddd
// *****************************************************************************

这种方式的缺点是:输入完最后一个参数,才能看到结果,没有那种编辑实时调整宽度的快感。


2 楼 提到的 package,在 yasnippet 展开的时候使用,是否会冲突?

其实也可以等 yasnippet 展开填写完之后,统一调整。

还可以在 yasnippet 展开的时候启用 evil 的 replace 模式?


yasnippent的问题:你们是怎么处理变长参数和嵌套的?
#12

对齐这种事,最好由专门的包/插件来完成。扩展性要好得多。


#13

我还真提交过一个 snippet,除了没有自动对齐,和你的描述表现的 一模一样 。不过是 Vim 下的 ultisnips。

要实现这点,就需要插件支持 snippet 的“参数化”运行。yasnippet 和 ultisnips 的文档我都看过,yasnippet 基本不可能实现。

不过 table 的话,还是像 @et2010 说的:不如直接使用 org table,效果要好得多。“参数化”运行的用处体现在别处:

比如 lorem 的 snippet,输入 lorem 展开就是默认的 lorem 段落,输入 lorem5 则给出 5 个词语,lorem10 给出 10 个词语……等等。除此之外,“参数化”运行肯定还有别的典型应用场景。

那个输入 tb4x3 展开成 4 行 3 列表格的 snippet,我就不录屏了。感兴趣的话自己去尝试一下。

联动贴:Emacs 除了 YASnippet 之外还有没有更好一点的片段插件?


#14

请教一下这个用 Yasnippet 怎么实现,我把 Yasnippet 的文档看了一下,也到 issue 搜了一下,都没有找到类似例子。


#15

是 Vim 插件 UltiSnips 的功能。到 Yasnippet repo 下提 feature request 。


更正:“参数化”说法不准确。就 UltiSnips 来说,是正则 trigger words 和匿名 snippet,分别解决 fuzzy 展开以及动态 tabstop 的问题。


#17

动态创建snippet yasnippet也能做到 只需要加个hook


#18

更新了下 markdown 的 table snippet,增加了自动对齐功能。

用法 tb23<tab> ,俩单数字分别为行、列。

table


#19

很 有 意 思