簡體   English   中英

如何 fzf 最近的 vim/nvim 文件,而不是在 vim 內部,而是從終端

[英]How to fzf recent files of vim/nvim, not inside vim but from terminal

我知道如何打開 fzf.vim,但我想從終端打開。

grepping history 或 viminfo 可能會實現,但我想知道是否有任何聰明的方法。

這是將最近文件列表從vim保存到文件的方法:

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

v:oldfiles (保存在~/.viminfo中的最近文件列表)放入第一個(新的並且在開始時為空)緩沖區,將緩沖區寫入文件,退出。

現在您可以將文件的內容傳遞給fzf

不是確切的解決方案。 但是您可以像 IDE 一樣在 vim 編輯的下部打開一個終端緩沖區並使用您的終端 fzf

但是,不確定這是否會讓您在新的 vim 選項卡中打開文件

如果您在路徑中有~的文件上執行 vim 時遇到問題(vim 打開一個新的空白文件而不是所需的文件),因為 fzf 和 vim 不擴展波浪號( ~ ),我是這樣做的:

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

這是基於的反復試驗。

我有一個名為 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
}

結合其他一些答案,這是一個不需要臨時文件並寫入標准輸出的版本(因此您可以將其通過管道傳輸到另一個命令,或使用$(...)捕獲輸出)。

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 實際上寫入標准輸出而不是終端。 請注意,這也可以使用/dev/fd/1進行(但僅在由於某種原因省略redir end時),但是我們不能應用下一點。
  • 它將stdout(並且為了更好的衡量標准)也重定向到/dev/null ,以防止vim在啟動時將一些終端轉義碼寫入stdout,因此使用不同的fd可以確保干凈的輸出。
  • 它在“ex”模式( vim -e )下使用 vim 來抑制“Vim:警告:輸出不是終端”輸出和伴隨的延遲。 [來源]
  • 它使用 for 循環遍歷v:oldfiles以僅輸出文件名( https://stackoverflow.com/a/70749181/740048使用的oldfiles命令添加了行號)。
  • 它使用替代擴展 ~ 在 vi​​m 返回的文件名中(使返回的文件名更容易處理。通常,像 bash 這樣的 shell 在傳遞給命令的參數中擴展 ~ ,但這僅發生在鍵入的命令中的波浪號,而不是波浪號導致來自變量或命令替換。為了防止以后不得不依賴不安全的評估,最好事先擴展(僅)波浪線。
  • 我還嘗試使用https://stackoverflow.com/a/60018642/740048中的append / write組合,該組合與/dev/fd/100技巧一起使用,但最終將/dev/fd/100放入列表中oldfiles,所以我沒有使用這種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM