请问emacs里有没有类似替换输入字符的插件。


#1

比如我输入分号会输入:= 两次分号就是分号,然后可以针对不同文件类型设置不同的,类似这个我这个vim里的操作


#2

可以参考一下这个

https://github.com/noctuid/general.el#mapping-under-non-prefix-keys

(general-imap ";"
  (general-key-dispatch (lambda () (interactive) (insert ":="))
    :timeout 0.25
    ";" #'self-insert-command))

#3

这个能设置文件类型么,


#4

可以,需要把对应的键绑定加到major mode的keymap里面

(general-imap ";" foo-mode-map ...)

#5

不知道我理解错没有。这个问题用abbrev mode很方便啊。可以看下http://ergoemacs.org/emacs/emacs_abbrev_mode_tutorial.html


#6

不是。。。。


#7

没看明白你的需求。。。能再解释一下吗?


#8

https://www.emacswiki.org/emacs/EssSmartUnderscore 这个东西


#9

用这个:

参考这个配置:

(use-package ess-smart-equals
  :init   (setq ess-smart-equals-extra-ops '(brace paren percent))
  :after  (:any ess-r-mode inferior-ess-r-mode ess-r-transcript-mode)
  :config (ess-smart-equals-activate))

#10

是不是想要 prettify-symbols-mode?很基础的功能。


#11

不太清楚这个是啥


#12

我试一下这个。


#13

prettify-symbols-mode是实际输入a,显示成b。楼主估计是想输入a展开成b。


所以你这功能是vim内置的还是插件的?如果是内置的,你可以问问evil maintainer


#14

electric-quote-mode有类似的操作,可以看看他的实现


#15

二楼是对的

其它的都不是


#16

用的插件,看着发蒙呢,。感觉很简单的功能啊,


#17
(defun n-char-before-point-to-string (num)
  (let* ((point (point))
         (point-before (- point num))
         )
    (when (and (> point-before 0)
               (char-before point-before))
      (buffer-substring point-before point)
      )
    )
  )

(defmacro twice (first second map)
  `(define-key ,map (kbd ,second)
     (lambda ()
       (interactive)
       (if (s-suffix? ,first (n-char-before-point-to-string (length ,first)))
           (progn
             (delete-backward-char (length ,first))
             (insert ,second)
             )
         (insert ,first)
         )
       )
     ))
(twice ":=" ";" org-mode-map)

#18

也就是没有办法用两个分号输入两个:=了

vim中应该是可以的

你得考虑用户输入的时间间隔


#19

楼上上应该可以满足楼主的需求。

再思考一下本来的需求:据我所知go的赋值有a = ba := b两种?那么这个需求可以考虑下用我的这个方案: