Emacs:导航目录和打开文件的好策略是什么?

Slo*_*ner 27 emacs icicles

上周,由于不得不应对R和Perl的不同IDE而感到激怒(我再也不喜欢或者使用其中的任何一个以获得非常舒适),我决定尝试使用Emacs.如果没有我的某种惶恐,就不会做出这个决定.我主要用于带有cperl的Perl和带有ESS的R.我的环境是Windows 7 Ultimate 64位,我正在运行v23.4.1,我认为这是代表我安装的ESS软件包.

差不多一个星期到目前为止,它已经令人惊讶地无痛,没有任何其他重要软件的参与.我已经将我的ctrl键重新映射到大写锁定,更改了默认文件夹,与.emacs混淆并添加了一些功能,如自动安装,yasnippet,颜色主题,冰柱和其他一些.显然,那里有一些非常复杂的东西.当然,基本Emacs的某些功能立即非常强大和有用,例如isearching up和down.总的来说,我感到惊喜和放心.

有一件事比我想象的还要粗糙,就是查找和打开文件的过程.在粗略阅读各种教程后,我得到了这个准魔法文件位置和文件名自动完成的图像.我的设置中的主目录有g:/ roaming/code/perl或g:/ roaming/code/R /等路径,但我经常需要分支到完全不同的路径,如g:/ pricingata/support files/sector/project01 /等等.

目前,当我需要使用不同的fork时,我会费力地删除文件路径,然后使用auto-complete深入到文件系统的那个分支.二十年前,它让我回到Amiga上运行bash shell.

我有什么期望?类似于(使用上面的示例)键入'project01'以立即跳到路径底部的文件夹中.出于某种原因,我在脑海中得到了Emacs预加载目录的想法.所以也许这是不现实的.

我的猜测是,我的困难可能源于我自己缺乏熟悉而不是Emacs的结构性缺陷,并导致我的问题.我不能抱怨没有足够的文件; 相反,有大量的信息,它是随意分散的.冰柱有类似的问题 - 如果有什么太多的话.

1)尝试在迷你缓冲区中打开文件或使用其他方法时,在文件树的不同分支周围移动的最佳策略是什么?是否有可用于从一个地方快捷方式到另一个地方的别名,还是可以指定要预加载的目录?人们只是光盘很多吗?或者我是从完全错误的角度来看这个并且需要采取不同的策略?

2)通过附加设置,可以通过前缀使用通配符等自动完成用于在(例如)project01中找到文件吗?我应该关注什么才能在这里变得更有效率?我没有利用像冰柱,任何东西等附加功能吗?

我意识到这些问题更加危险地关闭了没有明确答案的弃用类别.我的辩护是,在我承诺养成不良习惯或不良的长期解决方案之前,现阶段的一些提示/指导将受到欢迎,我怀疑这些答案将使其他可能正在考虑转换的人受益.如果有问题,我很乐意撤回或改写.

Ado*_*obe 12

helm(以前称为anything)可能适合你.您可以手动安装,也可以使用auto-install扩展安装.

对于auto-install方法:下载它,把你的load-path,然后添加到.emacs:

