【问题标题】:Emacs: what are good tactics for navigating directories and opening files?Emacs:导航目录和打开文件的好策略是什么?
【发布时间】:2012-02-22 14:44:09
【问题描述】:

上周,我(再次)因不得不处理 R 和 Perl 的不同 IDE 感到愤怒,我不喜欢或使用这两种 IDE 来让我真正感到舒服,我决定尝试 Emacs。做出这个决定时,我是出于某种恐惧。我的主要用途是用于带有 cperl 的 Perl 和带有 ESS 的 R。我的环境是 Windows 7 Ultimate 64 位,我正在运行 v23.4.1,我认为这是 ESS 包代表我安装的。

在将近一周的时间里,到目前为止,它出奇地轻松,没有比任何其他重要的软件更多的参与。我已将我的 ctrl 键重新映射到大写锁定、更改默认文件夹、弄乱 .emacs 并添加了一些附加功能,例如自动安装、yasn-p、颜色主题、冰柱和其他一些。显然那里有一些非常复杂的东西。当然,基础 Emacs 的某些特性立即变得非常强大和有用,例如向上和向下搜索。总的来说,我感到惊喜和放心。

比我预期的更粗略的一件事是查找和打开文件的过程。在粗略阅读了各种教程后,我得到了这张准神奇的文件位置和文件名自动完成的图像。我设置中的主目录具有 g:/roaming/code/perl 或 g:/roaming/code/R/ 之类的路径,但我经常需要分支到完全不同的路径,例如 g:/pricedata/support files/sector/project01/等等。

目前,当我需要使用不同的 fork 时,我会费力地删除文件路径,然后使用自动完成功能更深入地进入文件系统的该分支。这让我回到了二十年前在 Amiga 上运行 bash shell。

我期待什么?类似于(使用上面的示例)键入“project01”以立即跳到路径底部的文件夹中。出于某种原因,我想到 Emacs 会预加载目录。所以也许这不太现实。

我的猜测是,我的困难可能源于我自己不熟悉,而不是 Emacs 的结构缺陷,并导致了我的问题。我不能抱怨没有足够的文件;而是有丰富的信息,它散布在相当随意的地方。 Icicles 也有类似的问题 - 如果有的话太多了。

1) 在尝试打开 minibuffer 中的文件或使用其他方法时,在文件树的不同分支中移动的最佳策略是什么?是否有别名可用于从一个地方到另一个地方的快捷方式,或者可以指定要预加载的目录?人们只是经常CD吗?还是我从完全错误的角度出发,需要采取不同的策略?

2) 通过额外的设置,是否可以使用自动完成功能在(比如)上面的 project01 中直接通过通配符等前缀查找文件?我应该关注什么才能在这里变得更有效率?我不是在利用诸如冰柱之类的附加组件的力量吗?

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

【问题讨论】:

    标签: emacs icicles


    【解决方案1】:

    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,则可能在标准存储库中提供了它。

    【讨论】:

    • auto-install 看起来很有趣,但实际上并不是这里的要求(即有其他方法可以获取和安装anything)。
    • @phils:非常正确,我刚刚复制了我的设置方式。我会将auto-install 部分放在答案的末尾。
    • 一切都很棒。不确定最终用户使用它有多容易,但作为编码人员,使用它是纯粹的幸福。 ;) 它远远优于 ido 或我的用途。此外,维护者在 Google 组“emacs-anything”中非常友好和响应迅速。我强烈建议你试一试。
    • +1。欣赏一步一步的,也提到欧洲央行,我一有时间就会研究一下。我倾向于同意开发人员的观点,即基本 Emacs 并不擅长浏览文件。
    • @SlowLearner 查看projectile 和helm-projectile,在this excellent guide 中进行了描述。
    【解决方案2】:

    您可以从使用 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 使用类似这样的东西(我不确定我从哪里得到这个 sn-p):

    (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-f (ido-find-file) 查找当前位置附近的文件,并使用C-x C-r (ido-recentf-open) 查找最近打开的文件(希望其中一个不会太远远离你想去的地方)。

    【讨论】:

    • +1。很有用。我已经打开了 ido,现在正在使用它——看起来很整洁。我很感谢上面的省略号,尽管我暂时被 require-or-install 和 install-elisp 所依赖,这取决于它。在这一点上,我仍然没有足够的知识来区分核心 Emacs 和附加组件,但我最终做到了。
    • @SlowLearner 抱歉,require-or-install 是我编写的自定义函数,用于在新计算机上首次启动 emacs 时安装所需的模式。我删除了所有提及它的内容,上面的 sn-ps 现在应该是标准核心 emacs。
    • 在这个答案中提到 ido 虚拟缓冲区会很高兴。
    【解决方案3】:

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

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

    【讨论】:

    • 非常简洁的总结,将基本 Emacs 功能放在首位,并附有链接 - 谢谢。我已经查看并启用了文件名缓存和最近的文件。
    【解决方案4】:

    除了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跳转注册

    【讨论】:

      【解决方案5】:

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

      调用任何事物的一个特定功能是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 知道你做了什么,并相应地进行调整。

      【讨论】:

      • 任何东西都重命名为 helm,我相信
      【解决方案6】:

      其他可能性:

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

        • Bookmark Dired 缓冲区,它会记住它们插入的子目录、它们的标记和它们的文件遗漏。你可以有一个书签,打开 Dired 到一组特定的文件,这些文件不需要在同一个目录甚至同一个目录树中。

        • 在 Dired 中,您可以按一个键为每个标记的文件或子目录创建单独的书签。

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

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

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

      2. Icicles。

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

        • 在完成过程中对候选文件采取不同的方式。

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

      3. Dired+。

        • 额外的navigation,包括i 在子目录列表和父列表中的子目录行之间跳转。

      参考:

      【讨论】:

      • 在我问了这个问题两年多之后,我发现我每次使用 Emacs 时都会使用 bookmarks 和 bookmarks+,所以最终证明这对我来说是正确的解决方案。跨度>
      • 如果它确实是适合您的解决方案,并且如果这也意味着它是您的问题的最佳答案(不一定遵循),您可以根据需要更改接受的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多