ファイル履歴を確実に行き来する方法はありますか


15

MRUプラグインと同様に、最後に編集したばかりのファイルに移動したいと思います。

:bnextそして:bprev時々動作しますが、ほとんどの場合、私は単に不明瞭なファイルになってしまい、編集を覚えておらず、MRUプラグインに強制的にフォールバックします。

修正する方法はありますか?

Ctrl-^最後の2つのファイルを入れ替えます。より多くの間を移動する最良の方法は何ですか?

難しいかもしれませんが、現在の:bn :bp動作を改善できるものには同意します。私がよく見るバッファは完全に適切ではありません。おそらく、最近のファイルを追跡し、マッピングを作成できるようにフックを提供できるプラグインがありますか?

コメントに返信することで、私の考えが少し明確になりました。私が欲しいのは、ファイルを最新の保存順に移動できるようにすることです。そうすれば、履歴に戻ると、ファイルを保存するまで順序は変わりません。ファイルが最後になり、その直前に保存されたファイル(つまり、元のファイル)に「戻る」ことができます。

Ctrl-O Ctrl-I現在のバッファを飛び越えずにファイルをすぐに切り替えるペアのようなもの。のようなものuUnetrwの場合:

   u    Change to recently-visited directory                 |netrw-u|
   U    Change to subsequently-visited directory             |netrw-U|

「最後に編集したばかりのファイル」とは、文字通り「最近編集したファイル」という意味ですか?または、Vimで最後に表示されたものを意味するのですか?
リッチ

2
後者の場合、私はそこに着くまで個人的にマッシュCtrl-O(または時々Ctrl-T)します。
リッチ

はい、それは私があまりにも仕事だCtrl-OCtrl-I。しかし、編集ポイント間をジャンプし、フローを中断します。アクセスする順番にバッファ間を行き来したい。プラグインはどのように最新のファイルのリストを表示しますか?内部で追跡しますか?
firedev

Ctrl-^最後の2つのファイルを入れ替えます。しかし、より多くの間を移動する最良の方法は何ですか?
firedev

アクセスによって、それらが開かれた、書かれた、フォーカスされたウィンドウで、または変更された順序を意味するかどうかはまだ明確ではありません。 Ctrl-O/IMRUは通常グローバルですが、ウィンドウ固有のfwiwです。最後にアクセスした順に並べ替えたい場合は、一度戻るとすぐにリストの順序が変わり、さらに複雑になります。
マットBoehm

回答:


7

バッファーが変更されるまで、CTRL-Oを繰り返し押すための小さな関数を作成しました。

ここで見つけることができます。CTRL-Uにマップしましたが、必要に応じてCTRL-Oをオーバーライドできます。

function! GoBackToRecentBuffer()
  let startName = bufname('%')
  while 1
    exe "normal! \<c-o>"
    let nowName = bufname('%')
    if nowName != startName
      break
    endif
  endwhile
endfunction

nnoremap <silent> <C-U> :call GoBackToRecentBuffer()<Enter>

おそらく似たようなものを書くことができ<C-I>ます。

問題点:

  • 前のバッファーがない場合は、CTRL-Cを押すまで静かにループし続けます!

関連:

  • :jumps CTRL-Oが戻るステップの履歴の場所をリストします。
  • VimのデフォルトのCTRL-Tは、CTRL-Oのマッシングに代わる優れた選択肢です。これは、粒度が粗いためです。タグのジャンプのみを戻ります。

Vimは、CTRL- ^で公開された1レベルのMRUファイル履歴のみを提供するようです。ただし:kwbd、いくつかのバッファを閉じるために使用すると、Vimは予想される逆履歴の順序で前のバッファに戻ります。おそらく、Vimには共有されていないMRUリストがあるか、CTRL-Oロケーション履歴に基づいてフォールバックするバッファーを選択する可能性があります(:jumps)。
joeytwiddle

1
または、autocmd InsertLeave * normal mZグローバルマークZで最後に編集したファイルを記憶します。でそれに戻ることができますg'Z。//持ってnmap <C-y> g'Zいますが、それでもCtrl-Uをより頻繁に使用する傾向があります。
joeytwiddle

6

:lsすべてのバッファを表示するために使用できます。例えば:

:ls
  1      "vim.markdown"                 line 160
  2      "ext.markdown"                 line 0
  3 #    "~/to"                         line 1
  4 %a   "~/TODO"                       line 68

bufferに戻るにはext.markdown、を使用します:e +Nbuf。ここNで、は最初の列のバッファー番号です。例::e +2buf

よりインタラクティブな体験のためのシンプルな関数を作成できます:

fun! ChooseBuf()
    redir => buffers
        silent ls
    redir end

    echo l:buffers
    let l:choice = input('Which one: ')
    execute ':edit +' . l:choice . 'buf'
endfun
command! ChooseBuf call ChooseBuf()
nnoremap <Leader>b :call ChooseBuf()<CR>

を使用した後、:ChooseBufまたは<Leader>b編集するバッファの番号を入力するだけです。

これはされていない、非常にためには、「最近開いた」されているので(また、なぜこれはおそらく、「最近使用」:bnext/ :bprevあなたが期待するような作業をしないでください)。


4

<C-6>必要なもので、現在のバッファの前に開いていた前のバッファに戻ります。また、同じものに使用できる:bprev&も:bnextあります。


<C-6>悪くはありませんが、2つのバッファにジャンプして戻すことはできません。bprevそしてbnextジャンプの順ではありません。
プラキセオティック

いや、歴史を深く掘り下げる良いネイティブな方法はないと思います。あなたは、いくつかのMRUプラグインを使用する必要があるだろう、でもCTRLPは1を持って、他の人が存在しなければならない
Dhruvaサーガル

2
注:それはありません<C-6>、それはです<C-^>。多くの端末エミュレーターには区別がありませんが、一部(OS Xに同梱されているものを含む)には違いがあります。後者の場合、Shiftキーの使用が必要です(Qwertyレイアウトを想定)。
tommcdo

@tommcdo興味深い、私はosxを使用していますが、terminal.appの代わりにitermを使用します。Shiftキーが必要なのは残念です。
Dhruvaサーガル

考えてみると、私のOSがそのキーバインドを取得していて、それをVimに伝播していないだけの可能性があります。OSを停止する必要があります!
tommcdo

2

また:oldfiles、編集したファイルのリストを取得するのにも使用できます。

リストには、ファイル名に関連付けられた番号があります。ファイルを選択し、番号(14など)を書き留めて開きます:edit #<14

そのファイルで他のコマンドを実行したり、複数のファイルをコマンドに一度に渡すこともできます。詳細はこちら


1
リンクの他の答えは私に教えてくれました:bro[wse] ol[dfiles][!]
スティーブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.