Як поміняти файли між Windows у VIM?


123

Під час роботи з VIM у мене завжди видно кілька вікон. Іноді я хотів би мати простий спосіб поміняти місцями ці вікна. Чи є плагін, макрос тощо, щоб зробити це простіше? До речі, я використовую MiniBufExplorer.


2
"Підміняючи ці вікна місцями", ви маєте на увазі "відкриття буфера, який знаходиться у вікні A у вікні B, і навпаки, не змінюючи положення вікон"?
hcs42

1
Так, саме цього я хочу.
mdrozdziel

Відповіді:


304

Вбудовано кілька корисних команд, за допомогою яких можна отримати певний контроль, але це не є всеосяжним. Основні з них:

  • Ctrl- W, r(тобто утримуйте CTRL, натисніть W, відпустіть CTRL, натисніть r) - який обертає вікна (перше вікно стає другим, друге - третім та ін.)

  • Ctrl- W, x- поміняйте поточне вікно на наступне

  • Ctrl- W, Shift- H- перемістіть це вікно вліво зліва

  • Ctrl- W, Shift- K- перемістіть це вікно вгору

(і аналогічно для Ctrl- W, Shift- Jі Ctrl- W, Shift- L). Побачити:

:help window-moving

для отримання додаткової інформації.


16
Це має бути "найкраща відповідь" - власний функціонал, а не користувацький Vimscript.
Девід Ріверс

1
Не повністю, ні. Існує маса випадків використання, які неможливо зробити за допомогою вбудованого управління вікнами без руйнування та відтворення вікон. Сценарій буферів своп дозволяє використовувати ці випадки використання.
bobpaul

зауважте, що ctl-w також працює. ctl-W закриє вікна в деяких емуляторах терміналів.
datakid

7

Я писав і використовую наступний фрагмент коду в моєму vimrc для копіювання моїх вікон Vim.

Це визначає, наприклад, такі ярлики:

  • <c-w>y: "Yanks the window", тобто зберігає номер буфера у поточному вікні у глобальній змінній.
  • <c-w>pp: "Вставляє вікно на місце поточного вікна", тобто воно зчитує номер буфера, збережений раніше, і відкриває цей буфер у поточному вікні. Він також зберігає номер буфера, який раніше знаходився у поточному вікні.

Якщо "підміняючи ці вікна місцями", ви маєте на увазі "відкриття буфера у вікні А у вікні В, і навпаки, не змінюючи положення вікон", ви можете використовувати наступну послідовність клавіатури для заміни вікон:

  1. Виберіть вікно A (за допомогою миші або з клавіатурними командами)
  2. Натисніть <c-w>y(поклавши номер буфера)
  3. Виберіть вікно B
  4. Натисніть <c-w>pp(вставляючи буфер)
  5. Виберіть вікно A
  6. Натисніть <c-w>pp(знову вставте буфер)

Він працює лише у 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

Я задав подібне запитання приблизно в той же час: я хотів, щоб спеціально поміняти вікна, не змінюючи довільно складну компоновку. Я в кінцевому підсумку створив плагін vim із одного із запропонованих рішень. Це називається WindowSwap.vim ; встановіть його за допомогою бажаного менеджера плагінів vim та надайте йому кружляння.

З WindowSwap.vim ви просто

  1. <Leader>yw вирвати вікно.
  2. Перемістіть курсор в інше вікно.
  3. <Leader>pw щоб вставити це вікно, поміняючи його позицією першого.

Комбінації клавіш, звичайно, налаштовуються під ваші вподобання.


1

Оскільки <c-w>rабо <c-w>xє обмеження, що ви не можете обертати або обмінювати вікна, коли вертикальні та горизонтальні розбиття вікон змішані. І <c-w>Hможе змусити макет вікон змінити ваші очікування, особливо коли у вас багато вікон.

Таким чином, ви можете виконати певну роботу, щоб задовольнити ваші особливості перемикання вікон / буферів. Ось приклад перемикання поточного вікна лівим лівим віком (як правило, я це вертикально максимізовано):

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

На мою думку, http://vimcasts.org/episodes/working-with-windows/ має ідеальну відповідь на це питання. Коротко:

  • ctrl-w w цикл між відкритими вікнами
  • ctrl-w h фокусуйте вікно вліво
  • ctrl-w j фокусуйте вікно вниз
  • ctrl-w k фокусуйте вікно вгору
  • ctrl-w l фокусуйте вікно вправо
  • ctrl-w r обертати всі вікна
  • ctrl-w x обміняти поточне вікно зі своїм сусідом
  • ctrl-w H перемістити поточне вікно вліво ліворуч
  • ctrl-w J перемістити поточне вікно вниз
  • ctrl-w K перемістити поточне вікно вгору
  • ctrl-w L перемістити поточне вікно вправо вправо

3
Яка причина додавання відповіді, яка не приносить нової корисної інформації до посту? На це чудово відповіли 6 років тому. Ви робите рекламну кампанію для vimcasts?
mdrozdziel

@mdrozdziel Я ціную цю відповідь через 9 років після закінчення програми. Найбільш коротка відповідь, лише інформація, яку я хотів
РоРо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.