Scambia la posizione di due finestre


29

Di 'quanto segue è l'attuale struttura della mia finestra:

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

L'ordine di A e B non è del tutto naturale. Sarebbe meglio se B fosse in cima.

Tuttavia, se vado <C-w>K, B sarà la cima di tutte le finestre, che non è quello che voglio. Come posso mettere B sopra A, ma non sopra qualsiasi altra finestra che è già sopra A?

E se due finestre sono divise verticalmente, come posso cambiarle per dividerle orizzontalmente?


7
Questo post spiega come ruotare Windows. Si tratta di cambiare le divisioni da verticale a orizzontale.
lcd047,

@ lcd047 Quelle sono domande al di fuori di questo sito. Vale la pena scrivere una piccola risposta qui e includere i collegamenti (che sono preziosi)?
Bernhard,

1
@ Bernardo Suppongo che questa sia una buona domanda per meta .
lcd047,

1
@ Bernhard . Assicurati di scrivere una risposta completa, non solo i link.
Gilles 'SO- smetti di essere malvagio' il

1
Quindi, per favore, spiega cosa stai cercando di fare e perché le due risposte che ti ho indicato per non affrontare il problema.
lcd047,

Risposte:


33

Per scambiare le due parti di una finestra divisa semplicemente: <C-w> <C-r>


Potrei sbagliarmi, ma la tua soluzione ruota le finestre, quindi con più di 2 divisioni il risultato non sarà quello che OP stava cercando.
statox

Hai assolutamente ragione. L'OP stava cercando il s.th. più complicato di "scambiare le due parti di una finestra divisa".
modesto

In realtà OP sta cercando un comando per scambiare due finestre divise, ma la tua soluzione ruota tutte le finestre divise correnti. Come indicato in :h CTRL-W_CTRL-R: The second window becomes the first one, the third one becomes the second one, etc.Quindi se hai 3 divisioni, il cursore su quello in basso e premi <c-w><c-r>la 3a finestra sarà in cima alle altre 2 che non è quello che OP stava chiedendo:How can I put B above A, but not above any other window that is already above A?
statox

6

Per scambiare windowposizioni, l'effetto equivale a scambiare i buffer mostrati da queste due finestre.
Ad esempio, se la finestra A ha il buffer 2 e la finestra B ha il buffer 8, ti consigliamo di andare alla finestra A, selezionare il buffer 8, quindi alla finestra B, selezionare il buffer 2.

Questa idea mi ha ispirato a scriverla - ed è già presente anche nella mia cassetta degli attrezzi

Codice funzione:

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. Seleziona la finestra A
  2. Seleziona la finestra B
  3. :call WinBufSwap()
    Ciò scambia i buffer nelle due finestre preselezionate, lasciando il cursore nella finestra originale.

La selezione delle due finestre desiderate da scambiare in anticipo è il dettaglio chiave, in quanto è necessario specificare per Vim con quali lavorare.


Solo una precisione, quando dici "seleziona la finestra A, quindi B", intendi "Concentrati su A, quindi su B, per contrassegnare l'ordine degli ultimi buffer e finestre visti, per scambiare correttamente? Oppure?" seleziona "intendi qualcos'altro oltre a" concentrati su "?
padawin

Sì, esattamente: sto usando "select" come "focus on".
Cometsong,

6
CTRL-W x scambia la finestra corrente con la finestra N
                   (impostazione predefinita: finestra successiva)

( index.txtsezione 2.2, "Comandi della finestra")

Se A è la finestra corrente, la successiva sarà B, quindi è sufficiente <C-w> x

Se B è la finestra corrente (e ci sono più finestre in basso), devi prima andare su A, quindi scambiare: <C-w> k <C-w> x


4

Un'altra alternativa allo scambio di finestre o allo scambio dei buffer, è quella di contrassegnare le posizioni (usando i segni maiuscoli ) nei tuoi file e aprire quei segni nelle finestre di tua scelta.

Ad esempio se ho due file, file_A e file_B :

  • Vorrei andare alla finestra con file_A e contrassegnarlo:mA
  • vai alla finestra con file_B e contrassegnalo:mB
  • Quindi recuperare il segno di file_A in quella finestra:'A
  • poi tornare alla prima finestra a prendere il segno di file_B in là: 'B.

Il vantaggio di questo metodo è che se per qualche motivo dividi il riquadro più di una volta e non esiste una logica chiara per scambiarli, come se desideri scambiare i riquadri alle 12 e alle 7, puoi " È sufficiente ruotare le finestre ma è possibile scambiare facilmente i buffer.


0

È possibile scambiare i buffer tra due finestre con la seguente funzione:

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>

Ora, molto spesso, lo scambio dei buffer funzionerà tecnicamente come lo scambio di finestre. Poiché non si tiene traccia manualmente di Windows, si tiene traccia di quale finestra contiene quale buffer. Quindi, la funzione sopra ti farà passare per la maggior parte delle situazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.