Emacs 折腾日记(二十一)——编辑能力提升

Masimaro
2025-04-22 / 0 评论 / 4 阅读 / 正在检测是否收录...

上一篇文章,我们补充了一些基本的配置,并且关闭了一些默认的行为。这里我们继续对它进行配置。本篇将要使用一些插件来修改默认的编辑行为进一步提高编辑文本的效率。

avy 插件

基础用法

在vim中有 easymotion 可以使用,在Emacs中可以使用 avy 插件。它的功能于前面介绍的easymotion 类似。通过下面的代码来安装

(use-package avy
  :ensure t
  :after general ;; 确保 general 插件已经安装
  :config
  (setq avy-timeout-seconds 0.5)
  (my-leader-def
    "f" 'avy-goto-char-timer))

我们在安装配置的时候使用之前定义的leader键来定义它的一些行为。

首先定义 SPC-f 来进行快速跳转。avy-goto-char-timer 的功能与 easymotion 类似,将要查找的字符使用不同的字母进行标识,然后根据下一步的输入来确定光标的位置,例如下面的例子

avy 基础用法
我们可以连续输入一段内容减少待筛选项。当然这个速度要快,否则在一定时间内没有输入文本之后,avy会认为已经结束输入了。这个等待的时间我们在上面通过 avy-timeout-seconds 定义的是 0.5。当然也可以扩大这个时间范围

进阶用法

这个简单的功能只是 avy 功能的冰山一角。它还有许多有用的功能,如果能熟练使用将会极大的提高编辑文本的效率。

实际上avy 在筛选、跳转之前可以执行用户指定的动作,它支持哪些动作呢?我们可以在输入筛选的部分文本后输入?,查看支持的动作。

我们来举一个例子:
下面有一段文本,我希望将text1复制到最后一行,那么可以这么操作

  1. 使用<leader>f 激活 avy,然后输入筛选文本
  2. 输入 Y 表示复制整行
  3. 输入对应字符表示选中text1 所在行

此时我们会发现,text1 已经被复制到光标所在行了

avy 进阶用法

多行操作和块操作

在vim中我们介绍了多行操作,主要是使用C-v 来选中某些行,然后通过使用A 或者 I 来选中行尾或者行首,并进入插入模式。这种方式可以同时在对应位置插入多个相同的字符。emacs 中的 evil 插件也可以进行相同的操作。但是对于行间或者每行在不同位置插入的情况就不适用了。

我们可以使用插件 evil-multiedit 来达到这一效果。evil-multiedit 深度绑定了vim的快捷键,在选中区域之后可以直接使用vim中的 I/A 来编辑选中区域的首部或者尾部。也可以使用 ciw 之类的同时修改多个选中区域。在选区时既可以使用vim 中的 * 来查找并选中,也可使用 / 来搜索并且同时选中多个。这个插件相当于增强了vim的多行编辑功能

我们使用下列的代码来安装和简单的配置

(use-package evil-multiedit
  :ensure t
  :after evil
  :config
  (evil-multiedit-default-keybinds)
  (my-leader-def
    "m m" #'evil-multiedit-match-and-next ; 标记当前符号并跳转下一个
    "m M" #'evil-multiedit-match-and-prev ; 标记当前符号并跳转上一个
    "m a" #'evil-multiedit-match-all ; 标记所有相同符号
    "m r" #'evil-multiedit-restore ; 恢复单光标模式
    "m c" #'evil-multiedit-toggle-or-restrict ; 切换选区/限制编辑区域
    ))

我们可以使用 <leader> mm 来选中符合条件的项
使用*选中

也可以使用 <leader> ma 来选择所有符合条件的项
使用ciw选中

搜索选中

好了,本节到此也就结束了,本节依靠两个插件,进一步模拟vim相关的功能,并且对vim原有的功能进行了一定程度的补强。熟练使用这两个插件将会对编程的效率有一个进一步的提升。作为一个普通的文本编辑器也足够了。

0

评论 (0)

取消