Có cách nào đáng tin cậy để quay trở lại trong lịch sử tập tin


15

Tôi muốn đi đến tập tin tôi vừa chỉnh sửa lần cuối và loại tiếp theo giống như các plugin MRU.

:bnext:bprevđôi khi hoạt động, nhưng thường xuyên nhất là tôi không kết thúc trong một số tệp tối nghĩa mà tôi không nhớ chỉnh sửa và buộc phải quay lại plugin MRU.

Có cách nào để khắc phục nó?

Ctrl-^hoán đổi giữa hai tập tin cuối cùng. Cách tốt nhất để điều hướng giữa nhiều hơn là gì?

Tôi hiểu nó có thể là khó khăn nhưng tôi đồng ý với bất cứ điều gì có thể cải thiện :bn :bphành vi hiện tại . Các bộ đệm tôi thường thấy là hoàn toàn không đúng chỗ. Có lẽ có một plugin có thể theo dõi các tệp gần đây và cung cấp các hook để tôi có thể tạo ánh xạ?

Trả lời các bình luận làm sáng tỏ suy nghĩ của tôi một chút. Tôi tin rằng những gì tôi muốn là có thể di chuyển qua các tập tin theo thứ tự mới nhất. Theo cách đó, nếu tôi quay lại lịch sử, thứ tự sẽ không thay đổi cho đến khi tôi lưu tệp sau đó trở thành cuối cùng và thực hiện một bước "quay lại" tệp được lưu ngay trước đó, tức là tôi đã bắt đầu.

Một cái gì đó giống như Ctrl-O Ctrl-Icặp chuyển đổi tập tin ngay lập tức mà không phải nhảy xung quanh bộ đệm hiện tại. Sắp xếp thích uUtrong netrw:

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

Bởi "tập tin tôi vừa chỉnh sửa" có nghĩa đen là "tập tin tôi chỉnh sửa gần đây nhất"? Hay bạn chỉ có nghĩa là cái cuối cùng mà bạn đã nhìn thấy trong Vim?
Giàu có

2
Nếu sau này, cá nhân tôi chỉ cần nghiền Ctrl-O(hoặc đôi khi Ctrl-T) cho đến khi tôi đến đó.
Giàu có

Vâng, đó là những gì tôi làm quá Ctrl-OCtrl-I. Nhưng nó nhảy giữa các điểm chỉnh sửa và phá vỡ dòng chảy. Tất cả tôi muốn qua lại giữa các bộ đệm theo thứ tự truy cập. Làm thế nào các plugin hiển thị một danh sách các tập tin gần đây nhất? Họ có theo dõi chúng trong nội bộ không?
sa thải

Ctrl-^hoán đổi giữa hai tập tin cuối cùng. Nhưng cách tốt nhất để điều hướng giữa nhiều hơn là gì?
sa thải

Bằng cách truy cập, vẫn chưa rõ liệu bạn có nghĩa là thứ tự chúng được mở, được viết, trong một cửa sổ tập trung hoặc thay đổi. Ctrl-O/Ilà fwiw dành riêng cho cửa sổ, trong khi MRU thường là toàn cầu. Nếu bạn muốn đặt hàng bằng cách truy cập gần đây nhất, ngay khi bạn quay lại một lần, thứ tự của danh sách sẽ thay đổi, làm phức tạp thêm mọi thứ.
Matt Boehm

Câu trả lời:


7

Tôi đã viết một hàm nhỏ để liên tục nhấn CTRL-O cho đến khi bộ đệm thay đổi.

Bạn có thể tìm thấy nó ở đây . Tôi đã ánh xạ nó tới CTRL-U nhưng bạn có thể ghi đè CTRL-O nếu bạn muốn.

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>

Bạn có thể có thể viết một cái gì đó tương tự cho <C-I>.

Các vấn đề:

  • Nếu không có bộ đệm trước đó, nó sẽ tiếp tục lặp lại âm thầm cho đến khi bạn nhấn CTRL-C!

