Sử dụng các tab của Vim như bộ đệm


366

Tôi đã xem khả năng sử dụng các tab trong Vim (với :tabe, :tabnewv.v.) để thay thế cho thực tiễn hiện tại của tôi là có nhiều tệp được mở trong cùng một cửa sổ trong các bộ đệm ẩn.

Tôi muốn mọi tệp riêng biệt mà tôi đã mở để luôn ở trong tab riêng. Tuy nhiên, có một số điều cản trở điều này. Làm cách nào để khắc phục những điều này:

  1. Khi các lệnh thích gf^]nhảy đến một vị trí trong tệp khác, tệp sẽ mở trong bộ đệm mới trong tab hiện tại. Có cách nào để tất cả các loại lệnh này mở tệp trong một tab mới hoặc chuyển sang tab hiện có với tệp nếu nó đã được mở không?

  2. Khi chuyển đổi bộ đệm tôi có thể sử dụng :b <part of filename><tab> và nó sẽ hoàn thành tên của các tệp trong bộ đệm hiện có. <part of filename>thậm chí có thể là giữa tên tệp thay vì bắt đầu. Có một tương đương để chuyển đổi các tab?

Câu trả lời:


642

Dừng dừng dừng.

Đây không phải là cách các tab của Vim được thiết kế để sử dụng. Trên thực tế, chúng được đặt tên sai. Một cái tên tốt hơn sẽ là "khung nhìn" hoặc "bố cục", bởi vì đó là một tab là một bố cục khác nhau của các cửa sổ của tất cả các bộ đệm hiện có của bạn.

Cố gắng đánh bại Vim thành 1 tab == 1 bộ đệm là một bài tập vô ích. Vim không biết hoặc chăm sóc và nó sẽ không tôn trọng nó trên tất cả các lệnh trong đó, bất cứ điều gì có sử dụng bộ đệm QuickFix ( :make, :grep, và :helpgreplà những người mà mùa xuân đến tâm trí) hạnh phúc sẽ bỏ qua các tab và không có gì bạn có thể làm gì để dừng là cái đó.

Thay thế:

  • :set hidden
    Nếu bạn chưa có bộ này, thì hãy làm như vậy. Nó làm cho vim hoạt động như mọi trình soạn thảo nhiều tệp khác trên hành tinh. Bạn có thể đã chỉnh sửa bộ đệm không hiển thị trong cửa sổ ở đâu đó.
  • Sử dụng :bn, :bp, :b #, :b name, và ctrl-6để chuyển đổi giữa các bộ đệm. Tôi thích ctrl-6bản thân mình (một mình nó chuyển sang bộ đệm được sử dụng trước đó, hoặc #ctrl-6chuyển sang số bộ đệm #).
  • Sử dụng :lsđể liệt kê bộ đệm hoặc plugin như MiniBufExpl hoặc BufExplorer .

192
Đối với tôi, đây là một lỗi, không phải "lỗi người dùng". Tìm kiếm trên web cho các tab 'vim' chỉ ra rằng mọi người khác không đồng ý với bạn hoặc không biết cách sử dụng các tab Vim "thực". Ngoài ra, nếu các tab thực sự là chế độ xem "bố cục", thì tại sao tiêu đề tab mặc định, tên tệp hiện tại? Nếu tôi muốn nhiều chế độ xem của cùng một tệp, thì tất cả các tiêu đề tab của tôi sẽ có cùng tên (không hữu ích lắm?). Vì vậy, dù bạn nhìn nó như thế nào, việc thực hiện tab mặc định trong Vim là thiếu sót.
cmcginty

45
Những gì bạn sẽ hiển thị trong tiêu đề tab? Nó hiển thị tên bộ đệm hiện tại (không phải "tên tệp"). Bạn vẫn có thể thay đổi những gì hiển thị trong tiêu đề tab.
aehlke

46
@Casey: FWIW, khi tôi lần đầu tiên biết về các tab của Vim và phải quấn đầu tôi về chúng và những gì chúng được dùng, đã nghĩ chính xác về định nghĩa được đưa ra bởi Zathrus. (Tôi là một btw Vim Novice). Vì vậy, tôi không đồng ý rằng đó là một tính năng bị hỏng hoặc không trực quan ... thậm chí ít đồng ý rằng "về tất cả mọi người" không đồng ý (và nghĩ rằng ít nhất một hoặc hai giới thiệu có thể tăng thêm sức mạnh cho khẳng định). Nó hoạt động rất tốt để có nhiều bố cục màn hình đồng thời.
ata

