meow 下层都是从原生绑定获取的命令,因为设计上就是使用者不改原生的命令的。如果你修改了原生的绑定,比如把 forward-char 改到 C-t, (C-f 留给 scoll-up) 你也要对应的改
meow--kbd-forward-char
这个变量到 “C-t”. 具体在翻页上,用 C-f C-b 翻页并不比 Emacs 内置的 C-v M-v 好按,不妨就用默认的。
关于 pop selection, 可以这样。
(meow-pop-selection . meow-pop-grab)
其实 meow-pop-selection
更符合命令的原子性,meow-pop
应改成 meow-pop-selection
的别名。meow 里面有一些多余的命令,注意到了就会 deprecate 或设成推荐命令的 alias。
关于 thing 的问题,大部分的 thing 是 emacs 里面就有的。比如 line
, defun
之类的,每个语言的 mode 实现的时候会实现 thing 的范围如何获取。Meow 里面有的获取的方式依赖于这个。
(bounds-of-thing-at-point 'defun)
如果一个 mode 里面实现的不合适的话,表现的行为就不对。目前没有打算自己实现一个针对每个语言的,以前试着搞过,但是语言很多规则很乱,自己另搞一套并不划算。
meow-thing.el
里面是相关的实现。
加了一个自动调整 face 颜色的功能,感觉相比给别的主题一个个 PR,这个方式更好一些。主要是基于光标的颜色来调亮、调暗。
在一些主题上的效果:
Zenburn
Solarized Dark
Solarized Light
Doom One
Dracula
虽然对比度的感觉忽高忽低,不过还可以接受。
1 个赞
支持了 TUI 里面终端光标样子的变化。测试了 alacritty, urxvt, gnome-terminal 等终端。
3 个赞
太赞了,看到之后立刻尝试了一下。windows terminal 里 powershell 和 cmd 不起作用。Archwsl 可以,ssh 到 centos 服务器也没问题!!不过在 windows 下基本用 GUI,也不是什么大问题。
1 个赞
BMACRO 模式的说明
名称
Batch Macro,用于批量执行 kmacro 的模式。如有更好的名字可以更换。
启动和关闭的方法
当前处于 NORMAL 模式,光标进入第二选择区域时自动激活。
光标离开第二选区或第二选区消失时自动关闭。
PS:使用 meow-grab 或 Alt + 鼠标选择创建第二选区。
启动后可用的命令
启动后光标移动的时候,会跟据移动的方式不同,在第二选区内产生不同位置的假光标(或假选区)。
目前支持上下左右,word, symbol, line, join, find, till, visit, mark-word, mark-symbol 等命令。
使用 F3 (绑定了 kmacro-start-or-insert-counter 的位置会被 bmacro 临时覆盖,下同) 来录制宏,F4 结束的时候,宏会自动的应用到所有的假光标。如果没有在录制宏,F4 会直接应用最后一个宏到当前真光标和所有的假光标。
insert, append, change 会进入 insert 模式,并自动开始宏的录制,在 exit 的时候自动应用到所有的假光标。
PS: replace 可以相当于对多个地方 replace (这个功能实现和 kmacro 无关)
TPS:
- 已有第二选区相关的功能不受影响, 依然可以用 swap-grab 交换两种选区或是用 sync-grab 将主选区内容覆盖掉第二选区。
- BMACRO 模式的光标不能直接用于编辑,只能用于 kmacro,这样规避了各种插件的兼容性问题,不需要像 multiple-cursor 里面那样备份还原变量,或是打补丁。
- 在 BMACRO 下无法唤出 KEYPAD 模式。
- 开始宏的录制后所在的模式是 NORMAL。
- 用户配置中没有需要新绑定的按键和命令。
对比旧方案
旧方案使用 meow-kmacro-lines 和 meow-kmacro-matches ,两个独立的命令。
虽然用起来还可以,但是能解决的问题场景比较固定。新方案同样能做到这两个命令的效果,某些情况下可以用更少的按键。新方案还复用了 meow 自带的多种移动命令。更符合 meow 的 less is more 的思想。
新方案同旧方案一样对 kmacro 有良好的兼容性,保证了
- 已有的 kmacro 可以应用在当前的这套流程
- 这套流程产生的 kmacro 可以后续继续应用
5 个赞
默认关闭了 cursor 位置的 hack, 当前的默认行为 cursor 和以前是相同的。需要位置处理的话,使用
(setq meow-use-cursor-position-hack t
meow-use-enhanced-selection-effect t)
两个设置。需要在激活 meow-mode 前设置。
光标的位置是为了更符合 vim 用户的习惯,但是感觉并不是编辑的核心需求,所以默认关闭了。
开启时:
关闭时:
1 个赞
好像更新之后,在 doom-one theme 下,自动调整光标颜色的功能失效了?
再麻烦问个问题,关于 meow-cancel-selection 这个方法,他的描述是
"Cancel selection or grab " 。但实际上好像并没有取消 grap 的效果,这个是文档没有更新还是我用法不对呢?
(我明白可以设置 meow-selection-command-fallback 来达成目的)
文档问题,我更新一下。感觉经过很多改动之后,需要一波大的文档工作了。
目前仅简单的使用,有几个优点兼容性,和meow以及近乎所有的emacs按键都能兼容,灵活性很好。然后,可以复用kmacros的那一套,包括录制和保存。最后,多行的匹配更加灵活,不仅包括了我之前习惯的vim行编辑,而且也能享受宏的优势
狗哥做出了很神奇的功能,很棒,很实用。
补充一下,太赞了,一键进入录制退出到normal自动执行宏,好多行文字多次同步修改太快了,太快了,原vim用户震惊
有一个疑惑,就是如果我在bmacro里,通过f选择一个字符并进行修改,但结果会修改到每一行所有的匹配字符,而不是每一行的一个
比如输入“f a",匹配到字符a,光标的修改位置是在原来位置起匹配到的第一个a的位置,但是结束后会修改所有的匹配位置。
这种修改也不错,不过有时可能仅需要修改每行中的一个,有办法进行选择吗
现在meow使用起来感觉像变魔法哈哈。我重新封装了meow的按键绑定函数,加入了lazycat中的lazy-key的思路来实现autoload
结果就只用meow这一个包就完成了所有的按键使用和快捷键绑定(lazy-load我写了一个宏到了setup里,感觉这个工作应该放到每个包自己里面,和按键管理分开)。把doom的那一套快捷键也很方便的迁移过来,维护的负担低了很多
下面是纯meow的案件绑定思路绑定(autoload我和setup弄到一起了)
(defun lewis/define-leader-key (key-alist &optional key-prefix)
(let (key def)
(setq keymap meow-leader-keymap)
(if key-prefix
(setq key-prefix (concat key-prefix " "))
(setq key-prefix ""))
(dolist (element key-alist)
(setq key (car element))
(setq def (cdr element))
(cond ((stringp key) (setq key (read-kbd-macro (concat key-prefix key))))
((vectorp key) nil)
(t (signal 'wrong-type-argument (list 'array key))))
(define-key keymap key def))))
用法实例
(lewis/define-leader-key
'(;; youdao
("y p" . youdao-dictionary-search-at-point-posframe)
("y s" . youdao-dictionary-search)
("y i" . youdao-dictionary-search-from-input)
("y r" . youdao-dictionary-search-and-replace)
;; citre
("c a" . citre-ace-peek)
("c j" . citre-jump)
("c p" . citre-peek)
("c J" . citre-jump-back)
("c u" . citre-update-this-tags-file)
("c r" . citre-peek-restore)
("c s" . citre-peek-save-session)
("c l" . citre-peek-load-session)
;; aweshell
("a a" . aweshell-toggle)
("a d" . aweshell-dedicated-toggle)
("a b" . aweshell-switch-buffer)
("a s" . aweshell-search-history)
;; insert-translated
("i i" . insert-translated-name-insert)
("i r" . insert-translated-name-replace)
;; imenu-list
("l" . imenu-list-smart-toggle)
;; org-download
("d" . org-download-screenshot)
;; english help
("h c" . toggle-company-english-helper)
("h f" . english-teacher-follow-mode)
;;leader: lewisliu
) "e")
可以很方便的加入任意长度的按键序列,缺点是前缀没有办法维护很好的注释,我想用which-key的替换字符串的那个函数嵌入进来,但没做到
lazy-load.el要配合one-key.el, lazy-load负责按键触发包动态加载,one-key根据按键注释自动生成辅助菜单
刚去翻了翻lazycat-emacs中的用法,我突然明白怎么搞了,之前陷入误区了,应该以one-key和lazy-load为核心,把meow很简单的绑定代码塞进去就行,我中午试试
顺便推荐大家想要加深对emacs的理解或者是写自己的配置的,可以尝试一行一行抄一遍lazycat-emacs的配置,真的,我这种原来一直用doom全家桶的人,抄了一遍后就能开始写配置了,lazycat的架构和思路很清晰,抽象的高度刚好,能学到很多东西,大大加深了对于emacs的理解,相比doom,能准确的把握到自己的每一行配置在干什么,很少发生出了问题只能无头苍蝇debug的情况了。
然后我已经awesome-shell awesome-pair awesome-tray等等awesome全家桶了,容易配置又好用,真香
3 个赞