怎么理解 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 但是其它的没有加载进来。
可以的。
(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
,区别在于动词在先还是选择在先。这样做的话有一些好处:
- 更加可视化,当然这个不重要,因为熟练了以后有没有可视化都没有区别。
- 只需要更少的命令了。比如一个
x
就可以同时完成选择整行,移动到行尾,配合i/a
在行首和行尾插入,而 Vim 这里就有V
,0
,$
等等。 - 先移动一下,可以跟据移动的单位显示出反续的位置,用数字追加移动,Vim 中的话这个要数字先行,先数字就是很难数是第几个。
- 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 我有打算录个视频
我觉得这样是可以的,毕竟延迟加载也不需要延迟模式编辑。我加到 README 里面去。
感谢说明,我再去试试,对于简洁的追求简直吸引力无穷。
录视频的一个难点就是我是 dvorak 布局的,qwerty 的布局我是重新摆放了的(适当的接近 vim 和合理性),但我自己并不能熟练使用。
我倒是希望cheatsheet的优先级更高些,不论是哪种布局
感觉这也是个不错的路线。
添加了 cheatsheet 功能
- 支持 qwerty 和 dvp,后续会扩展加上其它布局的(扩展成本很低)
- 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))
效果
啊哈,期待近一步的建议
看起来不错,我要去加到 readme 里面。
这效率给跪了……我有一种感觉,元旦假期的时间已经被预定了
其实 meow 不需要大动作了,现在这个命令之类的,我用了两个月了。都是小修补。
其实我想说这个 cheatsheet 很好用的。
更新了 cheatsheet,现在漂亮多了。也修复了 README 中的一些错误。。
反馈一个问题:
执行meow-cheatsheet,显示错误,void function string-replace。
实在没搜到这个函数来自哪里