17
Nhận xét này là sai, tôi không chắc tại sao nó được nâng cấp hoặc chấp nhận. Robince dưới đây có câu trả lời đúng -: tab sball và: switchbuf là những gì bạn đang tìm kiếm.
Roel

38
+1 cho "Dừng, dừng, dừng". Vim là một tâm lý nhiều như nó là một công cụ. Điều quan trọng là dạy cho người dùng mới tâm lý, để họ có thể sử dụng công cụ này với toàn bộ tiềm năng của nó.
Thăm dò ý kiến ​​Cody

273

Đến bữa tiệc muộn một chút nhưng thật ngạc nhiên tôi không thấy những điều sau trong danh sách này:

:tab sball - điều này mở ra một tab mới cho mỗi bộ đệm mở.

:help switchbuf- điều này kiểm soát hành vi chuyển đổi bộ đệm, thử :set switchbuf=usetab,newtab. Điều này có nghĩa là chuyển sang tab hiện có nếu bộ đệm đang mở hoặc tạo một cái mới nếu không.


4
1 cho switchbuf- set switchbuf=useopenlà rất tốt để tránh những hành vi gây phiền nhiễu của :make, :vimgrepvà các lệnh tương tự mà làm thay đổi bộ đệm trong cách bố trí cửa sổ ngay cả khi bộ đệm đã được hiển thị.
mMontu

3
tại sao không phù hợp với tôi Sau khi thiết lập :se switchbuf=usetab,newtab, khi sử dụng bnđể chuyển đổi bộ đệm, nó vẫn mở tệp bộ đệm trong tab hiện tại thay vì chuyển sang tab hiện tại? Có điều gì sai không?
zhiyelee

173

Vim :help windowgiải thích sự nhầm lẫn "tab vs bộ đệm" khá tốt.

Một bộ đệm là văn bản trong bộ nhớ của một tập tin.
Một cửa sổ là một khung nhìn trên một bộ đệm.
Một trang tab là một bộ sưu tập các cửa sổ.

Mở nhiều tập tin đạt được trong vim với bộ đệm . Trong các trình soạn thảo khác (ví dụ notepad ++), việc này được thực hiện bằng các tab, vì vậy tab tên trong vim có thể gây hiểu nhầm.

Windows nhằm mục đích phân chia không gian làm việc và hiển thị nhiều tệp (bộ đệm) với nhau trên một màn hình. Trong các trình soạn thảo khác, điều này có thể đạt được bằng cách mở nhiều cửa sổ GUI và sắp xếp lại chúng trên màn hình nền.

Cuối cùng, trong các trang tab của vim tương tự này sẽ tương ứng với nhiều máy tính để bàn, đó là sự sắp xếp lại khác nhau của các cửa sổ.

Như vim help: tab-pagegiải thích một trang tab có thể được sử dụng, khi một người muốn tạm thời chỉnh sửa một tệp, nhưng không muốn thay đổi bất cứ điều gì trong bố cục hiện tại của các cửa sổ và bộ đệm. Trong trường hợp như vậy, một trang tab khác có thể được sử dụng chỉ cho mục đích chỉnh sửa tệp cụ thể đó.

Tất nhiên bạn phải nhớ rằng việc hiển thị cùng một tệp trong nhiều trang tab hoặc cửa sổ sẽ dẫn đến việc hiển thị cùng một bản sao (bộ đệm).


11
Đây thực sự là một câu trả lời tuyệt vời, nhưng mất một vài lần đọc để có ý nghĩa. bộ đệm = tab, cửa sổ = cửa sổ gui, trang tab = máy tính để bàn có ý nghĩa tốt nhất từ ​​trước đến nay mà tôi đã tìm thấy cho một người không quen thuộc với các khái niệm
icc97

4
Tôi có xu hướng nghĩ về họ khi nhìn qua một cửa sổ vào một căn phòng - buffer= object , window= panetab= window . Tôi có thể di chuyển xung quanh phòng và nhìn vào từ các cửa sổ khác nhau ( tabs). Các cửa sổ khác nhau có thể có số lượng, cách sắp xếp và kích thước của các tấm khác nhau . Cùng một đối tượng có thể được xem đồng thời từ các khung khác nhau trong các cửa sổ khác nhau .
go2null

Nếu bạn đã quen thuộc với Không gian làm việc Linux và mô hình Windows, thì bạn sẽ thấy di sản vimsử dụng. Ban đầu chỉ có một cửa sổ . Các trình quản lý cửa sổ sau đó cho phép bạn chia các cửa sổ thành các ô (ốp WM) hoặc thành các ô chồng chéo (, WM nổi) nhưng chúng vẫn gọi mỗi ô là một cửa sổ. Bây giờ thêm khái niệm về một không gian làm việc trong đó khung có thể được hiển thị trong nhiều không gian làm việc. Vì vậy, trong mô hình này, buffer= app , window= windowtab= workspace .
go2null

