Під час роботи з VIM у мене завжди видно кілька вікон. Іноді я хотів би мати простий спосіб поміняти місцями ці вікна. Чи є плагін, макрос тощо, щоб зробити це простіше? До речі, я використовую MiniBufExplorer.
Під час роботи з VIM у мене завжди видно кілька вікон. Іноді я хотів би мати простий спосіб поміняти місцями ці вікна. Чи є плагін, макрос тощо, щоб зробити це простіше? До речі, я використовую MiniBufExplorer.
Відповіді:
Вбудовано кілька корисних команд, за допомогою яких можна отримати певний контроль, але це не є всеосяжним. Основні з них:
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
для отримання додаткової інформації.
Я писав і використовую наступний фрагмент коду в моєму vimrc для копіювання моїх вікон Vim.
Це визначає, наприклад, такі ярлики:
<c-w>y
: "Yanks the window", тобто зберігає номер буфера у поточному вікні у глобальній змінній.<c-w>pp
: "Вставляє вікно на місце поточного вікна", тобто воно зчитує номер буфера, збережений раніше, і відкриває цей буфер у поточному вікні. Він також зберігає номер буфера, який раніше знаходився у поточному вікні.Якщо "підміняючи ці вікна місцями", ви маєте на увазі "відкриття буфера у вікні А у вікні В, і навпаки, не змінюючи положення вікон", ви можете використовувати наступну послідовність клавіатури для заміни вікон:
<c-w>y
(поклавши номер буфера)<c-w>pp
(вставляючи буфер)<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
Я задав подібне запитання приблизно в той же час: я хотів, щоб спеціально поміняти вікна, не змінюючи довільно складну компоновку. Я в кінцевому підсумку створив плагін vim із одного із запропонованих рішень. Це називається WindowSwap.vim ; встановіть його за допомогою бажаного менеджера плагінів vim та надайте йому кружляння.
З WindowSwap.vim ви просто
<Leader>yw
вирвати вікно. <Leader>pw
щоб вставити це вікно, поміняючи його позицією першого.Комбінації клавіш, звичайно, налаштовуються під ваші вподобання.
Оскільки <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>
На мою думку, 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
перемістити поточне вікно вправо вправо