我是个不称职的程序员,翻墙困难看不了官方的教程
我想要达到的效果可能是这样:
$1 $2 $3
其中的$2为一个变长的字符串,我希望在有多行上述文本,并且$2长度不一致的时候,$3能够对齐,请问能否实现?应该怎么设置模板?
我是个不称职的程序员,翻墙困难看不了官方的教程
我想要达到的效果可能是这样:
$1 $2 $3
其中的$2为一个变长的字符串,我希望在有多行上述文本,并且$2长度不一致的时候,$3能够对齐,请问能否实现?应该怎么设置模板?
看楼主的描述,楼主可能需要的不是 yas,而是类似于下面这种的包:
楼主是想在 yasnippet 模版里实现对齐吧,而不是用 yasnippet 来实现对齐。
也许可以考虑从 minibuffer 依次读入参数 $1、$2、$3,然后计算剩余空格数量,最后动态输出对齐的模版。
我在emacs上还处于学习阶段,目前使用的是spacemacs的程序包。
3楼的答案我可能不是特别明白意思和效果。
2楼的插件看起来和我的目的差不多了,但是能否更深入一步?比如我用yasnippet制作一个table,当输入tb4x3这样的东西时,展开成为一个4行3列的表格,然后从第一个单元格开始快速的切换,并且还能实现每列的首字母对齐,这样可以实现吗?
为什么不用 org table ?
对不起,我具体说一下我的应用场景吧:
我编辑C文件,头部一般放一个CHANGELOG的注释表格。看起来大概像是这样
/**
* CHANGELOG
***********************************************************************************
* DATE AUTHOR DESCRIPTION
* $DATE1 $SOMENAME DES1
* $DATE2 $OTHERLENGHT DES2
*/
我希望把插入表格和插入一行都作为一个yas快速输入,但是修改者名字长度不同的时候我希望描述可以自动对齐。。
yas + dynamic-spaces 不行吗?你可以先试一下,然后把你不满意的地方再拿过来讨论。
应该是可以的,我想请教一下可以把dynamic spaces内置到yas的模板里面吗?
没有必要,你可以用 yas 先插入骨架,然后开启 DS 就行了,DS 是一个 minor mode。也可以设置 C mode 默认开启 DS。
好的,多谢!我先尝试一下。
# -*- 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 模式?
对齐这种事,最好由专门的包/插件来完成。扩展性要好得多。
我还真提交过一个 snippet,除了没有自动对齐,和你的描述表现的 一模一样 。不过是 Vim 下的 ultisnips。
要实现这点,就需要插件支持 snippet 的“参数化”运行。yasnippet 和 ultisnips 的文档我都看过,yasnippet 基本不可能实现。
不过 table 的话,还是像 @et2010 说的:不如直接使用 org table,效果要好得多。“参数化”运行的用处体现在别处:
比如 lorem
的 snippet,输入 lorem
展开就是默认的 lorem 段落,输入 lorem5
则给出 5 个词语,lorem10
给出 10 个词语……等等。除此之外,“参数化”运行肯定还有别的典型应用场景。
那个输入 tb4x3
展开成 4 行 3 列表格的 snippet,我就不录屏了。感兴趣的话自己去尝试一下。
请教一下这个用 Yasnippet 怎么实现,我把 Yasnippet 的文档看了一下,也到 issue 搜了一下,都没有找到类似例子。
是 Vim 插件 UltiSnips 的功能。到 Yasnippet repo 下提 feature request 。
更正:“参数化”说法不准确。就 UltiSnips 来说,是正则 trigger words 和匿名 snippet,分别解决 fuzzy 展开以及动态 tabstop 的问题。
动态创建snippet yasnippet也能做到 只需要加个hook
更新了下 markdown 的 table snippet,增加了自动对齐功能。
用法 tb23<tab>
,俩单数字分别为行、列。
很 有 意 思