56

Trái với một số câu trả lời khác ở đây, tôi nói rằng bạn có thể sử dụng các tab theo cách bạn muốn. vim được thiết kế linh hoạt và có thể tùy chỉnh, thay vì buộc bạn phải làm việc theo các thông số được xác định trước. Chúng ta đều biết làm thế nào các lập trình viên của chúng ta thích áp đặt "đạo đức" của mình lên mọi người khác, vì vậy thành tích này chắc chắn là một tính năng chính.

<C-w>gflà tab tương đương với gflệnh của bộ đệm . <C-PageUp><C-PageDown>sẽ chuyển đổi giữa các tab. (Trong Byobu, hai lệnh này không bao giờ hoạt động với tôi, nhưng chúng hoạt động bên ngoài Byobu / tmux. Các lựa chọn thay thế gtgT.) <C-w>TSẽ chuyển cửa sổ hiện tại sang trang tab mới.

Nếu bạn muốn vim sử dụng một tab hiện có nếu có thể, thay vì tạo một tab trùng lặp, hãy thêm :set switchbuf=usetabvào tệp .vimrc của bạn. Bạn có thể thêm newtabvào danh sách ( :set switchbuf=usetab,newtab) để buộc các lệnh QuickFix hiển thị lỗi biên dịch để mở trong các tab riêng biệt. Tôi thích splitthay vào đó, mở các lỗi biên dịch trong một cửa sổ chia.

Nếu bạn đã bật hỗ trợ chuột :set mouse=a, bạn có thể tương tác với các tab bằng cách nhấp vào chúng. Cũng có một +nút theo mặc định sẽ tạo ra một tab mới.

Đối với tài liệu trên các tab, nhập :help tab-pagevào chế độ bình thường. (Sau khi bạn làm điều đó, bạn có thể thực hành di chuyển một cửa sổ sang một tab bằng cách sử dụng <C-w>T.) Có một danh sách dài các lệnh. Một số lệnh của cửa sổ phải thực hiện với các tab, vì vậy bạn có thể muốn xem tài liệu đó thông qua :help windows.

Bổ sung: 2013-12-19

Để mở nhiều tệp trong vim với mỗi tệp trong một tab riêng biệt, hãy sử dụng vim -p file1 file2 .... Nếu bạn giống tôi và luôn quên thêm -p, bạn có thể thêm nó vào cuối, vì vim tuân theo các quy tắc phân tích cú pháp tùy chọn dòng lệnh thông thường. Ngoài ra, bạn có thể thêm ánh xạ bí danh bash vimvào vim -p.


3
vim -pTuy nhiên, +1 phải lưu ý rằng chỉ có tối đa 10 tab sẽ được hiển thị theo mặc định. Các tệp bổ sung được tải vào bộ đệm, nhưng không được hiển thị trong tab riêng.
IanB

@IanB: làm cách nào để khắc phục cài đặt mặc định giới hạn ở 10 tab?
0xC0000022L

3
@ 0xC0000022L xem tabpagemaxcài đặt
IanB

14

Tôi gặp vấn đề tương tự. Tôi muốn các tab hoạt động như bộ đệm và tôi không bao giờ quản lý được chúng. Giải pháp mà cuối cùng tôi đã giải quyết là làm cho bộ đệm hoạt động giống như các tab!

Kiểm tra plugin có tên Mini Buffer Explorer , sau khi được cài đặt và định cấu hình, bạn sẽ có thể làm việc với các bộ đệm theo cách tương tự như các tab mà không mất bất kỳ chức năng nào.


10

Đây là một câu trả lời cho những người không quen thuộc với Vim và đến từ các trình soạn thảo văn bản khác (trong trường hợp của tôi là Sublime Text).

Tôi đã đọc qua tất cả những câu trả lời này và nó vẫn chưa rõ ràng. Nếu bạn đọc qua chúng đủ, mọi thứ bắt đầu có ý nghĩa, nhưng tôi phải mất hàng giờ để đi lại giữa các câu hỏi.

Điều đầu tiên là, như những người khác đã giải thích:

Các trang Tab , nghe rất giống các tab , chúng hoạt động như các tab và trông rất giống các tab trong hầu hết các trình soạn thảo GUI khác, nhưng chúng không như vậy. Tôi nghĩ rằng đó là một mô hình tinh thần tồi tệ được xây dựng trong Vim, không may làm tăng thêm sức mạnh mà bạn có trong một trang tab.

