我跟他教程走了一下, 不知道咋回事自动补充的内容总是出现两份…
这随便啊,我用的是[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 元素更名
...
我想设置在 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
;; 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-key
或 global-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))))