ivy 下如何用 c-x c-f 快速打开之前打开过的文件

之前用 ido 是有这样的功能的: 我之前打开过 /path1/test.1, 现在在任意目录下 c-x c-f 输入 test.1(甚至文件名的一部分), Emacs 就会自动搜索并打开 /path1/test.1 这个文件. 效果请看 gif 动画.

现在我从 ido 转向了 ivy, 请问一下这个功能在 ivy 下如何实现?

find-file.

recentf 应该是

据我所知,Ivy 不能在C-x C-f 快速打开之前打开过的文件,但是Ivy 可以快速打开之前打开过的文件。也就是说 Ivy 有类似的功能,但是实现的细节跟Ido 不一样,比如 ivy-switch-buffer 在切换buffer 的时候就可以打开之前打开的文件.

counsel-recentf,或者打开ivy-use-virtual-buffers,然后用ivy-switch-buffer(setq ivy-virtual-abbreviate 'full)使switch-buffer显示recentf的全部文件名。
https://oremacs.com/swiper/#basic-customization

2 个赞

实在不想用 recentf 这种方法, 但是目前还找不到比较完美的解决方案

@manateelazycat Any idea?

既然ivy没有自带的功能,建议楼主自己用ivy写一个命令整合find-file和recentf。没有合适的功能就自己实现就是Emacs之道。

+1

我觉得 counsel-bookmark 更有用

我用 helm recentf 插件, 不喜欢那种把 minibuffer 撑的很大的插件。

我最开始也尝试用 helm, 但是反应速度有点慢, 我就转到 ivy 了.

可以参考我的配置文件:EmacsWiki: init-helm.el

默认就用常用的, 偏门的利器单独绑按键,不要啥插件默认都打开,特别是那些全局搜索的插件。

我十年前开发 anything 的时候,把所有插件都弄上了,即使不用也要加上, 十年过后,发现平常用的就那几个插件, 像 helm-pacman helm-brew 这种插件,单独绑一个单独的按键, 偶尔用用就可以了。

试试在C-x C-f之后按C-r

2 个赞

会出现 Reverse-i-search, 并不是想要的结果哦

C-x C-f 之后用 M-p

默认绑定到的是 ivy-previous-history-element

不知道能不能满足你要求。

recentfcounsel-find-file混合起来就ok了, 其实也不用重写那么复杂, ivy自己有一个函数做的这个事(被用于显示virtual-buffer)

(defun counsel-find-file--with-recentf-source ()
         "Mix the `recentf' and current directory's files"
         (require 'recentf)
         (recentf-mode 1)
         (mapcar (lambda (x)
                   (put-text-property 0 (length x)
                                      'face 'ivy-virtual x)
                   x)
                 (mapcar #'substring-no-properties recentf-list)))

(ivy-set-sources
        'counsel-find-file
        '((original-source)
          (counsel-find-file--with-recentf-source)))

不过如果切换目录之后, 新添加的内容就会自动消失, 我不是很懂counsel-find-file里用了什么黑魔法, 就没仔细去弄.

1 个赞

像这种不常用的我都直接M-x了,也不费事

很棒! 先用上了, 期待改进