Nhân đôi bộ đệm vào tab mới thay vì di chuyển nó


10

Tôi thường muốn tạm thời tối đa hóa bộ đệm trong trang tab và sau đó quay lại cấu hình bộ đệm cũ mà tôi đang xem. Quy trình công việc hiện tại của tôi để làm một cái gì đó như thế này là để đóng tất cả các bộ đệm khác bằng cách sử dụng <c-w>ohoặc để di chuyển bộ đệm mà tôi hiện đang xem xét vào tab riêng của nó <c-w>T. Vấn đề với cách tiếp cận thứ hai là nó loại bỏ bộ đệm khỏi trang tab gốc.

Tôi cư ba tác phẩm a.txt, b.txtc.txtvới a, bctương ứng.

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

Khi tôi mở cả ba tệp này trong một trang tab, tôi nhận được những điều sau đây.

nhập mô tả hình ảnh ở đây

Sau đó, tôi có thể tự di chuyển a.txtđến một tab. Tuy nhiên, khi tôi làm, a.txtsẽ bị xóa khỏi trang tab gốc. (Vì vậy, đây sẽ là sau một <c-w>Tgt)

nhập mô tả hình ảnh ở đây

Tôi muốn có khả năng chọn vào thời điểm mà tôi đã nhấn <c-w>Tđể giữ nội dung của bộ đệm ban đầu, tạo một trang tab mới chỉ chứa bộ đệm hiện đang tập trung và sau đó tập trung vào trang tab mới tôi vừa tạo. Nói cách khác, một lệnh gần như chính xác <c-w>Tngoại trừ trang tab gốc được giữ nguyên và hiện a.txtở trong hai trang tab.

Có cách nào để làm việc này không?

Câu trả lời:


13

Tôi không chắc nhưng bạn có thể thử :tab split(hoặc phiên bản ngắn hơn :tab sp).

Các :splitlệnh cần lặp lại trong các khung nhìn hiển thị a.txt, trong khi :tabsửa đổi nên di chuyển khung nhìn này thành một trang tab chuyên dụng.


Nếu bạn muốn thay đổi hành vi của C-w T, bạn có thể ánh xạ lại như thế này:

nnoremap <C-w>T :tab split<CR>

Tổng quát hơn, mỗi khi bạn tìm thấy một lệnh chia đôi cửa sổ và thay vào đó, bạn muốn nó tạo ra một trang tab mới, bạn có thể đặt tiền tố cho nó :tab.

Nó có thể được sử dụng, ví dụ, để đọc bộ đệm trợ giúp trong trang tab mới:

:tab help {your_topic}

Theo mặc định, trang tab mới sẽ xuất hiện sau trang hiện tại. Nhưng nếu bạn muốn làm cho nó xuất hiện ở một nơi khác, bạn có thể thêm tiền tố :tabvào một số đếm.

Ví dụ: để sao chép chế độ xem hiện tại trong trang tab sau trang thứ 3, bạn có thể nhập:

:3tab split

Và để làm cho nó xuất hiện như là đầu tiên:

:0tab split

Để biết thêm thông tin, bạn có thể đọc :h :tab:

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one

2

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 numberbật hay không). Suy đoán một chút, c-w Tcó 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ì 0khó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 tabnewtừ đó 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 tabnewlệ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 bufferlệ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
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.