Làm cách nào tôi có thể mở nhiều tab cùng một lúc?


14

Nếu tôi sử dụng:

:tabedit file1 file2

Tôi có:

E172: Only one file name allowed

Có cách nào để sử dụng :tabeditvới nhiều tên tập tin không? Hoặc một cách khác để mở nhiều tab cùng một lúc?



@kenorb Có. Và nó có chính xác câu trả lời tương tự đã có ở đây, ngoại trừ không có lời giải thích về những gì nó làm. Vậy làm thế nào để liên kết với nó thêm bất kỳ giá trị?
Martin Tournoij

Có một số câu trả lời khác, và câu trả lời mới có thể đến đó. Thứ hai, có rất ít liên kết / liên quan tương tự khác ở đó, vì vậy người dùng cũng có thể tìm hiểu thêm từ các lực lượng liên quan.
kenorb 23/2/2015

Tôi đã học được điều này một lót : :args *.c | tab all. Câu hỏi khác phổ biến hơn câu hỏi này, vì vậy thật tốt khi liên kết nó.
kenorb 23/2/2015

Câu trả lời:


10

Đưa ra các vấn đề & sự phức tạp trong câu trả lời khác của tôi bằng cách sử dụng cách "tích hợp" bằng cách sửa đổi danh sách đối số, tôi đã thêm chức năng nhỏ của riêng mình để thực hiện điều này:

" Open multiple tabs at once
fun! OpenMultipleTabs(pattern_list)
    for p in a:pattern_list
        for c in glob(l:p, 0, 1)
            execute 'tabedit ' . l:c
        endfor
    endfor
endfun

command! -bar -bang -nargs=+ -complete=file Tabedit call OpenMultipleTabs([<f-args>])

Bây giờ bạn có thể sử dụng :Tabedit *.vim. Hàm này sẽ mở rộng tất cả các mẫu hình cầu và thực thi :tabedit <f>cho mọi tệp. Bạn có thể thêm bao nhiêu tên đường dẫn tùy ý, ví dụ: tất cả đều hoạt động:

:Tabedit file.rb
:Tabedit *.c
:Tabedit file1.py file2.py _*.py
:Tabedit /etc/hosts file{1,2}.sh

Chà, vân vân ...

Tôi đặt này trong một chút globedit.vim plugin, mà cũng chứa lệnh cho :Edit, :Splitvv


2
Chức năng và mệnh lệnh tuyệt vời! Một số cải tiến: (1) Sử dụng [<f-args>]thay vì "<args>"- theo cách đó, patterntham số sẽ là Danh sách (mảng) và bạn sẽ không phải xử lý việc tách chuỗi thủ công. (2) Truyền một số không bằng 0 làm đối số thứ ba glob()để nó trả về Danh sách. Sau đó, bạn có thể tránh chia tách thủ công ở đó, quá. Bạn sẽ cần phải vượt qua 0làm đối số thứ hai để bỏ qua nó mà không ảnh hưởng đến hành vi : glob(l:p, 0, 1).
tommcdo 23/2/2015

6

Theo tôi biết, cách tích hợp duy nhất để làm điều này là:

:args *.vim
:tab all

Đầu tiên, :argssẽ thay thế danh sách đối số. Danh sách đối số liệt kê các tệp bạn đã mở Vim với; nên vim file1 file2phương tiện mà danh sách đối số chứa file1file2.
Chúng ta có thể sửa đổi điều này trong thời gian chạy và Vim sẽ mở một bộ đệm cho mỗi mục nhập mới trong danh sách đối số.
Xem :help argument-listđể biết thêm thông tin.

Các :alllệnh mở một cửa sổ cho mỗi mục trong danh sách đối số, các :tablệnh thực thi một lệnh, và mở ra một tab mới khi lệnh nhất định sẽ mở một cửa sổ mới.

Hãy cẩn thận

Có một số hãy cẩn thận với phương pháp này.

Trước hết, không có kiểm tra trùng lặp, vì vậy bạn có thể kết thúc với 2 hoặc nhiều tab cho cùng một bộ đệm.

