spacemacs 怎么配置按文件后缀创建文件时自动添加代码块?

这个功能子龙貌似提过一下, 但是好像没弄这个, 我想如果创建个html文件的话, 自动就把 html和body 等标签自己写好, 代码块也能做到这点, 但是还得自己输入一下. 挺麻烦的.

auto-insert,以前讨论过 https://emacs-china.org/search?q=auto-insert

我更倾向使用 yasnippet,虽然多打几个字,但是更灵活。虽然 auto-insert 能根据后缀自动创建,但是这个过程你不能选择,只能添加固定的内容。而 snippet 可以定义一组不同的片段,比如 html1,html2,html3,按需添加。

个人感觉yasnippet更适合平常用,而auto-insert适合大量创建文件头一模一样的文件的时候。

比如强迫症的Emacs配置……文件头总会有一模一样的版权声明

emmet-yas什么的,emmet写html的骨架只要输入!然后yas-emmet-expand

yasnippet 是好用, 但是 htmlweb-mode 里面不管你输入什么自动补全都是个标签. 每次都要先打出 html 然后在后面 M-m x, 再输入 yas-expand , 再选择补全… 这个就有点麻烦, 别的语言倒没这问题

你的配置有问题吧,TAB 键被 emmet 占用了?

我靠! 大哥你不说我没看过, 原来一直都是 emmet-expand … 正常应该是绑定的哪个函数? 不过绑定这个函数除了 web-mode 的时候都挺好的…

emmet 专门补全 html/css 标签,yasnippet 范围更广,但是这两个 package 并不重叠,所以在 web-mode 里需要合理安排。

yasnippet 只有一个方法法,把它绑定 TAB,emmet 有一系列方法,绑定到 [prefix] e 底下。

我知道问题了, 但是没有好的解决办法.
我用的是 hybrid 模式, 我之前就在全局设置过 TAB 键绑定 yas-expand 了.
当编辑 html 文件的时候, 如果我是image这种命令模式的时候, TAB 键绑定的就是 yas-expand, 可是命令模式的时候光标是在最后一个字母上的, 比如我设置的补全的快捷键是 ab , 那么我得输入image, ab 字母的后面必须有一个空格~ 然后 esc TAB , 就补全了, 多余的那个空格我可以用自动对齐的快捷键干掉它, 但是这种方式很不优雅~
如果关闭了 emmet-mode 这方面是没问题了, 但是写标签就没补全了… 有点尴尬. 好像也没什么好的解决办法吧

空格?没看懂

没看懂,我是web-mode里yas+company和其他地方一样用tab,emmet-expand另外绑一个键,用着挺好的。

恰好我前两天刚学习并配置了这个功能。使用yasnippet + auto-insert,自动添加的内容既可以固定,又可以像yas一样设置片段。

配置在https://github.com/hexingb/emacs-c-ide-demo/blob/dev/custom/setup-programming.el 46-67行。

我是从http://howardism.org/Technical/Emacs/templates-tutorial.html学习到的。

主要是我补全就习惯用 tab … 就这么滴吧…

通常按 tab 补全的时候, 我们都是在 insert 模式下, 但是在 web-mode 下稍微不一样
web-mode 的时候 insert 模式下的 tab 绑定的 emmet-mode 的函数
web-mode 的时候命令模式下 tab 还是绑定的 yas-expand

兄弟, 顺便问下你吧 emmet-expand 绑定的什么键… 我看那个都觉得不合适…

我跟他教程走了一下, 不知道咋回事自动补充的内容总是出现两份…

这随便啊,我用的是[insert-mode]C-l

tab可以几个功能合起来,比如我现在tab打开company列表,如果已经开了就选择当前项补全,如果company没有候选项就用hippie-expand

但是emmet-expand-yas不应该放进tab,比如你当前光标是a|,然后同一个buffer里有个单词ass,此时你可以把它补全为ass,也可以用emmet展开为<a href="|"></a>,这两个动作如果绑一个键,按下去的时候是不可能让电脑帮你判断你想干什么的,不像前面的company和hippie-expand可以一个作为另一个的fallback。

我知道这个问题, tab 绑定 emmet-expand 就是有这个问题, 不过我后来想也无所谓了… 因为在 html 文件的时候我也不会有什么别的代码块. 我的 web-mode 下就一个代码块~ 为了这一个改键不划算了…

emmet 可不只是 emmet-expand,还有其它实用的方法,再加上 web-mode 也有些针对 html 元素的方法。我把它们都放在 <prefix> e 分组底下(e 表示 element, f 表示 file,b 表示 buffer,…),方便记忆:

ee   双连击,最常用的绑定 emmet-expand (类似的 ff 绑定 find-file, bb 绑定 switch-to-buffer ...)
ef   下一个元素
eb   上一个元素
en   下一个编辑点
ep   上一个编辑点
ev   消除包裹元素
ew   添加包裹元素
ek   删除元素以及子元素
er   元素更名
...
1 个赞

我想设置在 web-mode 的时候 yas-expand 的快捷键为 C-i, 是我姿势不对么, 写出来没效果, 目前我发现 web-mode 的时候 tab 键和 C-i 竟然都绑定的 emmet-expand.

(defun my-web-mode-expand ()
  (global-set-key (kbd "C-i") 'yas-expand)

(add-hook 'web-mode-hook 'my-web-mode-expand)

代码写在了 package.el .