我为什么要另开发一套模式编辑?

试用了Meow后感觉是Evil最好的替代,轻量、清晰,侵入少,最大限度保留了原有emacs的特性,又增加了模式编辑。我是使用Doom的配置,想在Doom中增加一个meow Model,这样切换起来就方便了,也能更好的体验Meow。但是在Doom中发现KEYPAD模式要退出来要按两次C-g才能退出,不知怎么解决,还有同好用Doom的可以提供下经验吗?

Doom中C-g是全局绑定到doom/escape 的,但是我在 doom-escape-hook 中加入 meow-keypad-quit 也没有效果。

Doom代码:

(defun doom/escape (&optional interactive)
  "Run `doom-escape-hook'."
  (interactive (list 'interactive))
  (cond ((minibuffer-window-active-p (minibuffer-window))
         ;; quit the minibuffer if open.
         (when interactive
           (setq this-command 'abort-recursive-edit))
         (abort-recursive-edit))
        ;; Run all escape hooks. If any returns non-nil, then stop there.
        ((run-hook-with-args-until-success 'doom-escape-hook))
        ;; don't abort macros
        ((or defining-kbd-macro executing-kbd-macro) nil)
        ;; Back to the default
        ((unwind-protect (keyboard-quit)
           (when interactive
             (setq this-command 'keyboard-quit))))))

(global-set-key [remap keyboard-quit] #'doom/escape)

嗯,理解。可以提供个变量设置自己的匹配优先模式就更好了

我觉得重绑定 C-g 到默认的 keyboard-quit 就可以。其实这个 doom 的逻辑看起来,只是在录宏的时候不中断的效果,不过你可能需要 C-g 在宏的录制中中断。

另外就是 KEYPAD 里面可以用 esc 来退出。可以用退格来取消最近的一次输入,不需要使用 C-g。

嗯,我再试试,主要是doom-escape-hook中在不同模式中添加了些东西,全局绑定keyboard-quit 可能和Doom的内容会有冲突

我试了下,在KEYPAD模式下 C-g一次就回到了Normal了。我也没有做特别的处理。

1 个赞

@DogLooksGood 我觉得meow的思路很吸引人,但是在尝试的过程中有一个操作始终找不到合适的方法,就是evil里面的easymotion,简单来说就是迅速把光标跳到可视范围内的某个位置。 我的常用方式是激活easymotion的jump-to-char2,然后使用两个按键定位位置。 我知道meow采用的方式是使用数字进行跳转,但是这个方法的跳转范围很有限,也有可能是我还不知道其他的方法。 假设命题是,精准跳转到可视范围内的某个位置,meow的解决方法是怎样的?

evil-easymotion看起来很像avy啊

看了下,底层实现就是avy-goto-char2

可以试试 meow-find

你也是用的Doom吗?

是的,这几乎是我meow的doom全部配置

(use-package meow
  :init
  (meow-global-mode 1)

  :custom
  (meow-selection-command-fallback
   '((meow-save . meow-keypad-start)
     (meow-change . meow-keypad-start)
     (meow-cancel . meow-keypad-start)
     (meow-reverse . meow-open-below)
     (meow-replace . meow-replace-char)
     (meow-pop . meow-pop-grab)
     (meow-kill . meow-C-k)
     (meow-delete . meow-C-d)))

  :config/el-patch
  (setq meow-cheatsheet-layout meow-cheatsheet-layout-dvp)

  (defun meow-change ()
    "Kill current selection and switch to INSERT state."
    (interactive)
    (if (and (meow--allow-modify-p) (region-active-p))
        (progn
          (delete-region (region-beginning) (region-end))
          (meow--switch-state 'insert)
          (setq-local meow--insert-pos (point)))
      (meow--selection-fallback)))

  (meow-motion-overwrite-define-key
   '("SPC" . meow-motion-origin-command))

  ;; drovk programmer keybindings on normal mode.
  (meow-normal-define-key
   '("*"        . meow-expand-0)
   '("="        . meow-expand-9)
   '("!"        . meow-expand-8)
   '("["        . meow-expand-7)
   '("]"        . meow-expand-6)
   '("{"        . meow-expand-5)
   '("+"        . meow-expand-4)
   '("}"        . meow-expand-3)
   '(")"        . meow-expand-2)
   '("("        . meow-expand-1)
   '("1"        . digit-argument)
   '("2"        . digit-argument)
   '("3"        . digit-argument)
   '("4"        . digit-argument)
   '("5"        . digit-argument)
   '("6"        . digit-argument)
   '("7"        . digit-argument)
   '("8"        . digit-argument)
   '("9"        . digit-argument)
   '("0"        . digit-argument)
   '("-"        . negative-argument)
   '(";"        . meow-comment)
   ;; '(","     . meow-inner-of-thing) ; chord keys
   '("."        . meow-bounds-of-thing)
   '("<"        . meow-beginning-of-thing)
   '(">"        . meow-end-of-thing)
   `("a"        . ,(cmd! (if (region-active-p) (meow-append) (meow-change-char))))
   '("A"        . meow-replace-save)
   '("b"        . meow-back-word)
   '("B"        . meow-back-symbol)
   '("c"        . meow-change)
   '("C"        . meow-change-save)
   '("d"        . meow-delete)
   '("D"        . meow-replace)
   '("e"        . meow-line)
   '("E"        . meow-line-expand)
   '("f"        . meow-find)
   '("F"        . meow-find-expand)
   '("g"        . meow-cancel)
   '("G"        . meow-goto-line)
   '("h"        . meow-head)
   '("H"        . meow-head-expand)
   '("i"        . meow-insert)
   ;; '("I"        . winner-undo)
   '("j"        . meow-join)
   '("J"        . delete-indentation)
   '("k"        . meow-kill)
   '("l"        . meow-till)
   '("L"        . meow-till-expand)
   '("m"        . meow-mark-word)
   '("M"        . meow-mark-symbol)
   '("n"        . meow-next)
   '("N"        . meow-next-expand)
   '("o"        . meow-block)
   '("O"        . meow-block-expand)
   '("p"        . meow-prev)
   '("P"        . meow-prev-expand)
   '("q"        . meow-quit)
   '("r"        . meow-reverse)
   '("R"        . meow-open-above)
   '("s"        . meow-M-x)
   '("t"        . meow-tail)
   '("T"        . meow-tail-expand)
   '("u"        . meow-undo)
   '("U"        . winner-undo)
   '("v"        . meow-search)
   '("V"        . meow-pop-search)
   '("w"        . meow-next-word)
   '("W"        . meow-next-symbol)
   '("x"        . meow-save)
   '("X"        . meow-clipboard-save)
   '("y"        . meow-yank)
   '("Y"        . meow-clipboard-yank)
   '("z"        . meow-grab)
   ;; '("Z"        . meow-replace-save)
   '("'"        . meow-pop)
   '("\""       . meow-pop-all-selection)
   '("/"        . meow-visit)
   '("&"        . meow-query-replace)
   '("%"        . meow-query-replace-regexp)
   '("$"        . meow-swap-grab)
   ;; '("~"     . nil)
   '("#"        . meow-sync-grab)
   '("@"        . recenter)
   ;; '("^"     . meow-pop-to-mark)
   '("\\"       . meow-end-of-thing)
   '("<escape>" . meow-last-buffer)
   '("<f3>"     . meow-start-kmacro)
   '("<f4>"     . meow-end-or-call-kmacro)))
1 个赞

取决于怎么看待要去的位置。可以举个实际的例子

看来 append 缺个 selection-fallback :sweat_smile:

举例,如下代码

func anotherFunc() {
  someFunc(arg)  //<- 我需要给这个方法调用增加一个参数
}

// 我刚刚给这个函数加了一个新参数
func someFunc(arg string, argInt int) {
  ... // <- 现在光标在这里
}

:joy: :joy: 为了尽可能节约按键绑定,我费尽心机。

到那个位置或附近的位置,有大概这么几种办法

到括号里面 - f ) 1

g 的后面 - t g 3

到 arg 前面再向后一个词 b 9 e

按行号到那一行(同时会选中那行,就有了行末的位置) 2 Q

另外 meow 和 avy 并不冲突(我自己并不用)

我去试试看能不能适应,感谢回复

谢谢分享,好像是没有特别的地方,可能是我用了啥特殊的包,或者是定制部分影响了。我清理下再试 :sweat_smile:

用这种配置的就是这样,有时候觉得方便,有时候觉得又好麻烦

请问下,假如我想让 SPC-cCtrl-c c 的按键前缀等同,该怎么绑定实现?

后端没法一致, 不太喜欢rime, 配置太复杂了

1 个赞