请问emacs如何像vim一样通过inoremap映射按键功能

在vim中 我可以 autocmd Filetype tex inoremap ,d \document{} 这样设置一些在latex中的映射 来简化输入

请问在emacs中如何实现类似的功能呢?

Emacs 太丰富了,最基本的方法是这样的:

(global-set-key (kbd "键") #'一个命令) ;;全局
(define-key '某个mode-map (kbd "键") #'一个命令) ;;仅在某个mode下,优先级高于全局

;; 比如
(define-key 'latex-mode-map (kbd "C-c C-d") #'(lambda () (interactive) (insert "\document{}")))

别的 package(比如 evil、general)可能有自己的定义方法。

2 个赞

好的 谢谢您的解答 我去试试

确实可行 感谢 另外我发现 绑定的建是不是一定得ctrl开头? (define-key ‘latex-mode-map (kbd “, m”) #’(lambda () (interactive) (insert “\document{}”))) 比如按上面这个, 我想实现按下逗号 在按m就出来 \document。 但是好像就不行,如果写成 (define-key ‘latex-mode-map (kbd “C-c m”) #’(lambda () (interactive) (insert “\document{}”))) 就没问题。

另外 好像 \ 这个符号无法正常输入。 如果绑定 \document 最后打出来就是 ^?ocument

\是转义字符,输入\,需要写成(insert “\\document”),写两个\,我也是使用的逗号作快捷键前缀,我用逗号来输入单个大写字母等,建设尝试hydra,感觉比emacs原生的按键绑定更好用

我发现如果用 , m 来输入一些东西, 我没有办法单独输入逗号了

如果你想用,m像vim一样输入一个代码片段,最终还是要装evil吧这个按键组合绑定到normal-mode。或者用key-cord,经过一段时间延迟后输入按键本身代表的字符,我的建议是干脆用专门的包yasnippt

key-chord

emacsorphanage/key-chord: Map pairs of simultaneously pressed keys to commands (github.com)

general.el也对这个有包装

提问一下,hydra key-chord还有general之间是啥关系?如果要对快捷键做一个总的配置,应该用哪个?

我用hydra和general,general比较强大,基本可以取代key-chord了.

我是中英文逗号都被我当快捷键用了(方便中文状态下按快捷键),这样就不能按一次就输入逗号,我中英文逗号是按两次输入, 我另一帖中代码写的是(insert-char 44)插入英文逗号, (insert-char 65292)插入中文逗号,实际直接(insert ",")逗号就插入

1 个赞

我现在的方案是基于 yasnippet的。由于 yasnippet 里还不支持自动展开,所以我抄了 https://github.com/joaotavora/yasnippet/issues/998 里的设置。在配置文件里加入

  (defun my-yas-try-expanding-auto-snippets ()
    (when (and (boundp 'yas-minor-mode) yas-minor-mode)
      (let ((yas-buffer-local-condition ''(require-snippet-condition . auto)))
        (yas-expand))))
  (add-hook 'post-command-hook #'my-yas-try-expanding-auto-snippets)

然后设置 latex-mode 的模板就行。在你举的例子中,可以这么设置

# -*- mode: snippet -*-
# name: document
# key: ,d
# condition: 'auto
# --
\document{$0}

issue里面还给出了限定模板只能在 math 环境中展开的方法,就是在模板的 condition 里面加上 texmathp 的限制,这个我比较常用,比如写分数的这个

# -*- mode: snippet -*-
# name: fraction-slash
# key: //
# condition: (and (texmathp) 'auto)
# --
\frac{$0}{}

其实这种模板在vim里面比较方便,插件支持自动展开,在行首展开之类的。在 emacs里就比较麻烦,我也想知道有没有比较简单的方案。