怎么样设置只在read-only mode 中启用evil mode?

最近自己搞配置然后不小心删除了${HOME},结果自己没有经常git pull的习惯,以前的努力可以说是 全部木大 全没了。就试了下doom emacs, 结果现在已经完全不想恢复以前的配置了,我能想到的作者都想到了。就是我不太会用evil mode, 但是又不想完全不用,因为感觉其实还蛮简洁的,只是有很多地方和我以前使用的原生emacs冲突,而且在仅仅是想要浏览代码的时候感觉hjkl还蛮方便的,现在设置的方法是

(add-hook 'read-only-mode-hook 'evil-mode)

但是打开就关不掉了,我是编程菜鸟,还在学习lisp中,有什么方法可以实现只在read only 的时候启用evil呢?

应该使用evil-local-mode。只在某个buffer打开evil

谢谢!我去试一下这个方法 :joy:,看看效果怎样

已经解决了,本来是用了

这个方法,但是后面发现容易造成有的buffer是readonly但是不是evil mode,有的buffer是evilmode不是readonly,感觉很不爽 :joy:遂上网找到全局的readonly,找到了这个

但是他的方案是把原来的单个buffer的readonly换成全局的readonly切换,没有办法保存每个buffer的readonly状态,不是我最想要的结果。

遂换了个思路,不求针对每个buffer,针对全局的切换readonly状态和evil状态。

如下:

(global-set-key (kbd "C-x C-q")
 (lambda ()
   (interactive)
   (cond
    ((eq buffer-read-only nil)
     (setq is-global-readonly t)
     (global-auto-readonly)
     (evil-mode 1)
     )
    (t
     (setq is-global-readonly nil)
     (global-auto-readonly)
     (evil-mode 0)))))

这段代码要结合我上面给出的那个链接里面的代码,我稍后改一下那里面的一些东西再把完整配置发上来,那里面有我不太习惯的配置。

算了,突然感觉这样也挺好的,只要把几个多余的函数去掉就可以了。稍后再研究一下autoload的用法,完善一下我的配置。

加了个功能,当进入insert state的时候换回默认键位而且取消readonly

;;; ~/.doom.d/evil/private-evil-settings.el -*- lexical-binding: t; -*-


(add-load-path! "../misc")
(require 'global-readonly-mode)
(global-readonly-toggle)

;; Only enable evil mode when buffer read-only!
;;;###autoload
(global-set-key
 (kbd "C-x C-q")
 (lambda ()
   "Troggle evil && readonly ON/OFF together."
   (interactive)
   (cond
    ((eq buffer-read-only nil)
     (setq is-global-readonly t)
     (read-only-mode)
     (evil-mode 1)) ;; If set hook, some tmp buffer is read-only.
    (t
     (setq is-global-readonly nil)
     (read-only-mode 0)
     (evil-mode 0)))))

(add-hook 'evil-insert-state-entry-hook
          (lambda ()
            "Changes keybindings and quit readonly-mode."
            (setq is-global-readonly nil) ;; Just a signal
            (read-only-mode 0)
            (evil-mode 0))
          )

(provide 'private-evil-settings)