猫态编辑:Meow

怎么理解 prefix-map 呢?像 help-map 这样的?

对,我想达到这种效果 (define-key some-meow-map (kbd "<SPC> f") self-file-map) (define-key self-file-map (kbd "o") #'open-file) 那么<SPC> f o就能执行open-file命令了

确实可以重现,感觉像是没有成功的加载

;; Set ELPA packages
(setq package-archives '(("gnu" . "https://elpa.emacs-china.org/gnu/")
                         ("melpa" . "https://elpa.emacs-china.org/melpa/")))

;; Initialize packages
(unless (bound-and-true-p package--initialized) ; To avoid warnings in 27
  (setq package-enable-at-startup nil)          ; To prevent initializing twice
  (package-initialize))

;; Setup `use-package'
(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

;; Should set before loading `use-package'
(setq use-package-always-ensure t)
(setq use-package-always-defer t)
(setq use-package-expand-minimally nil)
(setq use-package-enable-imenu-support t)

(require 'use-package)

(defun meow-setup ()
  (meow-motion-overwrite-define-key
   '("j" . meow-next)
   '("k" . meow-prev))
  (meow-leader-define-key
   ;; SPC j/k will run the original command in MOTION state.
   '("j" . meow-motion-origin-command)
   '("k" . meow-motion-origin-command)
   ;; Use SPC (0-9) for digit arguments.
   '("1" . meow-digit-argument)
   '("2" . meow-digit-argument)
   '("3" . meow-digit-argument)
   '("4" . meow-digit-argument)
   '("5" . meow-digit-argument)
   '("6" . meow-digit-argument)
   '("7" . meow-digit-argument)
   '("8" . meow-digit-argument)
   '("9" . meow-digit-argument)
   '("0" . meow-digit-argument))
  (meow-normal-define-key
   '("0" . meow-expand-0)
   '("9" . meow-expand-9)
   '("8" . meow-expand-8)
   '("7" . meow-expand-7)
   '("6" . meow-expand-6)
   '("5" . meow-expand-5)
   '("4" . meow-expand-4)
   '("3" . meow-expand-3)
   '("2" . meow-expand-2)
   '("1" . meow-expand-1)
   '("-" . negative-argument)
   '(";" . meow-reverse)
   '("," . meow-inner-of-thing)
   '("." . meow-bounds-of-thing)
   '("[" . meow-beginning-of-thing)
   '("]" . meow-end-of-thing)
   '("a" . meow-append)
   '("A" . meow-open-below)
   '("b" . meow-back-word)
   '("B" . meow-back-symbol)
   '("c" . meow-change)
   '("C" . meow-change-save)
   '("d" . meow-delete)
   '("x" . meow-line)
   '("f" . meow-find)
   '("F" . meow-find-expand)
   '("g" . meow-keyboard-quit)
   '("G" . goto-line)
   '("h" . meow-head)
   '("H" . meow-head-expand)
   '("i" . meow-insert)
   '("I" . meow-open-above)
   '("m" . meow-join)
   '("M" . delete-indentation)
   '("s" . meow-kill)
   '("t" . meow-till)
   '("T" . meow-till-expand)
   '("w" . meow-mark-word)
   '("W" . meow-mark-symbol)
   '("j" . meow-next)
   '("J" . meow-next-expand)
   '("o" . meow-block)
   '("O" . meow-block-expand)
   '("k" . meow-prev)
   '("K" . meow-prev-expand)
   '("q" . meow-quit)
   '("r" . meow-replace)
   '("R" . meow-replace-save)
   '("n" . meow-search)
   '("N" . meow-pop-search)
   '("l" . meow-tail)
   '("L" . meow-tail-expand)
   '("u" . undo)
   '("v" . meow-visit)
   '("e" . meow-next-word)
   '("e" . meow-next-symbol)
   '("y" . meow-save)
   '("p" . meow-yank)
   '("z" . meow-pop-selection)
   '("Z" . meow-pop-all-selection)
   '("&" . meow-query-replace)
   '("%" . meow-query-replace-regexp)
   '("<escape>" . meow-last-buffer)))

(use-package meow
  :config
  (meow-setup-line-number)
  (meow-setup))

(require 'meow)
(meow-global-mode 1)

(setq-default mode-line-format
	      (cons '(:eval (meow-indicator)) mode-line-format))

如果这样的话倒是可以。感觉这个 use-package 的块是 lazy 的. meow-global-mode 有 autoload 但是其它的没有加载进来。

1 个赞

可以的。

(meow-leader-define-key
 `("/" . ,help-map)
 (cons "/" help-map)) ;; 这样也可以

就像 define-key 一样,如果你绑定 keymap 的话,不要给 symbol 就可以。

谢谢答复,确实是use-package的defer机制导致的。 设置(setq use-package-always-defer nil),或者给(use-package meow)加上:demand nil关键字,就可以了。

@DogLooksGood 我是Doom用户,对这个模式非常感兴趣,很想尝试一下evil之外的编辑模式。我使用了你的config,打开之后在scratch里面挨个尝试了一下按键,但是没能理解整个模式的编辑-跳转思路。 我之前是vim用户,很习惯 ci" ca( 这类操作方法,在读了中英文文档之后,还是没能理解meow的整个编辑逻辑。 如果能有一个视频演示并讲解一下思路的话就好了。

如果是编辑的话,我觉得用文字也可以说明。

Meow 的编辑功能借鉴的 Kakoune。

这里可以举一个例子来说明 Meow 和 Vim 的区别,因为 Meow 的按键是用户自定义的,以下以 README 中给的 qwerty 的键盘绑定为例。

meow 中选择和移动是结合的,单独做选择比如说 e 相当于 vim 中的 ve

在 Vim 当中,实际上有两种情况,对于简单情况是动词在前,对于复杂情况则是先选(用 v)然后再操作,Meow 的话则是永远先选择。比如说要修改下一个词,在 Vim 中的话是用 ce,在 Meow 里面则是 ec,区别在于动词在先还是选择在先。这样做的话有一些好处:

  1. 更加可视化,当然这个不重要,因为熟练了以后有没有可视化都没有区别。
  2. 只需要更少的命令了。比如一个 x 就可以同时完成选择整行,移动到行尾,配合 i/a 在行首和行尾插入,而 Vim 这里就有 V, 0, $ 等等。
  3. 先移动一下,可以跟据移动的单位显示出反续的位置,用数字追加移动,Vim 中的话这个要数字先行,先数字就是很难数是第几个。
  4. C/V 大法是编程刚需,C/V 的关键就在于选的快,所以第一优先级的选择很有利。

当然,因为选择先行,所以有专门的 inner-of-thing , 和 bounds-of-thing .,对应了 Vim 中间位置的 i/a。所以 Vim 的 ci" 在 Meow 里面是 ,gc (inner-of-thing, g->string, change)

至于 Doom 集成我没有经验,我觉得主要的问题在于 modeline 怎么搞?


PS 我有打算录个视频

3 个赞

我觉得这样是可以的,毕竟延迟加载也不需要延迟模式编辑。我加到 README 里面去。

感谢说明,我再去试试,对于简洁的追求简直吸引力无穷。

录视频的一个难点就是我是 dvorak 布局的,qwerty 的布局我是重新摆放了的(适当的接近 vim 和合理性),但我自己并不能熟练使用。 :rofl:

我倒是希望cheatsheet的优先级更高些,不论是哪种布局 :dog:

感觉这也是个不错的路线。


添加了 cheatsheet 功能

  1. 支持 qwerty 和 dvp,后续会扩展加上其它布局的(扩展成本很低)
  2. Cheatsheet 是动态生成的,会反映出当前实际的按键绑定

命令是 meow-cheatsheet

说下试用感受:我虽然是个Evil用户,但是我试用了之后有种说不清的舒适

Doom-modeline,目前并没有原生支持Meow。所以,如果Doom用的是doom-modeline. 可以用下面的advice。其他的doom-modeline 可参考改改。我放的位置是左半边,最后一个位置。

(after! doom-modeline-core
  (doom-modeline-def-segment meow (when (featurep 'meow) (meow-indicator)))
  (defadvice! doom-modeline-def-modeline-a (args)
    "Advise to add the meow segement into modeline"
    :filter-args #'doom-modeline-def-modeline
    (let ((lhs (cadr args)))
      (setf (cadr args) (append lhs '(meow))))
    args))

效果

image

啊哈,期待近一步的建议

看起来不错,我要去加到 readme 里面。

这效率给跪了……我有一种感觉,元旦假期的时间已经被预定了 :upside_down_face:

其实 meow 不需要大动作了,现在这个命令之类的,我用了两个月了。都是小修补。

其实我想说这个 cheatsheet 很好用的。

2 个赞

更新了 cheatsheet,现在漂亮多了。也修复了 README 中的一些错误。。

反馈一个问题:

执行meow-cheatsheet,显示错误,void function string-replace。

实在没搜到这个函数来自哪里