Làm cách nào để hoán đổi tập tin giữa các cửa sổ trong VIM?


123

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.


2
Bằng cách "hoán đổi các cửa sổ ở những nơi", bạn có nghĩa là "mở bộ đệm trong cửa sổ A trong cửa sổ B và ngược lại, mà không thay đổi vị trí của các cửa sổ"?
hcs42

1
Vâng, đây chính xác là những gì tôi muốn.
mdrozdziel

Câu trả lời:


304

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- JCtrl- W, Shift- L). Xem:

:help window-moving

để biết thêm thông tin.


16
Đây phải là "câu trả lời tốt nhất" - chức năng riêng, không phải là Vimscript tùy chỉnh.
David Rivers

1
Không hoàn toàn, không. Có rất nhiều trường hợp sử dụng không thể được thực hiện bằng cách sử dụng quản lý cửa sổ tích hợp mà không phá hủy và tạo lại các cửa sổ. Kịch bản bộ đệm trao đổi cho phép các trường hợp sử dụng.
bobpaul

lưu ý rằng ctl-w cũng hoạt động. ctl-W sẽ đóng cửa sổ trong một số trình giả lập thiết bị đầu cuối.
datakid

7

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ổ:

  1. Chọn cửa sổ A (bằng chuột hoặc bằng lệnh bàn phím)
  2. Nhấn <c-w>y(kéo số bộ đệm)
  3. Chọn cửa sổ B
  4. Nhấn <c-w>pp(dán bộ đệm)
  5. Chọn cửa sổ A
  6. Nhấn <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

4

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

  1. <Leader>yw để kéo một cửa sổ.
  2. Di chuyển con trỏ của bạn sang một cửa sổ khác.
  3. <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.


1

<c-w>rhoặc <c-w>xcó 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>Hcó 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>

1

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ái
  • ctrl-w j tập trung cửa sổ xuống
  • ctrl-w k tập trung cửa sổ lên
  • ctrl-w l tập trung cửa sổ bên phải
  • ctrl-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ái
  • ctrl-w J di chuyển cửa sổ hiện tại xuống dưới
  • ctrl-w K di chuyển cửa sổ hiện tại lên trên cùng
  • ctrl-w L di chuyển cửa sổ hiện tại sang bên phải

3
Lý do để thêm một câu trả lời không mang lại thông tin hữu ích mới cho bài viết là gì? Điều này đã được trả lời hoàn hảo 6 năm trước. Bạn đang làm chiến dịch quảng cáo cho vimcasts?
mdrozdziel

@mdrozdziel Tôi đánh giá cao câu trả lời này 9 năm sau OP. Hầu hết câu trả lời ngắn gọn chỉ với thông tin tôi muốn.
roro
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.