Apakah ada cara untuk diandalkan bolak-balik dalam riwayat file

15

Saya ingin pergi ke file yang baru saja saya edit jenis terakhir dan berikutnya seperti MRU lakukan.

:bnextdan :bprevbekerja kadang-kadang, tetapi paling sering saya hanya berakhir di beberapa file yang tidak jelas saya tidak ingat mengedit dan dipaksa untuk kembali ke plugin MRU.

Apakah ada cara untuk memperbaikinya?

Ctrl-^swap antara dua file terakhir. Apa cara terbaik untuk bernavigasi di antara lebih banyak?

Saya mengerti ini mungkin rumit tetapi saya setuju dengan apa pun yang dapat meningkatkan :bn :bpperilaku saat ini . Buffer yang sering saya lihat benar-benar tidak pada tempatnya. Mungkin ada plugin yang bisa melacak file terbaru dan menyediakan kait sehingga saya bisa membuat pemetaan?

Membalas komentar membersihkan pikiran saya sedikit. Saya percaya apa yang saya inginkan adalah dapat menelusuri file dalam urutan penyimpanan terbaru. Dengan begitu jika saya kembali ke sejarah, pesanan tidak akan berubah sampai saya menyimpan file yang kemudian menjadi yang terakhir dan membuat satu langkah "kembali" ke file yang disimpan tepat sebelum itu, yaitu yang saya mulai dari.

Sesuatu seperti Ctrl-O Ctrl-Ipasangan yang segera berpindah file tanpa melompati buffer saat ini. Semacam suka udan Udi netrw:

   u    Change to recently-visited directory                 |netrw-u|
   U    Change to subsequently-visited directory             |netrw-U|
dipecat
sumber
Dengan "file yang baru saja saya edit terakhir" apakah Anda benar-benar berarti "file yang baru saja saya edit"? Atau maksud Anda yang terakhir yang Anda lihat di Vim?
Kaya
2
Jika yang terakhir, saya pribadi hanya menumbuk Ctrl-O(atau kadang-kadang Ctrl-T) sampai saya tiba di sana.
Kaya
Ya itulah yang saya lakukan juga Ctrl-Odan Ctrl-I. Tapi itu melompat di antara titik edit dan itu mematahkan aliran. Semua yang saya ingin bolak-balik di antara buffer dalam rangka akses. Bagaimana plugin menampilkan daftar file terbaru? Apakah mereka melacak mereka secara internal?
firedev
Ctrl-^swap antara dua file terakhir. Tapi apa cara terbaik untuk bernavigasi di antara lebih banyak?
firedev
Dengan akses, masih belum jelas apakah maksud Anda urutan mereka dibuka, ditulis, di jendela fokus, atau diubah. Ctrl-O/Iadalah window-specific fwiw, sedangkan MRU biasanya bersifat global. Jika Anda ingin memesan dengan yang paling baru diakses, segera setelah Anda melompat kembali, urutan daftar berubah, hal-hal yang semakin rumit.
Matt Boehm

Jawaban:

7

Saya menulis sedikit fungsi untuk berulang kali menekan CTRL-O untuk saya, sampai buffer berubah.

Anda dapat menemukannya di sini . Saya memetakannya ke CTRL-U tetapi Anda bisa menimpa CTRL-O jika Anda mau.

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>

Anda mungkin dapat menulis sesuatu yang serupa untuk <C-I>.

Masalah:

  • Jika tidak ada buffer sebelumnya, itu akan melanjutkan perulangan diam-diam sampai Anda menekan CTRL-C!

Terkait:

  • :jumps daftar lokasi bersejarah yang akan dilalui CTRL-O.
  • CTRL-T default Vim adalah alternatif yang baik untuk menumbuk CTRL-O, karena berbutir kasar: bergerak kembali hanya melalui lompatan tag.
joeytwiddle
sumber
Vim tampaknya hanya menawarkan satu tingkat riwayat file MRU, diekspos pada CTRL- ^. Namun saya perhatikan ketika menggunakan :kwbduntuk menutup beberapa buffer, bahwa Vim memang mundur ke buffer sebelumnya dalam urutan reverse-history yang diharapkan. Mungkin Vim memiliki daftar MRU yang tidak dibagikan dengan kami, atau mungkin memilih penyangga mana yang akan kembali berdasarkan pada sejarah lokasi CTRL-O ( :jumps).
joeytwiddle
1
Atau, autocmd InsertLeave * normal mZakan ingat kapan terakhir file yang diedit di tanda global Z . Anda dapat kembali ke sana dengan g'Z. // Aku punya nmap <C-y> g'Ztapi aku masih cenderung lebih sering menggunakan Ctrl-U.
joeytwiddle
6

Anda dapat menggunakannya :lsuntuk menampilkan semua buffer. Sebagai contoh:

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

Untuk kembali ke buffer ext.markdown, gunakan :e +Nbuf, di mana Nnomor buffer dari kolom pertama. Sebagai contoh: :e +2buf.

Anda dapat membuat fungsi sederhana untuk pengalaman yang lebih interaktif:

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>

Setelah menggunakan :ChooseBufatau <Leader>bAnda cukup mengetikkan jumlah buffer yang ingin Anda edit.

Ini tidak cukup "paling baru digunakan", karena urutannya "paling baru dibuka" (ini mungkin juga mengapa :bnext/ :bprevtidak berfungsi seperti yang Anda harapkan).

Martin Tournoij
sumber
4

<C-6>adalah apa yang Anda butuhkan, yang akan membawa Anda kembali ke buffer sebelumnya yang Anda buka sebelum yang sekarang. Ada juga :bprev& :bnextyang bisa Anda gunakan untuk hal yang sama.

Dhruva Sagar
sumber
<C-6>tidak buruk tapi saya tidak bisa menggunakannya untuk melompat kembali dua buffer. bprevdan bnexttidak dalam urutan melompat.
Praxeolitic
Ya saya tidak berpikir ada cara asli yang baik untuk masuk lebih jauh ke dalam sejarah. Anda harus menggunakan beberapa plugin MRU, bahkan CtrlP memilikinya, harus ada yang lain
Dhruva Sagar
2
Catatan: bukan <C-6>, bukan <C-^>. Sementara pada banyak emulator terminal tidak ada perbedaan, pada beberapa (termasuk yang dikirimkan dengan OS X), ada. Untuk kasus yang terakhir, penggunaan Shiftkunci diperlukan (dengan asumsi tata letak Qwerty).
tommcdo
@ comcdo menarik, saya di osx, tetapi gunakan iterm bukan terminal.app, ia bekerja sama untuk saya. Membutuhkan tombol Shift di atasnya akan mengecewakan.
Dhruva Sagar
Kalau dipikir-pikir, mungkin saja OS saya mengambil kunci yang mengikat dan tidak menyebarkannya ke Vim. OS saya harus dihentikan!
tommcdo
2

Anda juga dapat menggunakan :oldfilesuntuk mendapatkan daftar file yang Anda edit.

Daftar ini akan memiliki nomor yang dikaitkan dengan nama file. Pilih file, catat nomornya (katakan 14) dan buka dengan:edit #<14

Anda juga dapat menjalankan perintah lain pada file itu atau meneruskan banyak file ke perintah sekaligus. Lebih lanjut tentang ini DI SINI

Karolis Koncevičius
sumber
1
The jawaban lain di link mengajarkan saya:bro[wse] ol[dfiles][!]
Steve