猫态编辑:Meow

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 里面是相关的实现。

  1. 明白,就是说 meow-left 依赖 C-b,所以我改了 C-b 就会影响 meow-left ; meow-right 同理。
  2. 明白,
  3. 好的,我试试看能不能为自己使用的语言单独搞下规则。

谢谢回复 :relaxed:

1 个赞

加了一个自动调整 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 个赞

能在这些地方有效,就已经符合预期了。非常感谢!

@Lewisliu 关于多点编辑,目前探索的方案

cursor

BMACRO 模式的说明

名称

Batch Macro,用于批量执行 kmacro 的模式。如有更好的名字可以更换。

启动和关闭的方法

当前处于 NORMAL 模式,光标进入第二选择区域时自动激活。 光标离开第二选区或第二选区消失时自动关闭。

PS:使用 meow-grab 或 Alt + 鼠标选择创建第二选区。

enter

启动后可用的命令

启动后光标移动的时候,会跟据移动的方式不同,在第二选区内产生不同位置的假光标(或假选区)。

目前支持上下左右,word, symbol, line, join, find, till, visit, mark-word, mark-symbol 等命令。

motions

使用 F3 (绑定了 kmacro-start-or-insert-counter 的位置会被 bmacro 临时覆盖,下同) 来录制宏,F4 结束的时候,宏会自动的应用到所有的假光标。如果没有在录制宏,F4 会直接应用最后一个宏到当前真光标和所有的假光标。

call

insert, append, change 会进入 insert 模式,并自动开始宏的录制,在 exit 的时候自动应用到所有的假光标。

quick

PS: replace 可以相当于对多个地方 replace (这个功能实现和 kmacro 无关)

TPS:

  1. 已有第二选区相关的功能不受影响, 依然可以用 swap-grab 交换两种选区或是用 sync-grab 将主选区内容覆盖掉第二选区。
  2. BMACRO 模式的光标不能直接用于编辑,只能用于 kmacro,这样规避了各种插件的兼容性问题,不需要像 multiple-cursor 里面那样备份还原变量,或是打补丁。
  3. 在 BMACRO 下无法唤出 KEYPAD 模式。
  4. 开始宏的录制后所在的模式是 NORMAL。
  5. 用户配置中没有需要新绑定的按键和命令。

对比旧方案

旧方案使用 meow-kmacro-lines 和 meow-kmacro-matches ,两个独立的命令。

虽然用起来还可以,但是能解决的问题场景比较固定。新方案同样能做到这两个命令的效果,某些情况下可以用更少的按键。新方案还复用了 meow 自带的多种移动命令。更符合 meow 的 less is more 的思想。

新方案同旧方案一样对 kmacro 有良好的兼容性,保证了

  1. 已有的 kmacro 可以应用在当前的这套流程
  2. 这套流程产生的 kmacro 可以后续继续应用
5 个赞

默认关闭了 cursor 位置的 hack, 当前的默认行为 cursor 和以前是相同的。需要位置处理的话,使用

(setq meow-use-cursor-position-hack t
      meow-use-enhanced-selection-effect t)

两个设置。需要在激活 meow-mode 前设置。

光标的位置是为了更符合 vim 用户的习惯,但是感觉并不是编辑的核心需求,所以默认关闭了。


开启时:

image

关闭时:

image

1 个赞

好像更新之后,在 doom-one theme 下,自动调整光标颜色的功能失效了?

修复了,少了一行 require 'dash…

再麻烦问个问题,关于 meow-cancel-selection 这个方法,他的描述是 "Cancel selection or grab " 。但实际上好像并没有取消 grap 的效果,这个是文档没有更新还是我用法不对呢?

(我明白可以设置 meow-selection-command-fallback 来达成目的)

文档问题,我更新一下。感觉经过很多改动之后,需要一波大的文档工作了。

期待新文档和教程了,尤其期待使用思路方面的描述 :joy:

目前仅简单的使用,有几个优点兼容性,和meow以及近乎所有的emacs按键都能兼容,灵活性很好。然后,可以复用kmacros的那一套,包括录制和保存。最后,多行的匹配更加灵活,不仅包括了我之前习惯的vim行编辑,而且也能享受宏的优势

狗哥做出了很神奇的功能,很棒,很实用。

补充一下,太赞了,一键进入录制退出到normal自动执行宏,好多行文字多次同步修改太快了,太快了,原vim用户震惊

有一个疑惑,就是如果我在bmacro里,通过f选择一个字符并进行修改,但结果会修改到每一行所有的匹配字符,而不是每一行的一个

image 比如输入“f a",匹配到字符a,光标的修改位置是在原来位置起匹配到的第一个a的位置,但是结束后会修改所有的匹配位置。 image

这种修改也不错,不过有时可能仅需要修改每行中的一个,有办法进行选择吗

现在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 个赞