Mô tả đầu tiên mà tôi hiểu là từ câu trả lời của @ crenate là chúng tương đương với nhiều máy tính để bàn. Khi thấy về vấn đề đó, bạn chỉ có một vài máy tính để bàn mở nhưng có rất nhiều cửa sổ GUI mở trong mỗi cái.

Tôi sẽ nói rằng chúng tương tự như trong các trình soạn thảo / trình duyệt khác:

  1. Nhóm tab
  2. Không gian làm việc văn bản tuyệt vời (tức là danh sách các tệp đang mở mà bạn có trong một dự án)

Khi bạn thấy chúng như thế, bạn nhận ra sức mạnh của chúng mà bạn có thể dễ dàng nhóm các tập hợp (bộ đệm) lại với nhau, ví dụ như các tệp CSS, tệp HTML và tệp JS của bạn trong các trang tab khác nhau. Điều này thực sự khá tuyệt vời.

Những mô tả khác mà tôi thấy khó hiểu

Khung nhìn

Điều này không có nghĩa gì với tôi. Một khung nhìn mà mặc dù nó có một thuật ngữ từ điển được xác định , tôi chỉ nghe nói đến các cửa sổ Vim trong :help windowtài liệu. Viewport không phải là một thuật ngữ tôi từng nghe liên quan đến các biên tập viên như Sublime Text, Visual Studio, Atom, Notepad ++. Trong thực tế, tôi chưa bao giờ nghe về nó cho Vim cho đến khi tôi bắt đầu thử sử dụng các trang tab.

Nếu bạn xem các trang tab như nhiều máy tính để bàn, thì việc tham khảo một máy tính để bàn như một cửa sổ có vẻ kỳ lạ.

Không gian làm việc

Điều này có thể có ý nghĩa hơn, định nghĩa từ điển là:

Một cơ sở lưu trữ bộ nhớ để sử dụng tạm thời.

Vì vậy, nó giống như một nơi bạn lưu trữ một nhóm bộ đệm.

Ban đầu tôi không nghe giống như khái niệm về không gian làm việc của Sublime Text, đó là danh sách tất cả các tệp bạn đã mở trong dự án của mình:

tệp không gian làm việc cao siêu, chứa dữ liệu cụ thể của người dùng, chẳng hạn như các tệp đang mở và các sửa đổi đối với từng tệp.

Tuy nhiên, suy nghĩ về nó nhiều hơn, điều này thực sự đồng ý. Nếu bạn coi trang tab Vim như dự án Sublime Text, thì có vẻ lạ khi chỉ có một tệp được mở trong mỗi dự án và tiếp tục chuyển đổi giữa các dự án. Do đó, tại sao sử dụng trang tab để chỉ mở một tệp là số lẻ.

Bộ sưu tập các cửa sổ

Các trang :help windowđề cập đến các tab theo cách này. Cộng với nhiều câu trả lời khác sử dụng cùng một khái niệm. Tuy nhiên, cho đến khi bạn hiểu được cửa sổ vim là gì, thì điều đó không được sử dụng nhiều, như xây dựng một lâu đài trên cát.

Như tôi đã đề cập ở trên, một cửa sổ vim giống như một khung nhìn và yên tĩnh được giải thích một cách xuất sắc trong bài viết linux.com này :

Một tính năng thực sự hữu ích trong Vim là khả năng phân chia vùng có thể xem được giữa một hoặc nhiều tệp hoặc chỉ cần chia cửa sổ để xem hai bit của cùng một tệp dễ dàng hơn. Tài liệu Vim đề cập đến điều này như một khung nhìn hoặc cửa sổ, có thể thay thế cho nhau.

Bạn có thể đã quen với tính năng này nếu bạn đã từng sử dụng tính năng trợ giúp của Vim bằng cách sử dụng: chủ đề trợ giúp hoặc nhấn phím F1. Khi bạn nhập trợ giúp, Vim chia nhỏ khung nhìn và mở tài liệu trợ giúp ở chế độ xem trên cùng, để tài liệu của bạn mở ở chế độ xem dưới cùng.

Tôi thấy thật kỳ lạ khi một trang tab được gọi là một bộ sưu tập các cửa sổ thay vì một bộ đệm. Nhưng tôi đoán bạn có thể mở hai trang tab riêng biệt với mỗi trang có nhiều cửa sổ trỏ vào cùng một bộ đệm, ít nhất đó là những gì tôi hiểu cho đến nay.


