如何fzf最近的文件vim/nvim,而不是在vim内,但从终端

sr4lhrrt  于 2022-11-11  发布在  其他
关注(0)|答案(5)|浏览(157)

我知道如何fzf.vim,但我想从终端打开。
阅读历史或阅读信息可能是实现这一目标的途径,但我想知道是否有什么聪明的方法。

k4ymrczo

k4ymrczo1#

以下是将最近使用的文件列表从vim保存到文件的方法:

vim -c "call append(0, v:oldfiles)" -c "write vim-oldfiles.tmp" -c exit

v:oldfiles(保存在~/.viminfo中的最近文件列表)放入第一个(新的且开始时为空)缓冲区,将缓冲区写入文件,退出。
现在您可以将文件的内容传递给fzf

7vux5j2d

7vux5j2d2#

不是精确的解决方案。但是你可以像IDE一样在你的vim编辑的下半部分打开一个终端缓冲区,然后使用你的终端fzf
但是,不确定这是否允许您在新的vim选项卡中打开文件

w7t8yxp5

w7t8yxp53#

我有一个名为old的zsh自动加载函数:

function old(){
    vim -c 'redir >> /tmp/oldfiles.txt | silent oldfiles | redir end | q'
    sed -i '/NvimTree$/d' /tmp/oldfiles.txt
    local fname
    fname=$(awk '/home/ && !/man:/ {print $2}' /tmp/oldfiles.txt | fzf) || return
    vim "$fname"
    \rm /tmp/oldfiles.txt
}
agxfikkp

agxfikkp4#

如果在路径中包含~的文件上执行vim时遇到问题(vim打开一个新的空白文件,而不是所需的文件),因为fzf和vim不扩展波浪号(~),下面是我的处理方法:

export FZF_DEFAULT_OPTS=$FZF_DEFAULT_OPTS"
--bind 'ctrl-e:execute(vim -c \"execute \\\"edit\\\" expand({})\" >/dev/tty)'
"

这是基于this的反复试验。

bvk5enib

bvk5enib5#

结合其他一些答案,这里有一个不需要临时文件并写入stdout的版本(这样您就可以将其传输到另一个命令中,或者使用$(...)捕获输出)。

vim -e -c "redir >> /dev/fd/100 | for f in v:oldfiles | silent echo substitute(f, \"^\\\\~\", \$HOME, \"g\")  | endfor | redir end | q" 100>&1 &>/dev/null

此解决方案结合了其他解决方案中的元素,但进行了一些改进:

  • 它使用一些shell重定向将stdout复制到某个空闲fd(100>&1),然后使用/dev/fd/100强制写入输出。这确保了vim实际上写入stdout而不是终端。注意,这也可以使用/dev/fd/1来实现(但只有当出于某种原因省略了redir end时),但这样我们就不能应用下一点了。
  • 它还将stdout(为了更好的测量)和stderr重定向到/dev/null,以防止vim在启动时将一些终端转义码写入stdout,因此使用不同的fd可以确保干净的输出。
  • 它在“ex”模式(vim -e)下使用Vim来抑制“Vim:警告:输出未到终端”输出和伴随的延迟。[source]
  • 它使用for循环遍历v:oldfiles,只输出文件名(https://stackoverflow.com/a/70749181/740048使用的oldfiles命令添加行号)。
  • 它使用一个替代来扩展vim返回的文件名中的~(这使得返回的文件名更容易处理)。通常,像bash这样的shell会扩展传递给命令的参数中的~,但这种情况只发生在命令中输入的代字号,而不是变量或命令替换产生的代字号。为了避免以后不得不依赖于不安全的求值,最好事先扩展(只是)代字号。
  • 我还尝试使用https://stackoverflow.com/a/60018642/740048中的append/write组合,它与/dev/fd/100技巧配合使用,但最后将/dev/fd/100放在了旧文件列表中,因此我没有使用这种方法。

相关问题