最近以ido-mode打开的文件


12

我使用了ido-mode,但是我讨厌的一件事是,在C-x C-f我无法使用up/down键来循环浏览最近打开的文件之后,就像以前那样iswitchb。如何设置ido这种方式?

Answers:


16

查看ido-modeM-x customize-group RET ido RET)的自定义选项,我看不到用于启用您描述的骑行行为的任何选项。

但是,您可以将以下内容添加到您的init文件中:

(require 'recentf)

(defun ido-recentf-open ()
  "Use `ido-completing-read' to find 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-r以完成Ido的选择,以选择最近打开的文件。

默认情况下,最近的20个文件将保留在历史记录中。我建议你曲柄通过设置多达类似150 recentf-max-saved-items

(setq recentf-max-saved-items 150)

奖励:访问最新文件,类固醇版

我在很多地方都没有提到它,但是Ido虚拟缓冲区使访问最近的文件变得非常容易。像这样启用它们:

(setq ido-use-virtual-buffers t)

您得到的行为是这样的:

如果不是nil,则引用过去的(“虚拟”)缓冲区以及现有的缓冲区。

从本质上讲,它的工作方式如下:假设您正在访问文件,则缓冲区将被清除midnight.el。以后,您想切换到该缓冲区,但是发现它不再打开。启用虚拟缓冲区后,缓冲区名称将保留在缓冲区列表中(使用ido-virtual面部,并且始终在末尾),如果选择它,它将再次打开文件备份。这使您无需再考虑最近打开的文件是否仍处于打开状态。大多数时候,您可以退出Emacs,重新启动,然后切换到以前打开过的文件缓冲区,就好像它仍然打开一样。


到目前为止,我已经投票支持,稍后将对其进行测试并了解其工作原理时会接受。(我对Lisp的理解很差)。
WeSenseASoulInSearchOfAnswers 2014年

@WeSenseASoulInSearchOfAnswers当然,请花些时间。如果您对我发布的代码有任何特定疑问,请告诉我。
itsjeyd 2014年

我接受了,但坦白说我不喜欢它,因为C-x C-r无法打开新文件。我也很惊讶无法以简单的方式自定义它。的历史C-x C-f非常明显,我无法理解为什么尚未实现ido。例如,M-x up/down通过最近的命令M-% up/down循环,通过最近的查询替换循环,甚至在emacs外部也是如此-bash或zsh的所有shell都使用up / down调用以前的命令。对我来说,C-x C-f up/down应该循环浏览最近打开的文件。句号
WeSenseASoulInSearchOfAnswers 2014年

@WeSenseASoulInSearchOfAnswers我同意您的看法,我也不知道为什么无法使用或自定义此功能。就我个人而言,这没什么大不了的,因为我使用了我在答案中描述的虚拟缓冲区功能,因此切换到最近的文件与切换到另一个缓冲区是一样的。真的很容易。但我知道,如果您习惯使用的功能不可用,可能会令人沮丧。
itsjeyd 2014年

5
+1:ido-use-virtual-buffers-一项很棒的功能,IMO默认情况下应该确实启用。
乔恩·O。

2

尽管绑定已经随着时间而发展,但是从今天开始,当您调用ido-find-file或时ido-find-file-read-only,您可以使用默认配置中可用的以下绑定:

  • M-o 调用 ido-prev-work-file
  • C-M-o 调用 ido-next-work-file

除了这些不是因为符合人体工程学愉快的M-pM-n尝试之前,我已经习惯了绑定IDO,他们也慢,以及随之而来的小缓冲区颤动分散和混乱。ido所做的不只是显示最近打开的文件名而已;它报告说它是“正在搜索' 文件名 '...”,也许是出于不愿为不再存在的文件提供名称的原因。

“正在搜索”消息来自function ido-make-merged-file-list。阅读源代码后,我看不到有任何方法可以禁用此功能正在执行的任何操作。

您可以考虑将ido-prev-work-fileido-next-work-file对重新绑定到更自然的东西,例如C-M-pC-M-n,或将当前M-pido-prev-work-directory)和M-nido-next-work-directory)绑定换成这些。

这是Emacs Lisp代码,用于还原M-pM-n循环浏览最近的文件,将默认的以目录为中心的绑定分别移动到C-M-pC-M-n

(add-hook 'ido-setup-hook
          (lambda ()
            (let ((kmap ido-file-dir-completion-map))
              (let ((key '(meta ?n)))
                (define-key kmap (vector (cons 'control key))
                  (lookup-key kmap (vector key)))
                (define-key kmap (vector key) 'ido-next-work-file))
              (let ((key '(meta ?p)))
                (define-key kmap (vector (cons 'control key))
                  (lookup-key kmap (vector key)))
                (define-key kmap (vector key) 'ido-prev-work-file)))))

1
欢迎使用Emacs SE!请尽量使答案集中在原始海报的问题上。当然,您对“ minibuffer chatter”的评论很有趣且相关,但是它分散了对问题的实际答案的注意力。更重要的是:请尝试以...的形式表达您的答案。您写的内容读起来更像是评论,它不太适合这样的问答网站。
辣椒粉

好吧,第一段及其后续列表回答了原始问题,该问题正在寻找用于循环浏览最近打开的文件的密钥。这些绑定默认存在,但是这里没有其他答案提到这些绑定。我正在研究重新绑定代码,一旦对它满意就将其包含在我的答案中。
2014年

2

在这种情况下,我采取的措施是通过在idomode中键入Cf回到正常的minibuffer行为。然后,您将拥有正常的历史记录浏览键。如果您事先知道,可以很快:Cxff :-)


1

@itsjeyd给出的答案非常完整。我只建议一个功能:

(defun ido-choose-from-recentf ()
  "Use ido to select a recently visited file from the `recentf-list'"
  (interactive)
  (find-file (ido-completing-read "Open file: " recentf-list nil t)))

;; bind it to "C-c f"
(global-set-key (kbd "C-c f") 'ido-choose-from-recentf)

WikEmacs提供


1

我发现helm-for-files,出于文件名自动完成和具有不错的搜索界面的目的,它比以上任何一个答案都更有效。另外,您可以对其进行配置,使其包含您喜欢的任何搜索项目。


1
@Drew舵本身具有ido模式。在大多数情况下,人们搜索这篇文章时,他们可能会对了解其他解决问题的方法感兴趣。
user10375
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.