meow 怎么设置快捷键 jk 退出编辑模式

meow 怎么设置快捷键 jk 退出编辑模式

看了一下代码,里面是有 meow-insert-state-keymap的,但是不知道怎么设置快速连按两个键

来自meow github的discussions page (我做了一点修改以在undo/redo时不考虑按jk的过程):

;; Use jk to escape from insert state to normal state
(defvar meow-two-char-escape-sequence "jk")
(defvar meow-two-char-escape-delay 0.5)
(defun meow--two-char-exit-insert-state (s)
  "Exit meow insert state when pressing consecutive two keys.

S is string of the two-key sequence."
  (when (meow-insert-mode-p)
    (let ((modified (buffer-modified-p))
          (undo-list buffer-undo-list))
      (insert (elt s 0))
      (let* ((second-char (elt s 1))
             (event
              (if defining-kbd-macro
                  (read-event nil nil)
              (read-event nil nil meow-two-char-escape-delay))))
        (when event
          (if (and (characterp event) (= event second-char))
              (progn
                (backward-delete-char 1)
                (set-buffer-modified-p modified)
                (setq buffer-undo-list undo-list)
                (meow-insert-exit))
            (push event unread-command-events)))))))
(defun meow-two-char-exit-insert-state ()
  "Exit meow insert state when pressing consecutive two keys."
  (interactive)
  (meow--two-char-exit-insert-state meow-two-char-escape-sequence))
(define-key meow-insert-state-keymap (substring meow-two-char-escape-sequence 0 1)
  #'meow-two-char-exit-insert-state)
2 个赞

感谢。 原来都在discussion,难怪issue区没找到东西。。

@liushihao456 感谢大佬分享,已经用上了。

有个疑问,在lispy-mode下,lispy-mode-map优先权大于meow-insert-state-keymap, “jk”就无效了,有什么办法让这个功能在lispy-mode下也生效么?

这个我也不清楚,我不用lispy-mode。你可以设置为其它的不冲突的两键,比如"jj"或"kk"

正好借楼问个问题…为什么我按f 和 t的效果一样的?都是带mark的…明明设置的一个是find 一个是till啊…能不能让find不带mark?

都是带选择的,find 是那个字符之后,till 是那个字符之前。

好吧……知道个区别,心态好了那么一点……

我用了 key-chord:

;; fj 双击退出 INSERT
(key-chord-define-global "fj" 'meow-insert-exit)

undo、redo 没考虑。

key-chord 我看了, evil也是可以用这个, 但是不想引入多个lib 哈哈哈。

来自狗哥的注视。 :partying_face:

这个方法的问题是执行完change或者replace之后退出insert到normal模式时自动选中被修改部分的功能失效了。。。

这是什么功能?meow自带的吗?

M-x meow-tutor里面 QUICK VISIT AND SEARCH这一节里面用到了这个特性,修改一个单词之后按下ESC自动选中被修改的部分,省去再次创建选区的步骤。

确实有这个问题。可以在进行这种search-and-replace的操作时不用jk,用esc来退出。毕竟这种情况占少数,我感觉应该还好。

如果要修正jk的行为,可能改起来会比较复杂吧。

靠着谷歌搜索搞出来了一个meow-select-on-change没有失效的版本

(defun meow--two-char-exit-insert-state (s)
  "Exit meow insert state when pressing consecutive two keys.

S is string of the two-key sequence."
  (when (meow-insert-mode-p)
    (let ((modified (buffer-modified-p))
          (undo-list buffer-undo-list))
      (insert (elt s 0))
      (let* ((second-char (elt s 1))
             (event
              (if defining-kbd-macro
                  (read-event nil nil)
              (read-event nil nil meow-two-char-escape-delay))))
        (cond
         ((null event) (ignore))
          ((and (integerp event) (char-equal event second-char))
           (backward-delete-char 1)
                (set-buffer-modified-p modified)
                (setq buffer-undo-list undo-list)
                (push 'escape unread-command-events))
          (t (push event unread-command-events)))))))

好像问题在于应用unread-command-events模拟按下ESC而不是直接 call meow-insert-exit

1 个赞

这个有点厉害。