두 창의 위치를 ​​바꾸십시오


29

다음은 현재 창의 구조입니다.

+ ----- + ----------------------------
| |
| A |
| |
+ ----- +
| |
| B |

A와 B의 순서는 자연스럽지 않습니다. B가 위에 있으면 더 좋을 것입니다.

그러나 내가 가면 <C-w>KB는 모든 창의 맨 꼭대기가 될 것입니다. B를 A 위에 놓을 수는 있지만 이미 A 위에있는 다른 창 위에 놓을 수는 없습니까?

두 개의 창이 세로로 분할 된 경우 어떻게 가로로 분할하도록 변경할 수 있습니까?


7
이 게시물 에서는 창을 회전하는 방법에 대해 설명합니다. 수직에서 수평으로 분할 스위칭에 관한 것이다.
lcd047

@ lcd047이 사이트 외부의 질문입니다. 여기에 작은 대답을 쓸 가치가 있고 링크를 포함시키는 것이 가치가 있습니까?
Bernhard

1
@ Bernhard 나는 이것이 메타에 대한 좋은 질문이라고 생각합니다 .
lcd047

1
@Bernhard . 링크뿐만 아니라 완전한 답변을 작성하십시오.
Gilles 'SO- 악마 그만'

1
그런 다음 무엇을하려고하는지 그리고 왜 두 가지 답변으로 문제를 해결하지 않겠다고 설명했는지 설명하십시오.
lcd047

답변:


33

분할 창의 두 부분을 바꾸려면 간단히 다음을 수행하십시오. <C-w> <C-r>


내가 틀렸을 수도 있지만 솔루션이 창을 회전시켜 2 개 이상의 분할로 결과가 OP가 찾고있는 것이 아닐 것입니다.
statox

너가 확실히 맞아. OP는 s.th를 찾고있었습니다. "분할 창의 두 부분 교체"보다 더 복잡합니다.
modes to jan

실제로 OP는 두 개의 분할 창을 바꾸는 명령을 찾고 있지만 솔루션은 현재 분할 창을 모두 회전시킵니다. 언급 한 바와 같이 :h CTRL-W_CTRL-R: The second window becomes the first one, the third one becomes the second one, etc.따라서 3 개의 스플릿이있는 경우 하단 1에 커서 <c-w><c-r>가 3 번째 창에 닿으 면 OP가 요청한 것이 아닌 2 개의 다른 창 위에 있습니다.How can I put B above A, but not above any other window that is already above A?
statox

6

window위치 를 바꾸기 위해 , 그 효과는이 두 개의 창이 보여주는 버퍼를 바꾸는 것과 같습니다.
예를 들어, 창 A에 버퍼 2가 있고 창 B에 버퍼 8이 있으면 창 A로 이동하여 버퍼 8을 선택한 다음 창 B로 이동하여 버퍼 2를 선택하십시오.

이 아이디어는 스크립트를 작성하도록 영감을 주었으며 이미 내 도구 상자에도 있습니다.

기능 코드 :

function! WinBufSwap()
  let thiswin = winnr()
  let thisbuf = bufnr("%")
  let lastwin = winnr("#")
  let lastbuf = winbufnr(lastwin)

  exec  lastwin . " wincmd w" ."|".
      \ "buffer ". thisbuf ."|".
      \ thiswin ." wincmd w" ."|".
      \ "buffer ". lastbuf
endfunction

command! Wswap :call WinBufSwap()
map <Leader>bs <C-c>:call WinBufSwap()<CR>
  1. 창 A 선택
  2. 창 B 선택
  3. :call WinBufSwap()
    커서는 원래 창에 그대로두고 미리 ​​선택된 두 개의 창에서 버퍼를 교체합니다.

Vim이 작업 할 창을 지정하는 데 필요하므로 미리 교체 할 두 개의 창을 선택하는 것이 핵심 세부 사항입니다.


"창 A를 선택한 다음 B를 선택하십시오"라고 말할 때의 정확성은 "최근에 본 버퍼 및 창의 순서를 표시하기 위해 A에 초점을두고 B에 초점을 두어야합니다." select "는"초점을두고있다 "이외의 것을 의미합니까?
padawin

그렇습니다.“선택”을“초점”으로 사용하고 있습니다.
Cometsong

6
CTRL-W x 창 N과 현재 창 교환
                   (기본 : 다음 창)

( index.txt2.2 절. "창 명령")

A가 현재 창이면 다음은 B가되므로 필요한 것만 <C-w> x

B가 현재 창이고 (아래에 더 많은 창이있는 경우) 먼저 A로 이동 한 다음 교환해야합니다. <C-w> k <C-w> x


4

창을 바꾸거나 버퍼를 바꾸는 또 다른 대안은 파일에서 위치를 표시하고 ( 대문자 사용 ) 선택한 창에서 해당 표시를 여는 것입니다.

예를 들어 file_Afile_B 라는 두 개의 파일이있는 경우 :

  • file_A 가있는 창으로 이동하여 표시합니다.mA
  • file_B 가있는 창으로 이동하여 표시하십시오.mB
  • 그런 다음 file_A 의 마크 를 해당 창으로 가져옵니다 .'A
  • 그런 다음 첫 번째 창으로 돌아가서 거기에서 file_B 의 마크를 가져옵니다 'B.

이 방법의 장점은 어떤 이유로 창을 두 번 이상 분할하고 12시와 7시에 창을 바꾸려는 경우와 같이 창을 바꾸는 명확한 논리가없는 경우 ' t 창을 돌리면 버퍼를 쉽게 교체 할 수 있습니다.


0

다음 기능을 사용하여 두 창 사이에서 버퍼를 교환 할 수 있습니다.

function! SwitchWindow(count) abort
    let l:current_buf = winbufnr(0)
    exe "buffer" . winbufnr(a:count)
    exe a:count . "wincmd w"
    exe "buffer" . l:current_buf
    wincmd p
endfunction
nnoremap <C-w>x :<C-u>call SwitchWindow(v:count1)<CR>

이제는 버퍼를 바꾸는 것이 기술적으로 스와핑 윈도우처럼 작동합니다. 창을 수동으로 추적하지 않기 때문에 어떤 버퍼가 어떤 창을 보유하고 있는지 추적합니다. 따라서 위의 기능은 대부분의 상황에서 도움이 될 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.