Tôi hầu như đã tránh các tab vì vấn đề này, nhưng bây giờ tôi có một chức năng có hành vi sao chép tab tôi muốn. Tôi đã thử nó, nhưng chưa bắt đầu sử dụng nó một cách nghiêm túc. Có thể có một số nhược điểm ẩn cho quy trình công việc này.
Một vấn đề với chức năng là nó không sao chép một số trạng thái từ cặp cửa sổ đệm trước đó (như có set number
bật hay không). Suy đoán một chút, c-w T
có lẽ không có vấn đề này bởi vì không có sự trùng lặp nào được thực hiện và cửa sổ có lẽ chỉ được sửa chữa.
Vim có một vài danh sách dựa trên 1 cho những thứ như bộ đệm, tab và cửa sổ. Theo như tôi có thể nói, chúng dựa trên 1 vì 0
khóa được sử dụng để di chuyển đến đầu của một dòng và kết quả là vượt qua 0 như một đối số số là không thể.
Chúng tôi quan tâm đến ba danh sách để mô phỏng chức năng này:
- Danh sách toàn cầu của các trang tab
- Danh sách per- [trang tab] của các cửa sổ
- Danh sách bộ đệm toàn cầu
Chúng tôi lưu tất cả các giá trị này, sau đó tạo một tab mới thông qua "tabnew". Các tab mới luôn được tạo ở bên phải, vì vậy không có chỉ mục nào bên dưới tab mà chúng tôi tabnew
từ đó bị vô hiệu. (Một cách mạnh mẽ hơn để làm điều này có lẽ sẽ tốt hơn).
Các tabnew
lệnh cũng di chuyển tập trung vào các tab mới và cửa sổ duy nhất trong nó. Từ đó chúng ta có thể sử dụng buffer
lệnh để tạo một khung nhìn vào bộ đệm ban đầu có tiêu điểm.
Sau đó, chúng tôi sử dụng chỉ mục đã lưu của tab ban đầu để khôi phục tiêu điểm trở lại tab đó. Và sau đó, phần lớn là do hoang tưởng, chúng tôi đặt tiêu điểm trong tab đó thành cửa sổ ban đầu. Vim dường như nhớ cửa sổ nào tập trung trong các tab không nhìn thấy được, nhưng tôi không thích dựa vào đó.
(Một vài điểm phong cách: chuyển đổi số rõ ràng 0+
, biến toàn cục và xác nhận đều có chủ ý)
function! TabDuplicate()
" set vars, sanity checking
let g:tabdup_win = 0+ winnr()
let g:tabdup_buf = 0+ bufnr('%')
let g:tabdup_tabpage = 0+ tabpagenr()
call assert_true(g:tabdup_win > 0)
call assert_true(g:tabdup_buf > 0)
call assert_true(g:tabdup_tabpage > 0)
" make a new tab page,
" the new tab page will have focus
" none of the indices, which are all
" less than the current index, are
" invalidated by creating a new tab
execute "tabnew"
" visit the buffer we saved
execute "buffer " . g:tabdup_buf
" return to the original tab page
execute "tabnext " . g:tabdup_tabpage
" return focus to original window
execute g:tabdup_win . " windcmd w"
endfunction