Nhưng vấn đề lớn nhất là nó thay thế tất cả các tab của bạn bằng những gì có trong danh sách đối số; vì vậy bạn mất tất cả các tab hiện có.
Bạn có thể phá vỡ điều này một chút bằng cách sử dụng :argadd *.vimđể thêm vào danh sách đối số, thay vì thay thế nó; nhưng lệnh như :edithoặc :tabeditlàm không thay đổi danh sách đối số, và bạn sẽ mất các tab trừ khi bạn thêm chúng vào danh sách đối số (bạn vẫn có chúng trong danh sách đệm, mặc dù). Bạn cũng có thể không muốn mở mọi thứ trong danh sách đối số của mình trong một tab, có lẽ bạn chỉ muốn mở 2 tệp dưới dạng một tab bổ sung.

Có lẽ bạn có thể làm cho điều này tốt hơn một chút bằng cách trước tiên thêm việc thêm tất cả các tab hiện đang mở vào danh sách đối số (mà tôi thực sự không thể làm việc), nhưng điều này vẫn còn chưa hoàn hảo. Nếu một tab có 2 cửa sổ trở lên, nó vẫn sẽ sửa đổi chúng ...


Tôi có thể sai, nhưng điều này không mở một tab phụ (như đã thấy trong câu hỏi của tôi về việc mở các tab theo mặc định)?
muru

1
Nếu bạn đang đề cập đến câu trả lời của tôi cho câu hỏi đó, thì sự khác biệt là tôi đã sử dụng :argdo tabedit %, mở ra một tab mới cho mỗi đối số. Bắt đầu với một tab và mở n thẻ mới sẽ tự nhiên rời khỏi bạn với các tab n + 1 . :tab alllà một giải pháp tốt hơn nhiều.
tommcdo 23/2/2015

@tommcdo Tôi đã nói về câu trả lời của Josh Petrie . Bạn sẽ không xảy ra với một trong những bí danh của anh ấy, phải không? :)
muru

Haha, không. Tôi phải đã nghĩ về một câu hỏi khác!
tommcdo 23/2/2015

2

Bạn có thể sử dụng :nextlệnh thay thế, ví dụ:

:n file1 file2

hoặc là:

:n *.txt

Điều này có vẻ giống như sử dụng :args *.vim? Ít nhất, nó hoạt động giống nhau, và :help next_fchứng minh nó giống nhau ...
Martin Tournoij

Nó ngắn hơn và đơn giản và bạn đã không đề cập đến điều đó. Hành vi là như nhau, như bạn đã hỏi trong câu hỏi cho điều đó.
kenor 23/2/2015

2

Từ dòng lệnh bạn có thể sử dụng:

vim file1 ... filen -p

Và nếu bạn quên sử dụng, -pbạn vẫn có thể sử dụng

:tab ball

Btw, đừng quên rằng biến tabpagemax(giá trị mặc định 10) giới hạn số lượng tab bạn có thể mở theo cách này.


0

Bạn thực sự có thể mở các tab mới và giữ các tab hiện tại của mình mà không cần viết các chức năng mới (xem câu trả lời này trên Stack Overflow ):

:args file1 file2 | argdo tabe

Bạn có thể muốn mở một tab trống mới ( :tabe) trước khi thực hiện điều đó, vì tệp đầu tiên sẽ mở trong tab hiện tại. Ngoài ra, một tab trống thêm sẽ được mở (xem :help argdođể hiểu lý do tại sao).


Bạn cũng cần sửa lỗi tô sáng cú pháp (vì một số lý do), như được giải thích trong liên kết và đóng tab cuối cùng, vì vậy lệnh 'đầy đủ' sẽ là: :tabnew | args file1 file2 | argdo tabe | tabdo syntax onBạn cần nhấn Enter để xóa dấu nhắc và gõ :closeđể xóa dấu cuối ( trống) tab ... đó là rất nhiều cách gõ và chỉ đáng giá nếu bạn mở nhiều tab (đối với 2 hoặc 3 tệp, chỉ cần sử dụng :tabehai lần sẽ nhanh hơn).
Martin Tournoij
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.