Để chuyển từ tách dọc sang tách ngang nhanh trong Vim


596

Làm thế nào bạn có thể chuyển đổi các cửa sổ hiện tại của bạn từ phân chia theo chiều ngang sang phân chia theo chiều dọc và ngược lại trong Vim?

Tôi đã làm điều đó một lúc trước một cách tình cờ nhưng tôi không thể tìm thấy chìa khóa một lần nữa.


2
có lẽ dwm.vim plugin sẽ được kinda hữu ích
ДМИТРИЙ МАЛИКОВ

Câu trả lời:


894

Danh sách gửi thư của Vim cho biết (được định dạng lại để dễ đọc hơn):

Để thay đổi hai cửa sổ phân chia theo chiều dọc thành phân chia theo chiều ngang

Ctrl- w t Ctrl-w K

Theo chiều dọc:

Ctrl- w t Ctrl-w H

Giải thích:

Ctrl- w t làm cho cửa sổ đầu tiên (topleft) hiện tại

Ctrl- w K di chuyển cửa sổ hiện tại sang toàn bộ chiều rộng ở trên cùng

Ctrl- w H di chuyển cửa sổ hiện tại lên toàn bộ chiều cao ở bên trái

Lưu ý rằng chữ t là chữ thường và K và H là chữ hoa.

Ngoài ra, chỉ với hai cửa sổ, có vẻ như bạn có thể bỏ phần Ctrl- w tbởi vì nếu bạn đã ở một trong hai cửa sổ, thì điểm nào khiến nó hiện tại?


27
Vì vậy, nếu bạn có hai cửa sổ được chia theo chiều ngang và bạn ở cửa sổ thấp hơn, bạn chỉ cần sử dụng ^ WL.
quá nhiều php

7
.... Sức mạnh ... Hôm nay vim-fu của tôi đã tăng gấp đôi, cảm ơn bạn. Có rất nhiều lệnh ^ w thú vị (b, w, v.v.)
Alex Hart

Sẽ rất tuyệt nếu điều này hoạt động khi sử dụng plugin NERDTree :-)
Eno

3
@Eno Hoạt động tốt cho tôi. Chỉ cần bật bảng điều khiển NERDTree của bạn trước khi 'xoay' các phần tách, sau đó bật lại bảng điều khiển. : NERDTreeToggle (Tôi đã ánh xạ tới phím chức năng để thuận tiện).
Lambart

2
Tôi đã thêm một số ánh xạ thủ lĩnh vào cấu hình vim của mình: :nmap <leader>th <C-w>t<C-w>H:nmap <leader>tk <C-w>t<C-w>K
Ian Marcinkowski

324

Ctrl- wTiếp theo H, J, Khoặc L(vốn) sẽ di chuyển cửa sổ hiện tại đến vị trí góc left, bottom, tophoặc righttương ứng như định hướng con trỏ bình thường.

Tương đương chữ thường di chuyển tiêu điểm thay vì di chuyển cửa sổ.


5
Sẽ tốt hơn nhiều vì người dùng sử dụng hjkl để di chuyển giữa các bộ đệm.
Afshin Mehrabani

30
Câu trả lời được chấp nhận là một câu trả lời hay, nhưng đối với tôi, câu trả lời này dễ nhớ hơn. Cảm ơn!
Jon Carter

Hoạt động tốt hơn với nerdtree quá.
arcseldon

Nó hoạt động với tôi trên macOS bằng cách thêm tiền tố Ctrl- w(Tôi không biết nếu ^có nghĩa Ctrltrong ví dụ của bạn).
Giovanni Benussi

@GiovanniBenussi vâng, tôi nghĩ ^là có nghĩa Ctrl.
ma11hew28

47

Khi bạn có hai hoặc nhiều cửa sổ mở theo chiều ngang hoặc chiều dọc và muốn chuyển tất cả chúng sang hướng khác, bạn có thể sử dụng như sau:

