Hoán đổi vị trí của hai cửa sổ


29

Nói sau đây là cấu trúc hiện tại của cửa sổ của tôi:

+ ----- + ----------------------------
| |
| Một |
| |
+ ----- +
| |
| B |

Thứ tự của A và B không hoàn toàn tự nhiên. Sẽ tốt hơn nếu B đứng đầu.

Tuy nhiên, nếu tôi đi <C-w>K, B sẽ là đỉnh của tất cả các cửa sổ, đó không phải là điều tôi muốn. Làm thế nào tôi có thể đặt B trên A, nhưng không phải trên bất kỳ cửa sổ nào khác đã ở trên A?

Và nếu hai cửa sổ được chia theo chiều dọc, làm thế nào tôi có thể thay đổi chúng thành phân chia theo chiều ngang?


7
Bài này giải thích làm thế nào để xoay cửa sổ. Đây là về việc chuyển đổi phân chia từ dọc sang ngang.
lcd047

@ lcd047 Đó là những câu hỏi bên ngoài trang web này. Có đáng để viết một câu trả lời nhỏ ở đây và bao gồm các liên kết (có giá trị) không?
Bernhard

1
@Bernhard Tôi cho rằng đây là một câu hỏi hay cho meta .
lcd047

1
@Bernhard . Hãy chắc chắn để viết một câu trả lời đầy đủ, không chỉ liên kết.
Gilles 'SO- đừng trở nên xấu xa'

1
Sau đó, vui lòng giải thích những gì bạn đang cố gắng làm và tại sao hai câu trả lời tôi chỉ cho bạn không giải quyết vấn đề.
lcd047

Câu trả lời:


33

Để hoán đổi hai phần của cửa sổ chia, chỉ cần làm: <C-w> <C-r>


Tôi có thể sai nhưng giải pháp của bạn xoay các cửa sổ vì vậy với hơn 2 lần phân chia, kết quả sẽ không phải là điều OP đang tìm kiếm.
statox

Bạn hoàn toàn đúng. OP đã tìm kiếm s.th. phức tạp hơn "hoán đổi hai phần của một cửa sổ tách".
modesto

Trên thực tế OP đang tìm kiếm một lệnh để hoán đổi hai cửa sổ tách nhưng giải pháp của bạn xoay tất cả các cửa sổ tách hiện tại. Như đã nêu trong :h CTRL-W_CTRL-R: The second window becomes the first one, the third one becomes the second one, etc.Do đó, nếu bạn có 3 lần phân tách, con trỏ ở dưới cùng và nhấn <c-w><c-r>vào cửa sổ thứ 3 sẽ ở trên cùng của 2 cái khác không phải là điều OP yêu cầu:How can I put B above A, but not above any other window that is already above A?
statox

6

Để hoán đổi windowvị trí, hiệu ứng tương đương với việc hoán đổi bộ đệm mà hai cửa sổ đó hiển thị.
ví dụ: Nếu cửa sổ A có bộ đệm 2 và cửa sổ B có bộ đệm 8, bạn sẽ muốn đến Cửa sổ A, chọn bộ đệm 8, sau đó đến Cửa sổ B, chọn bộ đệm 2.

Ý tưởng này đã truyền cảm hứng cho tôi viết kịch bản - và nó cũng đã có trong hộp công cụ của riêng tôi

Mã chức năng:

function! WinBufSwap()
  let thiswin = winnr()
  let thisbuf = bufnr("%")
  let lastwin = winnr("#")
  let lastbuf = winbufnr(lastwin)

  exec  lastwin . " wincmd w" ."|".
      \ "buffer ". thisbuf ."|".
      \ thiswin ." wincmd w" ."|".
      \ "buffer ". lastbuf
endfunction

command! Wswap :call WinBufSwap()
map <Leader>bs <C-c>:call WinBufSwap()<CR>
  1. Chọn cửa sổ A
  2. Chọn cửa sổ B
  3. :call WinBufSwap()
    Điều này hoán đổi bộ đệm trong hai cửa sổ được chọn trước, để lại con trỏ trong cửa sổ ban đầu.

Chọn hai cửa sổ mong muốn được hoán đổi trước thời hạn là chi tiết chính, vì điều đó là cần thiết để chỉ định cho Vim cái nào sẽ hoạt động.


Chỉ cần một độ chính xác, khi bạn nói "chọn cửa sổ A, rồi B", bạn có nghĩa là "Tập trung vào A, sau đó vào B, để đánh dấu thứ tự của bộ đệm và cửa sổ nhìn thấy lần cuối, để hoán đổi đúng không?" chọn "có nghĩa gì khác ngoài" tập trung vào "?
padawin

Có chính xác: Tôi đang sử dụng một số lựa chọn trên mạng vì tập trung vào các ứng dụng khác.
Cometsong

6
CTRL-W x trao đổi cửa sổ hiện tại với cửa sổ N
                   (mặc định: cửa sổ tiếp theo)

( index.txtphần 2.2, "Lệnh cửa sổ")

Nếu A là cửa sổ hiện tại, thì cửa sổ tiếp theo sẽ là B, vì vậy bạn chỉ cần <C-w> x

Nếu B là cửa sổ hiện tại (và có nhiều cửa sổ bên dưới) thì trước tiên bạn sẽ phải đến A, sau đó trao đổi: <C-w> k <C-w> x


4

Một cách khác để hoán đổi cửa sổ hoặc hoán đổi bộ đệm, là đánh dấu các vị trí (sử dụng dấu hoa ) trong các tệp của bạn và mở các dấu đó trong các cửa sổ bạn chọn.

Ví dụ: nếu tôi có hai tệp, file_Afile_B :

  • Tôi sẽ đi đến cửa sổ với file_A và đánh dấu nó:mA
  • đi đến cửa sổ với file_B và đánh dấu nó:mB
  • Sau đó lấy dấu của file_A vào cửa sổ đó:'A
  • sau đó quay lại cửa sổ đầu tiên và lấy dấu của file_B trong đó : 'B.

Ưu điểm của phương pháp này là nếu vì một lý do nào đó, bạn chia tách khung của mình nhiều lần và không có logic rõ ràng để hoán đổi chúng xung quanh, như nếu bạn muốn trao đổi các pan vào lúc 12 giờ và 7 giờ, bạn có thể ' Chỉ cần xoay các cửa sổ xung quanh nhưng bạn có thể dễ dàng trao đổi bộ đệm.


0

Bạn có thể trao đổi bộ đệm giữa hai cửa sổ với chức năng sau:

function! SwitchWindow(count) abort
    let l:current_buf = winbufnr(0)
    exe "buffer" . winbufnr(a:count)
    exe a:count . "wincmd w"
    exe "buffer" . l:current_buf
    wincmd p
endfunction
nnoremap <C-w>x :<C-u>call SwitchWindow(v:count1)<CR>

Bây giờ, thường xuyên nhất, trao đổi bộ đệm sẽ hoạt động kỹ thuật như trao đổi cửa sổ. Vì bạn không theo dõi các cửa sổ theo cách thủ công, bạn theo dõi cửa sổ nào đang giữ bộ đệm nào. Vì vậy, chức năng trên sẽ giúp bạn trong hầu hết các tình huống.

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.