Khi tôi làm việc với VIM, tôi luôn có nhiều cửa sổ hiển thị. Đôi khi tôi muốn có một cách dễ dàng, để trao đổi các cửa sổ đó ở những nơi. Có bất kỳ Plugin, Macro, vv để làm cho điều này dễ dàng hơn? BTW, tôi sử dụng MiniBufExplorer.
Khi tôi làm việc với VIM, tôi luôn có nhiều cửa sổ hiển thị. Đôi khi tôi muốn có một cách dễ dàng, để trao đổi các cửa sổ đó ở những nơi. Có bất kỳ Plugin, Macro, vv để làm cho điều này dễ dàng hơn? BTW, tôi sử dụng MiniBufExplorer.
Câu trả lời:
Có một vài lệnh hữu ích được xây dựng trong đó cung cấp cho bạn một lượng điều khiển nhất định, nhưng nó không toàn diện. Những cái chính là:
Ctrl- W, r(tức là giữ CTRL, nhấn W, nhả CTRL, nhấn r) - làm xoay các cửa sổ (Cửa sổ thứ nhất trở thành cửa sổ thứ hai, cửa sổ thứ hai trở thành cửa sổ thứ ba, v.v.)
Ctrl- W, x- hoán đổi cửa sổ hiện tại với cửa sổ tiếp theo
Ctrl- W, Shift- H- di chuyển cửa sổ này sang bên trái
Ctrl- W, Shift- K- di chuyển cửa sổ này lên trên cùng
(và tương tự cho Ctrl- W, Shift- Jvà Ctrl- W, Shift- L). Xem:
:help window-moving
để biết thêm thông tin.
Tôi đã viết và đã sử dụng đoạn mã sau trong vimrc của mình để sao chép các cửa sổ Vim của mình.
Điều này xác định ví dụ các phím tắt sau:
<c-w>y
: "Yanks the window", tức là lưu số lượng bộ đệm trong cửa sổ hiện tại trong một biến toàn cục.<c-w>pp
: "Đặt cửa sổ vào vị trí của cửa sổ hiện tại", tức là nó đọc số bộ đệm được lưu trước đó và mở bộ đệm đó trong cửa sổ hiện tại. Nó cũng lưu trữ số lượng bộ đệm đã từng có trong cửa sổ hiện tại.Nếu bằng cách "hoán đổi các cửa sổ ở các vị trí", bạn có nghĩa là "mở bộ đệm trong cửa sổ A trong cửa sổ B và ngược lại, không thay đổi vị trí của các cửa sổ", bạn có thể sử dụng trình tự bàn phím sau để hoán đổi các cửa sổ:
<c-w>y
(kéo số bộ đệm)<c-w>pp
(dán bộ đệm)<c-w>pp
(dán lại bộ đệm)Nó chỉ hoạt động trong Vim> = 7.0.
if version >= 700
function! HOpen(dir,what_to_open)
let [type,name] = a:what_to_open
if a:dir=='left' || a:dir=='right'
vsplit
elseif a:dir=='up' || a:dir=='down'
split
end
if a:dir=='down' || a:dir=='right'
exec "normal! \<c-w>\<c-w>"
end
if type=='buffer'
exec 'buffer '.name
else
exec 'edit '.name
end
endfunction
function! HYankWindow()
let g:window = winnr()
let g:buffer = bufnr('%')
let g:bufhidden = &bufhidden
endfunction
function! HDeleteWindow()
call HYankWindow()
set bufhidden=hide
close
endfunction
function! HPasteWindow(direction)
let old_buffer = bufnr('%')
call HOpen(a:direction,['buffer',g:buffer])
let g:buffer = old_buffer
let &bufhidden = g:bufhidden
endfunction
noremap <c-w>d :call HDeleteWindow()<cr>
noremap <c-w>y :call HYankWindow()<cr>
noremap <c-w>p<up> :call HPasteWindow('up')<cr>
noremap <c-w>p<down> :call HPasteWindow('down')<cr>
noremap <c-w>p<left> :call HPasteWindow('left')<cr>
noremap <c-w>p<right> :call HPasteWindow('right')<cr>
noremap <c-w>pk :call HPasteWindow('up')<cr>
noremap <c-w>pj :call HPasteWindow('down')<cr>
noremap <c-w>ph :call HPasteWindow('left')<cr>
noremap <c-w>pl :call HPasteWindow('right')<cr>
noremap <c-w>pp :call HPasteWindow('here')<cr>
noremap <c-w>P :call HPasteWindow('here')<cr>
endif
Tôi đã hỏi một câu hỏi tương tự cùng một lúc: Tôi muốn một cách để trao đổi các cửa sổ cụ thể mà không thay đổi bố cục phức tạp tùy ý. Tôi đã kết thúc việc tạo một vim plugin từ một trong những giải pháp được đề xuất. Nó được gọi là WindowSwap.vim ; cài đặt nó với trình quản lý plugin vim ưa thích của bạn và tạo cho nó một vòng xoáy.
Với WindowSwap.vim, bạn chỉ cần
<Leader>yw
để kéo một cửa sổ. <Leader>pw
để dán cửa sổ đó, hoán đổi nó với vị trí của cửa sổ đầu tiên.Các kết hợp chính tất nhiên là cấu hình theo sở thích của bạn.
Vì <c-w>r
hoặc <c-w>x
có một hạn chế là bạn không thể xoay hoặc trao đổi cửa sổ Khi chia tách cửa sổ dọc và ngang được trộn lẫn. Và <c-w>H
có thể làm cho bố cục cửa sổ thay đổi ngoài mong đợi của bạn đặc biệt là khi bạn có nhiều cửa sổ.
Vì vậy, bạn có thể làm một số công việc để đáp ứng nhu cầu cụ thể của bạn về chuyển đổi cửa sổ / bộ đệm. Dưới đây là ví dụ để chuyển đổi cửa sổ hiện tại bằng cửa sổ trên cùng bên trái (thông thường tôi làm cho cửa sổ được tối đa hóa theo chiều dọc):
function! SwitchMainWindow()
let l:current_buf = winbufnr(0)
exe "buffer" . winbufnr(1)
1wincmd w
exe "buffer" . l:current_buf
endfunction
nnoremap <c-w><c-e> :call SwitchMainWindow()<cr>
Theo ý kiến của tôi, http://vimcasts.org/episodes/usiness-with-windows/ có câu trả lời hoàn hảo cho câu hỏi này. Tóm lại:
ctrl-w w
chu kỳ giữa các cửa sổ đang mởctrl-w h
tập trung cửa sổ bên tráictrl-w j
tập trung cửa sổ xuốngctrl-w k
tập trung cửa sổ lênctrl-w l
tập trung cửa sổ bên phảictrl-w r
xoay tất cả các cửa sổctrl-w x
trao đổi cửa sổ hiện tại với hàng xóm của nóctrl-w H
di chuyển cửa sổ hiện tại sang bên tráictrl-w J
di chuyển cửa sổ hiện tại xuống dướictrl-w K
di chuyển cửa sổ hiện tại lên trên cùngctrl-w L
di chuyển cửa sổ hiện tại sang bên phải