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

时间:2012-02-22 14:44:10

标签: emacs icicles

上周,由于不得不应对R和Perl的不同IDE而激怒(再次),我不喜欢或使用足够的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中查找文件吗?我应该关注什么才能在这里变得更有效率?我没有利用像冰柱,任何东西等附加物的力量吗?

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

6 个答案:

答案 0 :(得分: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/")

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

(require 'anything)
(require 'anything-match-plugin)
(require 'anything-config)
(require 'anything-show-completion)

然后对M-x anything做任何事情。

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

答案 1 :(得分: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))

虽然这可能会帮助您快速找到“不远处”的文件,但它可能无法帮助您在完全不同的位置查找文件。

如果发现开始解决此问题的一种方法是使用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)

有了这个,您可以使用C-x C-fido-find-file)查找当前位置附近的文件,并使用C-x C-rido-recentf-open)查找最近打开的文件(希望他们中的一个离你想去的地方不太远。)

答案 2 :(得分: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)
    

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

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

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

    然后使用C-x r j

  3. 跳转到注册

答案 3 :(得分:7)

有各种方法。 File name cache是内置的解决方案。打开文件from recent files也非常有效,特别是如果您将存储的文件设置为较大的数字(例如1000)。文件系统上还有opening files from anywhere的包。并且有一些元解决方案like anything.el可以在一个公共界面中显示来自多个来源(历史,项目文件等)的文件完成。

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

答案 4 :(得分:6)

其他人已经提到了什么,只要说,我相信它可以解决你所有的问题。 :)

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

汤姆提到了file-cache。任何有用的东西。

正如旁注,一旦你习惯了,Dired就是一个绝对的怪物。您应该阅读与之相关的emacswiki页面。尤其是Emacs附带的dired-x绑定 C-x C-j ,跳转到Dired中的当前缓冲区对我来说是一个启示。另外dired-findwdired

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

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

答案 5 :(得分:5)

其他可能性:

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

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

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

    • 自动收藏文件(自动文件)。

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

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

  2. <强> Icicles

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

    • 在完成期间以不同方式对候选文件采取行动。

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

  3. <强> Dired+

    • 其他navigation,包括i在子目录列表与父列表中的子目录行之间跳转。
  4. 参考文献: