30

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

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

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

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

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

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

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

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

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

4

6 回答 6

13

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

方式:下载它,auto-install放入 Your 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,则可能在标准存储库中提供了它。

于 2012-02-22T15:19:33.753 回答
9

您可以从 using 中受益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-f( ido-find-file) 来查找您当前位置附近的文件,并且C-x C-r( ido-recentf-open) 来查找最近打开的文件(希望其中一个离您想去的地方不太远)。

于 2012-02-22T15:11:29.187 回答
8

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

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

于 2012-02-22T15:18:58.860 回答
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

于 2012-02-22T15:12:07.567 回答
6

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

调出任何事物的一个特定特征是anything-locate。在 *nix 系统上,这使用由 locate 命令创建的数据库来快速查找文件。在 Windows 上,我相信它适用于“Everything”,它应该为您提供所有文件的近乎即时的搜索结果。我的意思是所有

汤姆提到过file-cache。任何东西都适用。

顺便说一句,一旦你习惯了 Dired,它就是一个绝对的怪物。您应该阅读与之相关的 emacswiki 页面。特别dired-x是 Emacs 附带的绑定C-x C-j、跳转到 Dired 中的当前缓冲区对我来说是一个启示。还有dired-findwdired

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

当你在 Dired 缓冲区中弹出当前缓冲区时,你可以对其进行修改,即重命名、删除等。Emacs 知道你做了什么,并相应地进行调整。

于 2012-02-22T16:49:42.410 回答
5

其他可能性:

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

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

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

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

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

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

  2. 冰柱

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

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

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

  3. 干+

    • 附加导航,包括i在子目录列表和父列表中的子目录行之间跳转。

参考:

于 2013-08-11T23:36:15.633 回答