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

你的配置有问题吧,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 .

这招只好使一半… 我设置了 dotspacemacs-distinguish-gui-tab t , 然后在 web-mode 里的 C-i 就不是绑定的 emmet-expand 了. 但是它提示我 <C-i> is undefined… 是不是代码写错地方了, 没生效…

use-package 写。 直接写上去怕是会被覆盖的。

尴尬… 这个要怎么写… 需要在 web-mode 下的时候, 去改变 yas-expand 这个函数的绑定键. 之前的例子是在那个包就设置哪个包的方法… 这个我写在 web-mode 里设置也不生效…

先放 user-config


等等,你为什么要用全局绑定?