VIM에서 창간에 파일을 교환하는 방법은 무엇입니까?


123

VIM으로 작업 할 때 항상 여러 개의 창이 표시됩니다. 때때로 나는 그 창을 제자리에서 바꾸는 쉬운 방법을 원합니다. 이 작업을 더 쉽게 할 수있는 플러그인, 매크로 등이 있습니까? BTW, 저는 MiniBufExplorer를 사용합니다.


2
"다른 위치에서 해당 창을 교체"한다는 것은 "창의 위치를 ​​변경하지 않고 창 B의 창 A에있는 버퍼를 열고 그 반대로"를 의미합니까?
hcs42 2010

1
예, 이것이 바로 제가 원하는 것입니다.
mdrozdziel 2010

답변:


304

어느 정도의 제어를 제공하는 몇 가지 유용한 명령이 내장되어 있지만 포괄적 인 것은 아닙니다. 주요 내용은 다음과 같습니다.

  • Ctrl- W, r(즉, 보류 CTRL눌러 W릴리스 CTRL누르 r) - 윈도우를 회전시킨다 (제 창 번째, 두 번째는 등 세번째하게된다)

  • Ctrl- W, x-현재 창을 다음 창으로 교체

  • Ctrl- W, Shift-- H이 창을 맨 왼쪽으로 이동

  • Ctrl- W, Shift-- K이 창을 맨 위로 이동

(그리고 유사하게 Ctrl- W, Shift- JCtrl- W, Shift- L). 보다:

:help window-moving

자세한 내용은.


16
이것은 사용자 정의 Vimscript가 아닌 기본 기능인 "최상의 답변"이어야합니다.
David Rivers

1
완전하지는 않습니다. 창을 파괴하고 다시 만들지 않고는 내장 창 관리를 사용하여 수행 할 수없는 사용 사례가 많이 있습니다. 스왑 버퍼 스크립트는 이러한 사용 사례를 허용합니다.
bobpaul 2011 년

ctl-w도 작동합니다. ctl-W는 일부 터미널 에뮬레이터에서 창을 닫습니다.
datakid

7

Vim 창을 복사하여 붙여 넣기 위해 vimrc에서 다음 코드 스 니펫을 작성하고 사용하고 있습니다.

예를 들어 다음과 같은 단축키를 정의합니다.

  • <c-w>y: "Yanks the window", 즉 현재 윈도우의 버퍼 번호를 전역 변수에 저장합니다.
  • <c-w>pp: "현재 창 위치에 창을 놓습니다."즉, 이전에 저장된 버퍼 번호를 읽고 현재 창에서 해당 버퍼를 엽니 다. 또한 현재 창에 있던 버퍼 번호도 저장합니다.

"다른 위치에서 해당 창을 바꾼다"는 것이 "창 B의 창 A에서 버퍼를 열고, 그 반대로 창의 위치를 ​​변경하지 않고"를 의미하는 경우 다음 키보드 시퀀스를 사용하여 창을 바꿀 수 있습니다.

  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 년 전에 완벽하게 대답했습니다. Vimcast를위한 광고 캠페인을하고 있습니까?
mdrozdziel

@mdrozdziel OP 이후 9 년이 지난이 답변에 감사드립니다. 내가 원하는 정보만으로 가장 간결한 답변.
roro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.