(add-to-list 'load-path "~/.emacs.d/site-lisp/auto-install")
(require 'auto-install)
(setq auto-install-directory "~/.emacs.d/site-lisp/auto-install/")
Run Code Online (Sandbox Code Playgroud)

然后呢M-x auto-install-batch anything.完成后,输入.emacs:

(require 'anything)
(require 'anything-match-plugin)
(require 'anything-config)
(require 'anything-show-completion)
Run Code Online (Sandbox Code Playgroud)

然后做M-x anything任何事情.

也尝试ECB(代表Emacs代码浏览器).如果您使用的是Linux,则可能在标准存储库中提供了它.


ffe*_*tte 9

您可以从使用中受益ido-mode,这大大增强了emacs中几乎所有位置的自动完成功能(特别是在查找文件或缓冲区时)

(setq ido-enable-flex-matching t
      ido-auto-merge-work-directories-length -1
      ido-create-new-buffer 'always
      ido-use-filename-at-point 'guess
      ido-everywhere t
      ido-default-buffer-method 'selected-window)
(ido-mode 1)
(put 'ido-exit-minibuffer 'disabled nil)
(when (require 'ido-ubiquitous nil t)
  (ido-ubiquitous-mode 1))
Run Code Online (Sandbox Code Playgroud)

虽然这可能有助于您快速找到"不远处"的文件,但它可能无法帮助您在完全不同的位置查找文件.

如果发现开始解决此问题的一种方法是使用recentf-mode快速跳转到最近的位置(如果你只有少量的常用项目目录,这可能会有所帮助).recentf可以ido使用这样的东西(我不知道我从哪里得到这个片段):

(recentf-mode 1)
(setq recentf-max-saved-items 50)
(defun ido-recentf-open ()
  "Use `ido-completing-read' to \\[find-file] a recent file"
  (interactive)
  (if (find-file (ido-completing-read "Find recent file: " recentf-list))
      (message "Opening file...")
    (message "Aborting")))
(global-set-key (kbd "C-x C-r") 'ido-recentf-open)
Run Code Online (Sandbox Code Playgroud)

有了这个,您可以使用C-x C-f(ido-find-file)查找当前位置附近的文件,并使用C-x C-r(ido-recentf-open)查找最近打开的文件(希望其中一个文件离您想去的地方不远).


Ole*_*liv 7

除了IDO和recetf之外,您还可以使用以下方法:

  1. 递归打开目录.

    (defun op-i:dired (rec)
      "customized dired: will display directory recursively when called with an argument"
      (interactive "P")
      (let ((dir (car (find-file-read-args "Dired: " nil))) 
            (opts (if rec (read-string "options: " "-lhAR") "-lhA")))
        (if (file-directory-p dir) (dired dir opts))))
    
    (define-key (current-global-map) (kbd "C-x C-d") 'op-i:dired)
    
    Run Code Online (Sandbox Code Playgroud)

    然后,您可以使用(通配符)搜索在目录缓冲区中导航,就像在任何其他缓冲区中一样.

  2. 使用Emacs寄存器指向常用目录.您可以在.emacs中初始化它们

    (set-register ?0 (cons 'file "c:/path/to/my-project0"))
    (set-register ?1 (cons 'file "c:/path/to/my-project1"))
    
    Run Code Online (Sandbox Code Playgroud)

    然后跳转到注册使用 C-x r j


Tom*_*Tom 7

有各种方法.文件名缓存是内置的解决方案.从最近的文件打开文件也非常有效,特别是如果您将存储的文件设置为较大的数字(例如1000).还有用于文件系统的任何位置打开文件的包.还有像any.el这样的元解决方案,它可以在一个通用界面中显示来自多个源(历史,项目文件等)的文件完成.

您应该调查不同的选项,找出最适合您的选项.


eve*_*_jr 6

其他人已经提到了任何东西,足以说明,我相信它可以解决你所有的问题.:)

调出任何一个特定的功能是anything-locate.在*nix系统上,它使用locate命令创建的数据库来快速查找文件.在Windows上,我相信它适用于"Everything",它可以让您在所有文件中获得接近即时的搜索结果.我的意思是全部.

汤姆提到过file-cache.任何有用的东西.

就像旁注一样,一旦你习惯了,Dired就是一个绝对的怪物.您应该阅读与之相关的emacswiki页面.特别是dired-x,随着Emacs的绑定C-x C-j,跳转到Dired中的当前缓冲区对我来说是一个启示.此外dired-find,wdired.

编辑:关于为什么C-x C-j很棒的一些细节.

当您在Dired缓冲区中弹出当前缓冲区时,您可以对其进行修改,即重命名,删除等.并且Emacs会知道您已完成的操作,并进行相应调整.


Dre*_*rew 5

其他可能性:

  1. 书签.如果您使用 Bookmark +,那么您还可以:

    • 书签Dired缓冲区,记住它们插入的子目录,标记和文件遗漏.您可以将打开的书签打开到一组特定的文件,这些文件不必位于同一目录中,甚至不必位于同一目录树中.

    • 从Dired您可以点击一个键为每个标记的文件或子目录创建一个单独的书签.

    • 自动为文件添加书签(自动文件).

    • 使用任意文本标记标记书签和文件(自动文本书签).(标签甚至可以是非文本Lisp对象).使用标签来组织,搜索等不同类别的书签.

    • 为书签或书签文件或Emacs桌面添加书签.跳转到这样的书签以恢复给定的项目状态/上下文.

  2. 冰柱.

    • 即使从不同的目录,即时定义临时或持久的文件集.以各种方式操作集合中的文件.(使用Emacs文件集,功能较弱,方法相同.)在任何完成命令期间完成对这些已保存集的文件名,而不仅仅是文件查找.

    • 在完成期间以不同的方式对候选文件起作用.

    • 搜索已添加书签的对象或已保存的文件或缓冲区集.

  3. Dired +.

    • 其他导航,包括i在子目录列表和父列表中的子目录行之间进行弹跳.

参考文献: