Làm thế nào để liên kết một bộ đệm vào một tab?


14

Khi tôi cần làm việc trên các dự án khác nhau cùng một lúc, tôi có quy trình làm việc theo sau:

  • Tôi tạo một tab cho mỗi dự án.
  • Trong mỗi tab tôi mở các tệp mà tôi muốn chỉnh sửa, tạo ra một số bộ đệm.
  • Tùy chọn nếu tôi cần xem hai (hoặc nhiều) tệp cùng lúc tôi tạo các cửa sổ tách để tôi có một tab chứa các cửa sổ khác nhau hiển thị một bộ đệm.

Để điều hướng giữa các bộ đệm của tôi, tôi không thực sự sử dụng :ls:b [name or number of buffer]thay vào đó tôi đã tạo một số ánh xạ thuận tiện cho phép tôi chuyển đổi giữa các bộ đệm với :bnext:bprevious

Cách này để làm việc là khá tốt nhưng một điều làm phiền tôi: bộ đệm được chia sẻ giữa các tab.

Nếu tôi mở file1file2vào tab1file3vào tab2, nếu tab1tôi sử dụng nhiều lần :bnexttôi sẽ thấy file3trong tab này mà tôi không muốn. Quy trình công việc tôi muốn nhận là folowing :

  • Bắt đầu vim (Tôi có một tab đầu tiên có bộ đệm trong đó): $ vim foo
  • Thêm một bộ đệm vào tab này: :e bar
  • Mở một tab mới và chuyển sang nó: :tabnew
  • Mở một bộ đệm mới trong tab này: :e baz
  • Nếu tôi ở trong bộ đệm này và làm :bnexthoặc :bprevioustôi sẽ ở trên bazbộ đệm (vì nó là cái duy nhất trong tab này)
  • Nếu tôi đi vào tab trước :tabpreviousvà thực thi nhiều lần :bnexttôi sẽ chỉ chuyển đổi giữa foobarbộ đệm nhưng sẽ không thấybaz

Vì vậy, đây là câu hỏi của tôi: Có thể liên kết một bộ đệm vào một tab và làm cho vim không cho phép truy cập vào một số bộ đệm từ một tab khác so với bộ đệm mà chúng có nghĩa là gì?

Lưu ý: Tôi biết rằng sử dụng :b [myBuffer]sẽ là một cách để giữ bộ đệm trong tab nhưng khi tôi có 3 hoặc 4 tệp để chỉnh sửa, tôi cảm thấy như mình thực sự sử dụng ánh xạ của mình nhanh hơn so với việc nhập tên bộ đệm (ngay cả khi tôi có thể chỉ nhập một số ký tự để khớp với tên bộ đệm) .


1
Đây là một cuộc thảo luận cũ nêu bật các cách tiếp cận và ủng hộ của cách tiếp cận như vậy và đề xuất thay vào đó một cái gì đó ngày nay có thể được dịch là: nhiều phiên bản vim (một cho mỗi dự án / danh sách bộ đệm) + tmux: vim.1045645.n5.nabble.com/
VanLaser

@VanLaser: Cảm ơn vì liên kết đó là một cuộc thảo luận thú vị! Tôi thực sự bao gồm tmux và các phiên bản vim khác nhau khi tôi sử dụng máy cá nhân. Câu hỏi của tôi xuất phát từ việc tôi phải sử dụng windows cho công việc chuyên môn của mình và tôi thực sự không thích cách xử lý các cửa sổ: sử dụng alt+tab(hoặc thậm chí tệ hơn là chuột) cảm thấy dễ dàng hơn nhiều so với chuyển đổi tab trong vim.
statox

1
Có lẽ vim-ctrlspace có thể giúp đỡ - nó quảng cáo trên mỗi danh sách bộ đệm của tab; Tôi không sử dụng nó, mặc dù.
VanLaser

Câu trả lời:


7

Mhh, tôi không tìm thấy bất kỳ plugin nào ngoài đó, nhưng bạn có thể tự viết nó. Bạn cần phải học vimscript cho việc này. Tôi vừa thực hiện chức năng mà bạn có thể chuyển đổi giữa các bộ đệm trong một tab (chưa xóa). Bạn có thể sao chép nó vào vimrc của bạn:

if !exists("g:WindowBufManager") 
  let g:WindowBufManager= {}
endif

function! StoreBufTab()
  if !has_key(g:WindowBufManager, tabpagenr())
    let  g:WindowBufManager[tabpagenr()] = []
  endif

  " add the new buffer to our explorer
  if index(g:WindowBufManager[tabpagenr()], bufname("%")) == -1 && bufname("%") != ""
    call add (g:WindowBufManager[tabpagenr()],bufname("%"))
  endif
endfunction

function! WindowBufManagerNext() 
  " find the next index of the buffer
  let s = index(g:WindowBufManager[tabpagenr()], bufname("%"))
  if (s!= -1)
    let s = (s +1) % len(g:WindowBufManager[tabpagenr()])
    execute 'b ' . g:WindowBufManager[tabpagenr()][s]
  endif
endfunction

augroup WindowBufManagerGroup
  autocmd! BufEnter * call StoreBufTab()
augroup END

Đóng vimrc của bạn và mở lại. Để tìm bộ đệm tiếp theo, chỉ cần sử dụng

:call WindowBufManagerNext()

hoặc xác định lệnh hoặc ánh xạ của riêng bạn. Điều này sẽ hoạt động miễn là bạn không đóng hoặc xóa một tab hoặc bộ đệm. Nó cũng sẽ không hoạt động cho nhiều bộ đệm. Nó sẽ đòi hỏi một số công việc nữa để thêm các tính năng đó, nhưng chắc chắn là có thể thực hiện được.


Tôi cũng không tìm thấy plugin và tôi hy vọng có một tính năng tích hợp để làm như vậy nhưng có vẻ như bạn đúng có lẽ tôi sẽ phải tự làm điều đó. Cảm ơn mã của bạn, tôi có thể sử dụng nó có cơ sở để phát triển một plugin đầy đủ.
statox

6

Bộ đệm là toàn cầu và bạn không thể làm gì về điều đó ngoại trừ việc viết lớp trừu tượng của riêng bạn trên đầu trang tab, cửa sổ và bộ đệm. Câu trả lời của philolo1 cho thấy cách tiếp cận hợp lý cho vấn đề nhưng bạn sẽ nhanh chóng tìm thấy giới hạn của "giải pháp" đó và cần sao chép nhiều tính năng tích hợp như :bufdohoặc tệp thay thế

Mặt khác, "Đối số" có thể là cục bộ của một cửa sổ để chúng có thể hữu ích hơn trong quy trình làm việc của bạn so với "bộ đệm" (theo nghĩa chặt chẽ nhất của từ này):

$ vim file1 file2
:tabnew
:argl file3 file4 file5
:n
:n
gt
:n
gt
:N
and so on…

Các đối số không linh hoạt như bộ đệm nhưng chúng có thể cung cấp một cơ sở đáng tin cậy hơn cho quy trình làm việc của bạn.

Nhưng làm việc trên mỗi dự án trong trường hợp Vim của riêng nó theo tôi là giải pháp thực tế duy nhất.


Tôi đồng ý với ý kiến ​​rằng sử dụng các phiên bản vim riêng sẽ tốt hơn khi tôi có thể sử dụng nó trong một thiết bị đầu cuối, như tôi đã nói trong một nhận xét khác, tôi phải sử dụng các cửa sổ trên máy tính chuyên nghiệp của mình và chuyển đổi giữa các phiên bản gvim là một vấn đề khó khăn với hệ điều hành này . Tôi sẽ xem xét các đối số mà tôi chưa từng sử dụng trước đây và đó có thể là một cách giải quyết tốt, cảm ơn!
statox

2

Vì vậy, với một số chậm trễ, tôi nghĩ rằng tôi có thể đã tìm thấy một câu trả lời thỏa đáng (ít nhất là cho tôi!). Bạn sẽ cần hai plugin của Shougo:

và bản đồ truy cập nhanh để sử dụng thay vì :ls, để xem (và chọn) chỉ bộ đệm từ tab hiện tại .

Ví dụ: một cái gì đó như:

nnoremap <leader>b :<C-u>Unite buffer_tab -no-split<CR>

đoàn kết - mỗi bộ đệm tab

Bây giờ bạn có thể di chuyển qua danh sách bộ đệm tab hiện tại ( j, k), chọn một ( CR), hủy ( q), nhập chế độ "đầu vào" (chèn) để nhanh chóng lọc lựa chọn bộ đệm bằng cách nhập một số chữ cái hoặc thậm chí nhấn Tabđể mở danh sách hành động đối với mục được chọn hiện tại (ví dụ: để mở bộ đệm phía trên mục đang hoạt động hiện tại) - nói tóm lại, bạn hành động theo cách "Unite" chung.

(xem thêm :h unite_default_key_mappingsvà Đoàn kết giúp đỡ nói chung).


Và bây giờ cho thủ thuật cuối cùng (chưa bắt buộc). Với activcmd , bạn có thể tạo lslệnh , được kích hoạt theo tab, rất thông minh (dựa trên chức năng Unite ở trên):

:command! LS Unite buffer_tab -no-split
:AlterCommand ls LS

... Và mỗi khi bạn nhấn :ls, Vim sẽ thực sự chạy lệnh của bạn .

Lưu ý rằng bạn cũng sẽ không cần :bnhoặc :bp, vì các bộ đệm xem và lựa chọn bộ đệm hiện là cùng một lệnh.


Tôi cũng sẽ thử giải pháp này. Hiện tại tôi đang thử dùng không gian ctrl được VanLaser nhắc đến trong bình luận, điều này khá tốt. Tôi sẽ xem giải pháp nào là thuận tiện nhất. Ngoài ra +1 cho plugin activcmd cũng khá tuyệt!
statox

2

Tôi không thể nhận xét vì tài khoản của tôi mới nên rất tiếc về điều đó, nhưng ++++ 1 cho ctrl-space.

