364 Stimmen

Wie kann ich die Positionen von zwei geöffneten Dateien (in Splits) in Vim vertauschen?

Angenommen, ich habe eine beliebige Anordnung von Splits in Vim.

____________________
| one       | two  |
|           |      |
|           |______|
|           | three|
|           |      |
|___________|______|

Gibt es eine Möglichkeit zum Tausch von one y two und das gleiche Layout beibehalten? In diesem Beispiel ist es einfach, aber ich suche nach einer Lösung, die für komplexere Layouts hilfreich ist.

UPDATE:

Ich denke, ich sollte mich klarer ausdrücken. Mein vorheriges Beispiel war eine Vereinfachung des tatsächlichen Anwendungsfalls. Mit einer tatsächlichen Instanz: alt text

Wie kann ich zwei beliebige dieser Splits austauschen, ohne dass das Layout verändert wird?

Aktualisieren! Mehr als 3 Jahre später...

Ich habe sgriffin's Lösung in ein Vim-Plugin gepackt, das Sie mit Leichtigkeit installieren können! Installieren Sie es mit Ihrem bevorzugten Plugin-Manager und probieren Sie es aus: WindowSwap.vim

a little demo

345voto

nelstrom Punkte 17922

Damit fangen wir an:

____________________
| one       | two  |
|           |      |
|           |______|
|           | three|
|           |      |
|___________|______|

Machen Sie "drei" zum aktiven Fenster und geben Sie dann den Befehl ctrl + w J . Dadurch wird das aktuelle Fenster so verschoben, dass es den unteren Rand des Bildschirms ausfüllt, so dass Sie nur noch einen Platz haben:

____________________
| one       | two  |
|           |      |
|___________|______|
| three            |
|                  |
|__________________|

Machen Sie nun entweder 'eins' oder 'zwei' zum aktiven Fenster und geben Sie dann den Befehl ctrl + w r . Dadurch werden die Fenster in der aktuellen Reihe "gedreht", so dass Sie mit:

____________________
| two       | one  |
|           |      |
|___________|______|
| three            |
|                  |
|__________________|

Machen Sie nun 'zwei' zum aktiven Fenster und geben Sie den Befehl ctrl + w H . Dadurch wird das aktuelle Fenster so verschoben, dass es die linke Seite des Bildschirms ausfüllt, so dass Sie einen freien Platz haben:

____________________
| two       | one  |
|           |      |
|           |______|
|           | three|
|           |      |
|___________|______|

Wie Sie sehen können, ist das Manöver ein ziemliches Hin und Her. Mit 3 Fenstern ist es ein bisschen wie eines dieser "Kachelspiele". Wenn Sie 4 oder mehr Fenster haben, empfehle ich Ihnen nicht, dies zu versuchen - es ist besser, sie zu schließen und dann an den gewünschten Positionen wieder zu öffnen.

Ich habe einen Screencast erstellt, der Folgendes zeigt wie man mit geteilten Fenstern in Vim arbeitet .

237voto

sgriffin Punkte 2533

Ich bin ein bisschen spät dran, aber ich habe das hier gefunden, als ich nach etwas anderem gesucht habe. Ich schrieb zwei Funktionen eine Weile zurück, um ein Fenster zu markieren und dann Puffer zwischen Windows zu tauschen. Dies scheint zu sein, was Sie für fragen.

Fügen Sie diese einfach in Ihre .vimrc ein und ordnen Sie die Funktionen zu, wie Sie es für richtig halten:

function! MarkWindowSwap()
    let g:markedWinNum = winnr()
endfunction

function! DoWindowSwap()
    "Mark destination
    let curNum = winnr()
    let curBuf = bufnr( "%" )
    exe g:markedWinNum . "wincmd w"
    "Switch to source and shuffle dest->source
    let markedBuf = bufnr( "%" )
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' curBuf
    "Switch to dest and shuffle source->dest
    exe curNum . "wincmd w"
    "Hide and open so that we aren't prompted and keep history
    exe 'hide buf' markedBuf 
endfunction

nmap <silent> <leader>mw :call MarkWindowSwap()<CR>
nmap <silent> <leader>pw :call DoWindowSwap()<CR>

Um sie zu verwenden (vorausgesetzt, Ihr Mapleader ist auf \ eingestellt), müssten Sie:

  1. Bewegen Sie sich zu dem Fenster, das Sie für den Tausch markieren möchten, über ctrl-w Bewegung
  2. Typ \mw
  3. Gehen Sie zu dem Fenster, das Sie austauschen möchten
  4. Typ \pw

Voilà! Vertauschte Puffer, ohne das Fensterlayout durcheinander zu bringen!

115voto

Randy Morris Punkte 37931

Werfen Sie einen Blick auf :h ctrl-w_ctrl-x und/oder :h ctrl-w_ctrl-r . Mit diesen Befehlen können Sie Fenster im aktuellen Layout austauschen oder rotieren.

Edit: Eigentlich funktioniert das in dieser Situation nicht, weil nur die aktuelle Spalte oder Zeile ausgetauscht wird. Sie könnten stattdessen zu jedem der Fenster gehen und den Zielpuffer auswählen, aber das ist ziemlich umständlich.

41voto

Mike Seplowitz Punkte 8897

Randy's insofern richtig, als CTRL-W x will keine Fenster austauschen, die sich nicht in derselben Spalte/Zeile befinden.

Ich habe festgestellt, dass die CTRL-W HJKL Tasten sind vor allem bei der Bedienung von Windows nützlich. Sie zwingen das aktuelle Fenster aus seiner aktuellen Position heraus und weisen es an, den gesamten Rand zu belegen, der durch die Richtung der gedrückten Taste angegeben ist. Siehe :help window-moving für weitere Einzelheiten.

Wenn Sie in Ihrem obigen Beispiel in Fenster "eins" beginnen, bewirkt dies, was Sie wollen:

CTRL-W K   # moves window "one" to be topmost,
           #   stacking "one", "two", "three" top to bottom
CTRL-W j   # moves cursor to window "two"
CTRL-W H   # moves window "two" to be leftmost,
           #   leaving "one" and "three" split at right

Der Einfachheit halber können Sie die benötigten Sequenzen Tastenzuordnungen zuordnen (siehe :help mapping ).

11voto

Pencilcheck Punkte 2476

Ich habe eine leicht verbesserte Version von sgriffin's Lösung, man kann Windows austauschen ohne zwei Befehle zu benutzen, aber mit intuitiven HJKL-Befehlen.

Und so geht's:

function! MarkWindowSwap()
    " marked window number
    let g:markedWinNum = winnr()
    let g:markedBufNum = bufnr("%")
endfunction

function! DoWindowSwap()
    let curWinNum = winnr()
    let curBufNum = bufnr("%")
    " Switch focus to marked window
    exe g:markedWinNum . "wincmd w"

    " Load current buffer on marked window
    exe 'hide buf' curBufNum

    " Switch focus to current window
    exe curWinNum . "wincmd w"

    " Load marked buffer on current window
    exe 'hide buf' g:markedBufNum
endfunction

nnoremap H :call MarkWindowSwap()<CR> <C-w>h :call DoWindowSwap()<CR>
nnoremap J :call MarkWindowSwap()<CR> <C-w>j :call DoWindowSwap()<CR>
nnoremap K :call MarkWindowSwap()<CR> <C-w>k :call DoWindowSwap()<CR>
nnoremap L :call MarkWindowSwap()<CR> <C-w>l :call DoWindowSwap()<CR>

Versuchen Sie, Ihr Fenster zu verschieben, indem Sie die große HJKL in normalen Knoten, es ist wirklich cool :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X