(chuyển sang ngang)

:windo wincmd K

(chuyển sang dọc)

:windo wincmd H

Nó thực sự đi đến từng cửa sổ riêng lẻ và sử dụng ^WKhoặc ^WH.


32

Các lệnh ex sau đây sẽ (lại) chia bất kỳ số lượng cửa sổ nào:

  • Để phân chia theo chiều dọc (ví dụ: tạo các ngăn dọc giữa các cửa sổ), hãy nhập :vertical ball
  • Để chia theo chiều ngang, gõ :ball

Nếu có bộ đệm ẩn, việc ban hành các lệnh này cũng sẽ làm cho bộ đệm ẩn hiển thị.


Đây phải là câu trả lời được chấp nhận, vì câu trả lời được chấp nhận hiện tại sẽ chỉ hoạt động cho hai tệp. Câu trả lời này đầy đủ hơn.
DrStrangepork

:vert[ical] balltrong tài liệu như vậy :vert ballcũng ok và ngắn hơn.
Titou

:ballgiảm 3 cửa sổ dọc thành 2 cửa sổ ngang, trong khi :vert ball ánh xạ chính xác 3 cửa sổ ngang thành 3 cửa sổ dọc.
Titou

27

Trong VIM, hãy xem những điều sau đây để xem các lựa chọn thay thế khác cho những gì bạn có thể đã làm:

: giúp mở cửa sổ

Ví dụ:

Ctrl- W s
Ctrl- W o
Ctrl- W v
Ctrl- W o
Ctrl- W s
...


11

Tách ngang sang dọc

Ctrl+ Wcho lệnh window, theo sau là Shift+ Hhoặc Shift+L


Tách dọc

Ctrl+ Wcho lệnh window, theo sau là Shift+ Khoặc Shift+J

Cả hai giải pháp áp dụng khi chỉ có hai cửa sổ tồn tại.


Mở trợ giúp theo cách phân chia theo chiều dọc theo mặc định

Thêm cả hai dòng này vào .vimrc:

cabbrev help vert help
cabbrev h vert h

:vert[ical] {cmd}luôn luôn thực hiện cmdtrong một cửa sổ chia theo chiều dọc.


6

Lấy cảm hứng từ câu trả lời của Steve, tôi đã viết hàm đơn giản chuyển đổi giữa các phân chia dọc và ngang cho tất cả các cửa sổ trong tab hiện tại. Bạn có thể liên kết nó với ánh xạ như trong dòng cuối cùng bên dưới.

function! ToggleWindowHorizontalVerticalSplit()
  if !exists('t:splitType')
    let t:splitType = 'vertical'
  endif

  if t:splitType == 'vertical' " is vertical switch to horizontal
    windo wincmd K
    let t:splitType = 'horizontal'

  else " is horizontal switch to vertical
    windo wincmd H
    let t:splitType = 'vertical'
  endif
endfunction

nnoremap <silent> <leader>wt :call ToggleWindowHorizontalVerticalSplit()<cr>

Hoạt động thậm chí còn tốt hơn đối với tôi nếu tôi buộc nó ở cùng một phân chia như vậy if winnr() == 1 windo wincmd J windo wincmd k else windo wincmd J endif if winnr() == 1 windo wincmd L windo wincmd h else windo wincmd L endifHy vọng điều đó có ý nghĩa.
mjhoffmann

5

Theo mẹo của Mark Rushakoff ở trên , đây là bản đồ của tôi:

" vertical to horizontal ( | -> -- )
noremap <c-w>-  <c-w>t<c-w>K
" horizontal to vertical ( -- -> | )
noremap <c-w>\|  <c-w>t<c-w>H
noremap <c-w>\  <c-w>t<c-w>H
noremap <c-w>/  <c-w>t<c-w>H

Chỉnh sửa: sử dụng Ctrl- w rđể trao đổi hai cửa sổ nếu chúng không theo thứ tự tốt.

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.