Tôi đã bị bán vào lúc tôi thực hiện được nửa chừng nhờ sự giúp đỡ. Ctrlspace có cấu trúc như thế này:

workspaces --> contain tabs --> contain buffers

Vì vậy, bạn có thể lưu một không gian làm việc cho từng dự án mà bạn đang làm việc và sau đó tải ngay lập tức bất cứ khi nào bạn muốn. Điều này có nghĩa là bất cứ khi nào bạn đóng vim, bạn có thể lưu tất cả các phần tách của bộ đệm và tab.

Bạn cũng có thể đặt tên cho các tab của bạn. Nếu điều đó là không đủ, bạn cũng có thể dễ dàng thay đổi các thư mục làm việc và tạo dấu trang cho các thư mục mà bạn sử dụng thường xuyên.

Nó giao diện độc đáo với nerdtree nếu bạn sử dụng nó (mặc dù thành thật mà nói bạn có thể thậm chí không cảm thấy như bạn cần nó sau một tuần với ctrlspace)


Xem xét trường hợp sử dụng này:

Bạn có một dự án. Nó liên quan đến việc trồng cây. Có cây ăn quả và cây tiền. Cây tiền chứa đô la và xu trong khi cây ăn quả chứa táo và cam.

Trong ví dụ này táo, cam, đô la và xu đều là "bộ đệm".

Ctrlspace cho phép bạn tách táo và cam thành một "tab" mà bạn có thể gắn nhãn "trái cây" - nhãn này sẽ xuất hiện trong dòng thẻ ở đầu cửa sổ của bạn. Tương tự như vậy, đô la và xu đi vào một tab "tiền".

Không gian làm việc "cây" lưu toàn bộ cấu hình này và cho phép bạn truy cập nó ngay lập tức bất cứ khi nào bạn mở vim.


Bây giờ tôi nhận thức được sự tồn tại của nó, tôi thực sự không thể tưởng tượng được việc phát triển hướng đối tượng trong vim mà không có plugin này. Chỉ trong trường hợp, đây là liên kết: https://github.com/szw/vim-ctrlspace


2

Vì vậy, cuối cùng đã quyết định tạo plugin của riêng tôi để giải quyết vấn đề của tôi, nó có sẵn trên github .

Tôi đã sử dụng ý tưởng của @ philolo1 và cố gắng hoàn thành nó, tại thời điểm tôi viết câu trả lời này, đây vẫn là một công việc đang tiến triển.

EDIT Tôi không còn duy trì plugin khi quy trình làm việc của mình được phát triển và tôi nhận ra bộ đệm ràng buộc với một tab làm tăng thêm vấn đề so với giải quyết.


Plugin liên kết bộ đệm với các tab: Khi người dùng mở bộ đệm, nó sẽ tự động được "lưu trữ" trong tab và không thể truy cập từ tab khác.

Việc cài đặt phải là "trình quản lý plugin thân thiện" (ít nhất là nó hoạt động tốt với Vim-PlugVundle )

Một số tính năng chính là:

  • Tự động xử lý ràng buộc của bộ đệm (người dùng có thể mở chúng như trước đây)
  • :NextBuf:PrevBufthay thế :bn:bNđể giữ một trạng thái nhất quán của các tab
  • :ListBufcho phép liệt kê các bộ đệm tương tự :lsngoại trừ việc chúng được phân tách trong các tab và một dấu hiệu cho phép người dùng dễ dàng nhìn thấy tab nào hiện tại.
  • :ChangeBuf chấp nhận số bộ đệm hoặc tên bộ đệm để tự động thay đổi bộ đệm và thay đổi tab
  • Đóng một bộ đệm được thực hiện với :CloseBuf
  • Đóng một tab được thực hiện với :CloseTab

Đối với các hoạt động khác người dùng sẽ có thể sử dụng được xây dựng trong các tính năng (như :tabopen, :tabnext, vv ...)

Đối với mỗi lệnh, một số ánh xạ mặc định được cung cấp và chúng có thể dễ dàng bị vô hiệu hóa bằng cách thêm let g:betterTabsVim_map_keys = 0vào .vimrc.

Tôi cũng đã cố gắng tạo một tệp trợ giúp rõ ràng ( :h betterTabs.txt): nó chưa hoàn thành nhưng người dùng nên tìm mức tối thiểu để sử dụng plugin.

Tôi vẫn còn nhiều thử nghiệm phải làm để chắc chắn rằng plugin không gây rối cho bất kỳ hành vi bản địa nào.

Cuối cùng, nếu bất cứ ai muốn giúp đỡ, luôn có thể tạo ra các vấn đề trên trang github hoặc để tạo các yêu cầu kéo.


1

Kiểm tra plugin này. Dường như với tôi nó phù hợp với nhu cầu của bạn một cách hoàn hảo. https://github.com/szw/vim-ctrlspace


Quả thực VanLaser đã đề cập đến nó trong các bình luận và lúc đầu tôi không nhìn nó đủ gần nhưng có vẻ như nó thực sự tốt, tôi đã thử nó vài ngày rồi.
statox
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.