1
Cuối cùng, sau một năm sử dụng Vim toàn thời gian, tôi đã gặp một trường hợp tôi muốn sử dụng nhiều hơn một trang tab. Hiện tại bộ đệm hoạt động hoàn hảo đối với tôi vì tôi sẽ sử dụng các tab trong các trình soạn thảo khác. Nhưng có một màn hình lớn, tôi đã so sánh cả đống 3-4 bộ đệm khác nhau. Sau đó, một đồng nghiệp muốn tôi tìm kiếm một số mã ở nơi khác trong cơ sở mã. Thay vì mất bộ cửa sổ so sánh, tôi chỉ có thể tạo một trang tab mới, sau đó cho phép tôi thực hiện tìm kiếm riêng như khi sử dụng Vim bình thường và sau đó tôi có thể đóng trang tab sau khi hoàn tất và quay lại bộ ban đầu của mình
icc97

4

Nhìn vào: các tab trợ giúp có vẻ như vim không muốn làm việc theo cách bạn làm ...

Bộ đệm được chia sẻ trên các tab, do đó dường như không thể khóa một bộ đệm nhất định chỉ xuất hiện trên một tab nhất định.

Đó là một ý tưởng tốt, mặc dù.

Bạn có thể có thể có được hiệu ứng bạn muốn bằng cách sử dụng một thiết bị đầu cuối hỗ trợ các tab, như multi-gnome-terminal, sau đó chạy các phiên bản vim trong mỗi tab thiết bị đầu cuối. Không hoàn hảo, mặc dù ...


Tôi đã thử điều đó, vấn đề với điều đó, ngoài việc gây khó khăn cho việc điều hướng giữa các tab, đó là văn bản được đánh dấu không thể được chia sẻ trên các tab thiết bị đầu cuối, vì về cơ bản chúng là hai thiết bị đầu cuối / vỏ khác nhau
puk

@puk: Hãy thử plugin vank YankRing. Nó lưu văn bản được kéo dài trong một tệp, vì vậy nó có thể được chia sẻ qua các trường hợp vim.
pixelastic

@Pixelastic Tôi tìm thấy một giải pháp phù hợp ở đây để kéo theo bảng tạm hệ thống. Ngoài ra, Vim hoạt động tốt nhất trong một trường hợp. Tôi đã ngừng làm cho nó làm những gì tôi muốn và học cách sử dụng đúng cách vim :-) stackoverflow.com/a/8757876/654789
puk

@puk: Cảm ơn, điều đó đã không xảy ra với tôi rằng sử dụng bảng tạm hệ thống có nghĩa là cũng chia sẻ nó qua các trường hợp vim :)
pixelastic

4
  • Bạn có thể ánh xạ các lệnh thường thao tác bộ đệm để thao tác các tab, như tôi đã thực hiện với gf trong .vimrc của mình:

    map gf :tabe <cfile><CR>
    

    Tôi chắc rằng bạn có thể làm tương tự với [^

  • Tôi không nghĩ rằng vim hỗ trợ điều này cho các tab (chưa). Tôi sử dụng gt và gT để chuyển sang các tab tiếp theo và trước đó. Bạn cũng có thể sử dụng Ngt, trong đó N là số tab. Một điều tôi có là theo mặc định, số tab không được hiển thị trong dòng tab. Để khắc phục điều này, tôi đặt một vài hàm ở cuối tệp .vimrc của mình (Tôi không dán ở đây vì nó dài và không định dạng chính xác).


<c-w>gfsẽ mở tên tệp dưới con trỏ trong tab mới
Peter Rincker

4

Tôi sử dụng bộ đệm như tab, sử dụng plugin BufExplorer và một vài macro:

" CTRL+b opens the buffer list
map <C-b> <esc>:BufExplorer<cr>

" gz in command mode closes the current buffer
map gz :bdelete<cr>

" g[bB] in command mode switch to the next/prev. buffer
map gb :bnext<cr>
map gB :bprev<cr>

Với BufExplorer, bạn không có thanh tab ở trên cùng, nhưng mặt khác, nó tiết kiệm không gian trên màn hình của bạn, ngoài ra bạn có thể mở vô số tệp / bộ đệm và danh sách bộ đệm có thể tìm kiếm ...


2

Nếu bạn muốn bộ đệm hoạt động như các tab, hãy kiểm tra plugin tabline .

Điều đó sử dụng một cửa sổ duy nhất và thêm một dòng trên đầu để mô phỏng các tab (chỉ hiển thị danh sách bộ đệm). Điều này xuất hiện từ lâu khi các tab chỉ được hỗ trợ trong GVim nhưng không có trong dòng lệnh vim. Vì nó chỉ hoạt động với bộ đệm, mọi thứ tích hợp tốt với phần còn lại của vim.

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.