我使用了ido-mode
,但是我讨厌的一件事是,在C-x C-f
我无法使用up/down
键来循环浏览最近打开的文件之后,就像以前那样iswitchb
。如何设置ido
这种方式?
我使用了ido-mode
,但是我讨厌的一件事是,在C-x C-f
我无法使用up/down
键来循环浏览最近打开的文件之后,就像以前那样iswitchb
。如何设置ido
这种方式?
Answers:
查看ido-mode
(M-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,重新启动,然后切换到以前打开过的文件缓冲区,就好像它仍然打开一样。
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
应该循环浏览最近打开的文件。句号
ido-use-virtual-buffers
-一项很棒的功能,IMO默认情况下应该确实启用。
尽管绑定已经随着时间而发展,但是从今天开始,当您调用ido-find-file
或时ido-find-file-read-only
,您可以使用默认配置中可用的以下绑定:
ido-prev-work-file
ido-next-work-file
除了这些不是因为符合人体工程学愉快的M-p和M-n尝试之前,我已经习惯了绑定IDO,他们也慢,以及随之而来的小缓冲区颤动分散和混乱。ido所做的不只是显示最近打开的文件名而已;它报告说它是“正在搜索' 文件名 '...”,也许是出于不愿为不再存在的文件提供名称的原因。
“正在搜索”消息来自function ido-make-merged-file-list
。阅读源代码后,我看不到有任何方法可以禁用此功能正在执行的任何操作。
您可以考虑将ido-prev-work-file
和ido-next-work-file
对重新绑定到更自然的东西,例如C-M-p和C-M-n,或将当前M-p(ido-prev-work-directory
)和M-n(ido-next-work-directory
)绑定换成这些。
这是Emacs Lisp代码,用于还原M-p和M-n循环浏览最近的文件,将默认的以目录为中心的绑定分别移动到C-M-p和C-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)))))
@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)
我发现helm-for-files
,出于文件名自动完成和具有不错的搜索界面的目的,它比以上任何一个答案都更有效。另外,您可以对其进行配置,使其包含您喜欢的任何搜索项目。