Emacs 折腾日记(二十五)——目录管理

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

在之前的文章中,分了几篇着重介绍了Emacs编辑方面的功能改造。作为一个文本编辑器,要想坚持用下去首先应该改造成自己熟悉的编辑方式。

本节我们来介绍Emacs的目录管理

Dired Mode

Emacs自带一个名为 Dired (Directory Editor) 的插件,它负责对目录进行操作。默认的,我们可以使用 C-x d 来进入Dired Mode。启动后它会等待用户输入想进入的目录,默认是当前目录。

Dired Mode 是提供了一种类似操作文本的方式来操作目录。我们可以像操作文本那样来对目录进行类似于

  • 拷贝
  • 剪切
  • 粘贴
  • 删除
  • 创建
  • 跳转
  • 查找
  • 重命名
  • 批量操作

得益于前面的篇章配置的一些插件,可以很方便的使用Dired Mode

dired 美化

在正式介绍dired 使用之前,先稍微对它进行一些美化,原始的界面太素了,看着不太好看。

首先介绍 diredfl ,原始的dired 只能使用两种颜色来区别文件和目录,而 diredfl 可以使用多种颜色,让dired显示的更加漂亮

(use-package diredfl
  :ensure t
  :hook (dired-mode . diredfl-mode))

接着我们再使用 all-the-icons-dired 来给dired显示的前面加上一个图标。这个插件依赖 all-the-icons 插件。

(use-package all-the-icons
  :ensure t
  :when (display-graphic-p)
  :commands all-the-icons-install-fonts) ;; 安装完成之后需要执行 all-the-icons-install-fonts 命令安装对应字体

(use-package all-the-icons-dired
  :ensure t
  :hook (dired-mode . all-the-icons-dired-mode))

我们也可以通过安装 all-the-icons-completion 插件,给minibuffer中的补全系统也加上图标

(use-package all-the-icons-completion
  :ensure t
  :hook ((after-init . all-the-icons-completion-mode)
     (marginalia-mode . all-the-icons-completion-mode)))

dirvish 增强dired

dirvish 是在dired 基础之上的文件管理增强插件。相对与dired 它提供快速跳转、实时预览、并且能兼容对dired的一些扩展。

(use-package dirvish
  :ensure t
  :hook (after-init . dirvish-override-dired-mode)
  :bind(
    ("C-x d" . dirvish)
    ))

我们使用命令 dirvish 就能打开对应的窗口,或者像上面那样绑定快捷键来打开对应的窗口

使用vim的方式来操作目录

这里的使用vim的方式来操作多少有点标题党的意思。我无法做到完全按照vim编辑文本那样来编辑目录,但是这里我可以修改以下对应的快捷键已达到某些操作可以使用vim的快捷键。

(use-package dirvish
  :ensure t
  :hook (after-init . dirvish-override-dired-mode)
  :bind(:map dired-mode-map
         ("C-x d" . dirvish)
         ("y" . dired-do-copy) ;; 拷贝粘贴
         ("d" . dired-do-delete) ;; 删除
         ("r" . dired-do-rename) ;; 重命名
         ("a" . dired-create-empty-file) ;; 创建空文件
         ("+" . dired-create-directory) ;; 创建文件
         ("SPC" . nil) ;; 取消空格键的绑定
         )
  :config
  (with-eval-after-load 'evil
    (evil-define-key 'normal dired-mode-map "r" 'dired-do-rename)) ;; 排除evil模式下默认键的覆盖
  (my-leader-def
    "j" #'dired-goto-file)
  )

在上述的配置中,我绑定的快捷键如下

快捷键功能
C-x d打开dired
y拷贝
d删除
r重命名
a创建空文件
+创建空目录
SPC j跳转到指定文件

需要注意的是,在 config 中调用了这样的语句

 (with-eval-after-load 'evil
    (evil-define-key 'normal dired-mode-map "r" 'dired-do-rename))

with-eval-after-load 表示在某个插件加载之后,这句代码的意思是,在evil插件加载后,在normal模式下,我们定义dired mode 下快捷键 r 绑定到 dired-do-rename,也就是重命名这个功能。之所以要这么做是因为在evil插件加载后会覆盖我们定义的快捷键。

另外为了正常使用 leader键,这里特意取消了空格键在dired 中的定义,原本它被定义为跳转到下一行。

这些功能都比较简单,所以这里就不演示了。

搜索文件并跳转

正常情况下,当项目文件和代码量上来之后,再一个目录一个目录的找就不太现实了。常见的是根据代码中函数定义来找文件或者根据文件来找函数定义。前者我们通过consult-rg 已经实现了。这里介绍以下如何通过文件名来查找并快速打开文件

我们可以使用 consult-locate 来搜索文件,结合前面介绍的orderless,我们只需要对文件有一个相对的映像就可以找到。想要使用 consult-locate 需要安装 locate 程序,在Arch Linux 中可以使用下面的命令安装

sudo pacman -S mlocate
sudo updatedb ;; 更新数据库

我们以打开配置文件中的 init-completion.el 为例。
我们可以直接使用 M-x 输入命令 consult-locate并回车 , 接着在命令提示符后输入一个大概的内容,然后在minibuffer的候选项中找到对应的文件即可

consult-locate

我们也可以结合 embark-act 命令来做到跳转到文件所在的 dired 中,这里我们在 embark 的配置中添加一个快捷键定义

(use-package embark
  :ensure t
  :after consult
  :bind
  (("C-e" . embark-export)
   ("C-;" . embark-act))) ;; 添加 embark-act 快捷键

这样在定位到文件之后,可以直接使用 C-; 调出对应的动作,最后使用 j 来完成进入dired的动作

embark-act

有了 consult-locateembark-act,前面介绍的 dired中的跳转操作的实用性就大大降低了,如果我们记得文件的全路径,直接使用 find-file 打开就好了。如果只有一个模糊的映像,那么使用 consult-locate 配合 orderless,比进入dired 然后执行跳转要快的多

到这里,Emacs中关于目录管理的部分就介绍完了。使用dired配合键盘操作能极大的提升的效率

0

评论 (0)

取消