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

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

这随便啊,我用的是[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


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

放在 user-config 是不生效的, web-mode的时候 C-i 总是显示undefined. 如果dotspacemacs-distinguish-gui-tab nil 的时候那么默认的C-i 总是绑定的emmet-expand. 使用全局是因为我试着用(local-set-key) 也没啥效果…

local-set-key

The binding goes in the current buffer’s local map, which in most cases is shared with all other buffers in the same major mode.

而这个local-set-key运行的时候所谓current buffer是什么情况,这是很不确定的吧?

今天才听说的这个函数,一直用define-key, evil-define-key,都挺好的。。比如

(define-key web-mode-map (kbd "TAB") nil)
(evil-define-key 'insert web-mode-map (kbd "C-l") #'emmet-expand-yas)

还是不行, 懒得折腾了. 心累

你得用<C-i>而不是C-i了,这个应该是直接把C-i识别成另外一个键了,有点tricky

沒错,(kbd "C-i") 返回的是 ^I,所以会混淆

emacs wiki: yasnippet + auto-insert

使用 yasnippet 自動插入程式碼樣板:

;; Auto add HEADER in new file
(add-hook 'find-file-hook
          '(lambda ()
             (when (and (buffer-file-name)
                        (not (file-exists-p (buffer-file-name)))
                        (= (point-max) 1))
               (let ((header-snippet "HEADER")
                     (yas/fallback-behavior 'return-nil))
                 (insert header-snippet)
                 ;; if can't expand snippet, delete insert string
                 (if (not (yas/expand))
                     (delete-region (point-min) (point-max)))))))

不是这个原因, 是只要到了insert 模式,那些绑定键就失效了。。

⋯⋯ Evil insert state 按键是分开的。你要用 evil-define-key 而不是 define-keyglobal-set-key

好像没啥问题撒, 难道不应该写在 user-config 里面?

(evil-define-key 'insert evil-insert-state-map (kbd "<C-i>") 'yas-expand)

这样还是提示 <C-i> is undefined

解决方案: 用新的快捷键全部覆盖

(defun html/init-emmet-mode ()
  (use-package emmet-mode
    :defer t
    :init (spacemacs/add-to-hooks 'emmet-mode '(css-mode-hook
                                                html-mode-hook
                                                sass-mode-hook
                                                scss-mode-hook
                                                web-mode-hook))
    :config
    (progn
      (evil-define-key 'insert emmet-mode-keymap (kbd "<C-i>") 'spacemacs/emmet-expand)
      (evil-define-key 'insert emmet-mode-keymap (kbd "<C-i>") 'spacemacs/emmet-expand)
      (evil-define-key 'emacs emmet-mode-keymap (kbd "<C-i>") 'spacemacs/emmet-expand)
      (evil-define-key 'emacs emmet-mode-keymap (kbd "<C-i>") 'spacemacs/emmet-expand)
      (evil-define-key 'hybrid emmet-mode-keymap (kbd "<C-i>") 'spacemacs/emmet-expand)
      (evil-define-key 'hybrid emmet-mode-keymap (kbd "<C-i>") 'spacemacs/emmet-expand)
      (spacemacs|hide-lighter emmet-mode))))