Liên quan:

  • :jumps liệt kê các vị trí lịch sử mà CTRL-O sẽ lùi lại.
  • CTRL-T mặc định của Vim là một thay thế tốt để trộn CTRL-O, bởi vì nó là hạt thô hơn: nó chỉ di chuyển trở lại thông qua các lần nhảy thẻ.

Vim dường như chỉ cung cấp một cấp độ lịch sử tệp MRU, được hiển thị trên CTRL- ^. Tuy nhiên tôi đã nhận thấy khi sử dụng :kwbdđể đóng một vài bộ đệm, Vim sẽ lùi lại các bộ đệm trước đó theo thứ tự lịch sử đảo ngược dự kiến. Có lẽ Vim có một danh sách MRU mà nó không chia sẻ với chúng tôi hoặc có lẽ nó chọn bộ đệm nào để quay lại dựa trên lịch sử vị trí CTRL-O ( :jumps).
joeytwiddle

1
Ngoài ra, autocmd InsertLeave * normal mZsẽ nhớ tệp được chỉnh sửa cuối cùng trong dấu Z toàn cầu . Bạn có thể quay lại với nó g'Z. // Tôi có nmap <C-y> g'Znhưng tôi vẫn có xu hướng sử dụng Ctrl-U thường xuyên hơn.
joeytwiddle

6

Bạn có thể sử dụng :lsđể hiển thị tất cả các bộ đệm. Ví dụ:

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

Để quay trở lại bộ đệm ext.markdown, sử dụng :e +Nbuf, Nsố bộ đệm từ cột đầu tiên. Ví dụ : :e +2buf.

Bạn có thể tạo một chức năng đơn giản để có trải nghiệm tương tác nhiều hơn:

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>

Sau khi sử dụng :ChooseBufhoặc <Leader>bbạn chỉ có thể nhập số lượng bộ đệm bạn muốn chỉnh sửa.

Đây không hoàn toàn là "được sử dụng gần đây nhất", vì đơn hàng là "được mở gần đây nhất" (đây có lẽ cũng là lý do tại sao :bnext/ :bprevkhông hoạt động như bạn mong đợi).


4

<C-6>là những gì bạn cần, nó đưa bạn trở lại bộ đệm trước đó bạn đã mở trước bộ đệm hiện tại. Ngoài ra còn có :bprev& :bnextmà bạn có thể sử dụng cho cùng.


<C-6>không tệ nhưng tôi không thể sử dụng nó để nhảy trở lại hai bộ đệm. bprevbnextkhông theo thứ tự nhảy.
Praxeolitic 6/2/2015

Phải, tôi không nghĩ rằng có bất kỳ cách bản địa tốt để đi sâu vào lịch sử. Bạn sẽ phải sử dụng một số plugin MRU, thậm chí CtrlP có một plugin, phải có những plugin khác
Dhruva Sagar

2
Lưu ý: không phải <C-6>vậy <C-^>. Mặc dù trên nhiều trình giả lập thiết bị đầu cuối không có sự phân biệt, nhưng trên một số (bao gồm cả trình phát hành với OS X), thì có. Đối với trường hợp sau, việc sử dụng Shiftkhóa là bắt buộc (giả sử bố cục Qwerty).
tommcdo

@tommcdo thú vị, tôi đang dùng osx, nhưng sử dụng iterm thay vì terminal.app, nó hoạt động tương tự với tôi. Yêu cầu phím Shift trên đó sẽ là một số ít.
Dhruva Sagar

Nghĩ về nó, có thể hệ điều hành của tôi đang nắm lấy ràng buộc chính đó và không truyền nó cho Vim. Hệ điều hành của tôi phải được dừng lại!
tommcdo

2

Bạn cũng có thể sử dụng :oldfilesđể có được danh sách các tập tin bạn đã chỉnh sửa.

Danh sách sẽ có số liên quan đến tên tệp. Chọn một tập tin, lưu ý số (nói 14) và mở nó với:edit #<14

Bạn cũng có thể chạy các lệnh khác trên tệp đó hoặc chuyển nhiều tệp cho một lệnh cùng một lúc. Thêm về điều này TẠI ĐÂY


1
Các câu trả lời khác trong liên kết dạy tôi:bro[wse] ol[dfiles][!]
Steve
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.