Emacs 风格的文件操作和项目文件管理是啥样的?

treemacs 也支持键盘操作好吧 :new_moon_with_face:

treemacs 主要的场景是多个 workspace 多个 project 的管理,可以通过切换 workspace 来切换展示不同的 project,比如公司和个人项目之间切换,比较方便。

但是我因为习惯了 vscode 中的 资源管理器 ( 就是那个树形文件导航 ) 的操作风格。主要操作大概是,浏览项目目录结构 ( 展开、收起文件夹 ),侧边打开 ( vscode 垂直分出第二屏并在第二屏上打开文件 ),copy&past,复制完整路径,重命名,删除,拖拽移动等等。

treemacs 默认的快捷键

  • 侧边打开: o h (open horizontal)
  • copy: y f (会直接提示要 paste 到的路径)
  • 复制完整路径: y a
  • 重命名: R
  • 删除: d
  • 拖拽移动:支持

这些快捷键记不住的话在 treemacs 里按 ?就可以看到提示了

提供一个其它思路,你可能需要快速查找org文件,但也不一定使用tree, 所以org-roam可能是好的选择,它可以快速按照文件名模糊匹配文件名。 如果org文件是以英文命名则可以通过几次键盘敲击就能找到所需要org文件。

是的,我现在就在测试 speedbar 和 neotree 到底哪个更合适一点。

我只需要一个浏览功能就够了。

ps: 按理说,speedbar 功能应该不比 neotree 差多少吧,speedbar 还内置,但 neotree 我看到用人的更多 neotree 的特点在哪?

主要是,我想要尽可能少地装插件以提高整个 emacs 的鲁棒性,而 treemacs 规模太大,我把握不住 :new_moon_with_face:

ho 这个确实不错。我去 Linux 上体验一下。

我去试试 find-file-in-project, 正好可以和能检索内容的 color-rg 搭配。

推荐一个Dired-sidebar,可以同时拥有treemacs 的外观和dired 的操作,也不会像treemacs 那样庞大

sidebar确实占用空间,我也不用。

我就是一整个屏幕显示文件,或者分割窗口看不同位置。文件管理没有太多需要,所以不怎么依赖emacs。

演示了一下: 展开文件夹 - 打开文件 - 复制路径 - 创建/复制/移动/重命名文件 - 搜索 + 预览 (比如预览项目里的图标啥的)

我自己只在头几次打开不熟悉的项目时用 sidebar 简单浏览下,熟悉以后就关了。其他时候主要用 dired-jump 。不过这个视频里演示的操作和在普通 dired buffer 里的操作是一样的,因为都是 dired。 也就是说,不需要你学两套东西。

这个包相对所有解决方案是最轻的。核心1200行+,其他的模块都是可选的,一般就百把行。

我能想到的 windows 上会遇到的问题是文件复制移动你要自己配置一下 dirvish-yank-methods。其他的应该和 linux 差不多。

1 个赞

看视频第一步是找到名为git的子目录,我会用M-x find-directory-in-project-by-selected (该命令来自find-file-in-project)一步完成找到目录并用dired打开。

那是我随便展开的目录,只是作为演示,不是刻意去找的。对于熟悉的项目,我大部分时候是直接用 fd 列出所有文件直接定位到文件,小部分时候是 dired-jump 然后前后上下几次找到想要的文件 (因为熟悉,也观察到当前文件和目标文件隔的很近,对我来说反而更快,省去了在 minibuffer 里过滤的步骤)。

对于从 vscode 这类工具过渡到 Emacs 的用户来说,我也挺能理解为什么他们会习惯从 sidebar 里面去找文件。因为在对一个项目不熟悉的时候,从目录树里找文件的方式虽然显得笨拙,但通过这个过程可以慢慢熟悉项目结构。另外就是复制移动文件的时候直接在目录树里操作比在 minibuffer 里手打路径显得直观得多。

dired-aux在dired有两个窗口时,在一个窗口中的文件操作的target directory智能设置为另一个dired窗口的目录。我觉得比sidebar中一步步展开更高效。

这种 side-by-side 的操作逻辑对于习惯 total-commander 或者 vifm 这类文件管理器的人可能比较好用,但我一直习惯不了。更具体地说,它这个「高效」的条件极其苛刻。如果我恰好开着两个 dired 窗口,而且另一个窗口正好是那个靶子,那确实一步到位。可是我实际使用时几乎不会开两个 dired 窗口,更不用说这种其中一个窗口只是单纯作为一个靶子。dired dwim target 这套范式搞得我很痛苦,我全程都是先射箭再画靶子。

我觉得比sidebar中一步步展开更高效

这要分情况。如果那些目录本身就已经展开了,那就很快。重点在于,在原生dired 下有两个限制: 1. dired 只读取当前buffer 的 marks。2. dired 没有比较好的快速浏览历史目录的方式。我觉得 dired-dwim-target 更像是这些限制之下不得已的办法。不然一个窗口能解决的事情我为什么要开两个呢?

所以 dirvish 借鉴了 ranger 和 lf 里的文件操作,并且使 marks 全局共享,你可以在一个 buffer 标记文件,然后切到另一个 dired buffer, 按 yy 粘贴。完全免去管理窗口的麻烦。

历史目录我写了一个命令,

我指的不是这种。是不通过 minibuffer 的,储存在当前会话内的「本地」历史记录。就类似现代文件管理器里的前进后退键。这个和quick-access 组合到一起,是心智负担最小的方式。

我视频里从项目目录到 HOME, 和从 fd 的搜索结果切换回来,就是用的这些命令。dirvish-history-go-forward/backward 和 dirvish-quick-access

见代码中的my-dired-directory-history,我没实现前进后退,但dired的历史记录存储在该变量里。

你这个命令我也提供了一个,但我自己用的很少。因为我发现我是能不打字就不想打字。懒 :sweat_smile:

mark全局共享设计不错,除了yy复制,还支持哪些操作?按键和evil有没有冲突?

有没有像楼下说的dirvish,支持mark全局共享?一个文件夹里标记,换到另一个文件夹里粘贴? https://emacs-china.org/t/emacs/22306/22?u=silaoa

这个我还真不确定,dired-sidebar的操作基本上沿用的dired,肯定还是dirivish功能更多一些