猫态编辑:Meow

录了一个演示的视频,可能后面需要整个更完善的版本。

2 个赞

这里面的 after! 是不是 doom-emacs 特有的宏?


我加了个函数 (meow-setup-indicator) 直接在 mode-line 前面插入 meow 的状态指示器,不过在 doom-mode-line 下面好像不是很好用,所以把你的那段代码加到了 README 里面,写是针对 doom-emacs 的。

(defmacro after! (package &rest body)
  "Evaluate BODY after PACKAGE have loaded.

PACKAGE is a symbol or list of them. These are package names, not modes,
functions or variables. It can be:

- An unquoted package symbol (the name of a package)
    (after! helm BODY...)
- An unquoted list of package symbols (i.e. BODY is evaluated once both magit
  and git-gutter have loaded)
    (after! (magit git-gutter) BODY...)
- An unquoted, nested list of compound package lists, using any combination of
  :or/:any and :and/:all
    (after! (:or package-a package-b ...)  BODY...)
    (after! (:and package-a package-b ...) BODY...)
    (after! (:and package-a (:or package-b package-c) ...) BODY...)
  Without :or/:any/:and/:all, :and/:all are implied.

This is a wrapper around `eval-after-load' that:

1. Suppresses warnings for disabled packages at compile-time
2. Supports compound package statements (see below)
3. Prevents eager expansion pulling in autoloaded macros all at once"
  (declare (indent defun) (debug t))
  (if (symbolp package)
        (list (if (or (not (bound-and-true-p byte-compile-current-file))
                      (require package nil 'noerror))
                  #'progn
                #'with-no-warnings)
              (let ((body (macroexp-progn body)))
                `(if (featurep ',package)
                     ,body
                   ;; We intentionally avoid `with-eval-after-load' to prevent
                   ;; eager macro expansion from pulling (or failing to pull) in
                   ;; autoloaded macros/packages.
                   (eval-after-load ',package ',body))))
    (let ((p (car package)))
      (cond ((not (keywordp p))
             `(after! (:and ,@package) ,@body))
            ((memq p '(:or :any))
             (macroexp-progn
              (cl-loop for next in (cdr package)
                       collect `(after! ,next ,@body))))
            ((memq p '(:and :all))
             (dolist (next (cdr package))
               (setq body `((after! ,next ,@body))))
             (car body))))))

打算回头向 doom-mode-line 提个 PR 来支持一下 meow 的显示。

这里带感叹号的两个宏都是 Doom-emacs 特有的宏。这段代码主要是在doom-modeline-core 加载后 用doom-modeline-def-segment先定义meow的信息段,再用advice将meow的字段,通过doom-modeline-def-modeline加给所有的mode-line信息组合。


最好,是给doom-medeline提个PR, 用advice可以先用起来。doom-eamcs同步可能会慢点。

我已经把代码放到 README 里面了,其实大部分的 modeline 都可以直接向前追加一个 indicator,写了个函数 (meow-setup-indicator)。doom modeline 的话我看有很多模式编辑的支持诶,我打算发个 PR

1 个赞

我没用doom,但是装了doom-modeline,meow的不同模式在右下角可以直接显示为N、M、K、I

我提的 pr 合并了,目前应该前面也有显示了。

@mezi 根据你的建议,为 deletekill 加了 selection-command-fallback。

还有很多其它的小改进和 BUG 修复。按目前的设计,应该后续不会引入 breaking changes 了。

1 个赞

多谢。一直在用Meow,每次更新都会看有没有新的功能。最近狗哥真的是劳模了。看到有 rectangle 选择的expand。Meow有没有打算支持 rectangle 上的一系列编辑操作?

暂时没有,如果是多行插入的话,现在应该就可以实现,选了之后 C-t,如果是多行配合各种命令来移动和编辑的,感觉不如使用 kmacro。我自己都是用 kmacro 来操作,F3 录制,输入之后,F4 定义。之后你就可以用 F4 重复,或选择一些行,用 apply-macro-to-region-lines. 这样的话还可以复用。

如果专门要做文本展开的话,有个叫 tiny 的库不错。

1 个赞

搞了一个类似 which-key 的机制。Meow 本身和 which-key 没有冲突,不管是 vanilla keybinding 或是 leader 下都是可以用的。但是 KEYPAD 设计上用了一些 emacs 的按键特点,使用的 m 做为 Meta, esc 做为取消,del 做为 undo。这个和 which-key 的按键是不同的,而且 which-key 会拦截掉 keypad 的输入,暂时也没有什么好办法。

默认打开,使用 (setq meow-keypad-describe-keymap-function nil) 来关闭这个机制。这个东西和 which-key 没有冲突,仅仅在 keypad 下有效。

3 个赞

他还给eaf贡献了一个中文版的dockerfile,用的代码都是他搬运的。在Windows下面完美部署。

1 个赞

突然发现在插入模式下,如果选中区域了,退格只能删除一个字符而不是所选区域的内容,好奇怪呀

这是预期的行为,进入插入模式之后的选择区域,是为了还可以退出来换另一边。

如果只是要直接删除的话,也不需要进入选择啊,可以直接用 meow-kill 或 meow-delete。

喔喔喔,是这样啊

看了你的视频和文档,很有创意也很实用,想试试了,不过在doom里有点费劲,许多配置要调整一下,打算有空深入整整看,你的插件非常神奇

@DogLooksGood 狗哥。 之前meow要给某个 symbol 加个 pair(括号,引号等),只需要选择 symbol . 在头部或者尾部直接输入 pair( 括号 或 引号)就可以直接 wrap 这个symbol。比evil-surround还方便。现在这个功能怎么没有了。还是改了其他的方式?

现在你可以选择之后 SPC m ( (调用 M-(), 如果不想绑定任何按键的话。

这个功能是 paredit 的。我故意处理了一下屏蔽了这种情况,因为有时有选择,想插入括号的话就要先取消选择。

1 个赞

@DogLooksGood 我发现meow在org-mode上的两个问题。

  • meow-search 不能够检索折叠起来的内容。
  • expand的数字overlay显示不出来,expand动作正常。