Tukar posisi dua jendela

29

Katakan berikut ini adalah struktur jendela saya saat ini:

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

Urutan A dan B tidak cukup alami. Akan lebih baik jika B ada di atas.

Namun, jika saya pergi <C-w>K, B akan menjadi yang paling atas dari semua jendela, yang bukan yang saya inginkan. Bagaimana saya bisa meletakkan B di atas A, tetapi tidak di atas jendela lain yang sudah di atas A?

Dan jika dua jendela terbelah secara vertikal, bagaimana saya bisa mengubahnya menjadi membelah secara horizontal?

Jason Hu
sumber
7
Posting ini menjelaskan cara memutar windows. Ini adalah tentang beralih dari vertikal ke horizontal.
lcd047
@ lcd047 Itu adalah pertanyaan di luar situs ini. Apakah layak menulis jawaban kecil di sini dan menyertakan tautannya (yang berharga)?
Bernhard
1
@ Bernardhard Saya kira ini adalah pertanyaan yang bagus untuk meta .
lcd047
1
@ Bernardhard Ya . Pastikan untuk menulis jawaban yang lengkap, bukan hanya tautan.
Gilles 'SO- stop being evil'
1
Kemudian tolong jelaskan apa yang Anda coba lakukan dan mengapa dua jawaban yang saya tunjuk agar Anda tidak mengatasi masalahnya.
lcd047

Jawaban:

33

Untuk menukar dua bagian dari jendela terpisah cukup lakukan: <C-w> <C-r>

modesto
sumber
Saya mungkin salah tetapi solusi Anda memutar windows jadi dengan lebih dari 2 split hasilnya tidak akan seperti yang dicari OP.
statox
Anda benar sekali. OP sedang mencari s.th. lebih rumit daripada "menukar dua bagian dari jendela terpisah".
modesto
Sebenarnya OP sedang mencari perintah untuk menukar dua jendela yang terbagi, tetapi solusi Anda memutar semua jendela yang ada saat ini. Seperti yang dinyatakan dalam :h CTRL-W_CTRL-R: The second window becomes the first one, the third one becomes the second one, etc.Jadi jika Anda memiliki 3 split, kursor di bagian bawah dan tekan <c-w><c-r>jendela ke-3 akan berada di atas 2 yang lain yang bukan yang diminta OP:How can I put B above A, but not above any other window that is already above A?
statox
6

Untuk bertukar windowposisi, efeknya sama dengan menukar buffer yang ditampilkan dua jendela itu.
mis. Jika jendela A memiliki buffer 2 dan jendela B memiliki buffer 8, Anda akan ingin pergi ke Window A, pilih buffer 8, lalu ke Window B, pilih buffer 2.

Ide ini menginspirasi saya untuk menulis skrip - dan itu sudah ada di kotak alat saya sendiri

Kode fungsi:

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. Pilih jendela A
  2. Pilih jendela B
  3. :call WinBufSwap()
    Ini menukar buffer di dua jendela yang dipilih sebelumnya, meninggalkan kursor di jendela asli.

Memilih dua jendela yang diinginkan untuk ditukar sebelumnya adalah detail utama, karena itu diperlukan untuk menentukan untuk Vim mana yang akan digunakan.

Cometsong
sumber
Hanya presisi, ketika Anda mengatakan "pilih jendela A, lalu B", maksud Anda "Fokus pada A, lalu pada B, untuk menandai urutan buffer dan jendela yang terakhir terlihat, untuk bertukar dengan benar? Atau apakah" pilih "berarti sesuatu yang lain daripada" memiliki fokus pada "?
padawin
Ya persis: Saya menggunakan "pilih" sebagai "fokus".
Cometsong
6
CTRL-W x bertukar jendela saat ini dengan jendela N
                   (default: jendela berikutnya)

( index.txtbagian 2.2, "Perintah jendela")

Jika A adalah jendela saat ini, maka yang berikutnya adalah B, jadi Anda hanya perlu <C-w> x

Jika B adalah jendela saat ini (dan ada lebih banyak jendela di bawah) maka Anda pertama-tama harus pergi ke A, kemudian tukar: <C-w> k <C-w> x

JigglyNaga
sumber
4

Alternatif lain untuk menukar jendela atau menukar buffer, adalah menandai posisi (menggunakan tanda huruf besar ) dalam file Anda dan membuka tanda itu di jendela yang Anda pilih.

Misalnya jika saya memiliki dua file, file_A dan file_B :

  • Saya akan membuka jendela dengan file_A dan menandainya:mA
  • buka jendela dengan file_B dan tandai:mB
  • Lalu ambil tanda file_A ke jendela itu:'A
  • kemudian kembali ke jendela pertama dan mengambil tanda file_B sana: 'B.

Keuntungan dari metode ini adalah jika karena alasan tertentu Anda membagi panel Anda lebih dari sekali dan tidak ada logika yang jelas untuk bertukar sekitar, seperti jika Anda ingin menukar panel pada jam 12 dan 7, Anda bisa ' t hanya memutar jendela tetapi Anda dapat dengan mudah menukar buffer.

Chan Youn
sumber
0

Anda dapat menukar buffer antara dua jendela dengan fungsi berikut:

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>

Sekarang, paling sering, menukar buffer secara teknis akan bertindak seperti menukar jendela. Karena Anda tidak secara manual melacak windows, Anda melacak window mana yang menahan buffer. Jadi, fungsi di atas akan membantu Anda untuk sebagian besar situasi.

klaus
sumber