Wie tausche ich Dateien zwischen Fenstern in VIM aus?

123

Wenn ich mit VIM arbeite, sind immer mehrere Fenster sichtbar. Manchmal möchte ich eine einfache Möglichkeit haben, diese Fenster stellenweise auszutauschen. Gibt es ein Plugin, ein Makro usw., um dies zu vereinfachen? Übrigens benutze ich MiniBufExplorer.

mdrozdziel
quelle
2
Mit "Vertauschen dieser Fenster an bestimmten Stellen" meinen Sie "Öffnen des Puffers in Fenster A in Fenster B und umgekehrt, ohne die Position der Fenster zu ändern"?
hcs42
1
Ja, genau das will ich.
Mdrozdziel

Antworten:

304

Es sind einige nützliche Befehle eingebaut, die Ihnen ein gewisses Maß an Kontrolle geben, aber nicht umfassend sind. Die wichtigsten sind:

  • Ctrl- W, r(dh halten CTRL, drücken W, loslassen CTRL, drücken r) - das die Fenster dreht (Das erste Fenster wird das zweite, das zweite wird das dritte usw.)

  • Ctrl- W, x- tausche das aktuelle Fenster gegen das nächste aus

  • Ctrl- W, Shift- H- Verschiebe dieses Fenster ganz nach links

  • Ctrl- W, Shift- K- verschieben Sie dieses Fenster nach oben

(und ähnlich für Ctrl- W, Shift- Jund Ctrl- W, Shift- L). Sehen:

:help window-moving

für mehr Informationen.

DrAl
quelle
16
Dies sollte die "beste Antwort" sein - native Funktionalität, kein benutzerdefiniertes Vimscript.
David Rivers
1
Nicht ganz, nein. Es gibt viele Anwendungsfälle, die mit der integrierten Fensterverwaltung nicht durchgeführt werden können, ohne Fenster zu zerstören und neu zu erstellen. Das Swap-Puffer-Skript ermöglicht diese Anwendungsfälle.
Bobpaul
Beachten Sie, dass ctl-w auch funktioniert. ctl-W schließt Fenster in einigen Terminalemulatoren.
Datakid
7

Ich habe das folgende Code-Snippet in meinem vimrc zum Kopieren und Einfügen meiner Vim-Fenster geschrieben und verwendet.

Dies definiert beispielsweise die folgenden Verknüpfungen:

  • <c-w>y: "Yanks the window", dh speichert die Nummer des Puffers im aktuellen Fenster in einer globalen Variablen.
  • <c-w>pp: "Setzt das Fenster an die Stelle des aktuellen Fensters", dh es liest die zuvor gespeicherte Puffernummer und öffnet diesen Puffer im aktuellen Fenster. Es speichert auch die Nummer des Puffers, der sich früher im aktuellen Fenster befand.

Wenn Sie mit "Fenster an bestimmten Stellen austauschen" "Öffnen des Puffers in Fenster A in Fenster B und umgekehrt, ohne die Position der Fenster zu ändern" meinen, können Sie die Fenster mit der folgenden Tastatursequenz austauschen:

  1. Fenster A auswählen (entweder mit der Maus oder mit Tastaturbefehlen)
  2. Drücken Sie <c-w>y(zerren die Puffernummer)
  3. Fenster B auswählen
  4. Drücken Sie <c-w>pp(Puffer einfügen)
  5. Fenster A auswählen
  6. Drücken Sie <c-w>pp(Puffer erneut einfügen)

Es funktioniert nur in 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
hcs42
quelle
4

Etwa zur gleichen Zeit stellte ich eine ähnliche Frage : Ich wollte eine Möglichkeit, Fenster gezielt auszutauschen, ohne ein willkürlich kompliziertes Layout zu ändern. Am Ende habe ich aus einer der vorgeschlagenen Lösungen ein Vim-Plugin erstellt. Es heißt WindowSwap.vim ; Installieren Sie es mit Ihrem bevorzugten vim Plugin Manager und geben Sie ihm einen Wirbel.

Mit WindowSwap.vim würden Sie einfach

  1. <Leader>yw ein Fenster ziehen.
  2. Bewegen Sie den Cursor in ein anderes Fenster.
  3. <Leader>pw Um dieses Fenster einzufügen, tauschen Sie es mit der Position des ersten aus.

Die Tastenkombinationen können natürlich nach Ihren Wünschen konfiguriert werden.

wir s
quelle
1

Als <c-w>roder <c-w>xhat eine Einschränkung, dass Sie Fenster nicht drehen oder austauschen können, wenn vertikale und horizontale Fensteraufteilungen gemischt werden. Und <c-w>Hmöglicherweise ändert sich das Fensterlayout über Ihre Erwartungen hinaus, insbesondere wenn Sie viele Fenster haben.

Sie können also einige Arbeiten ausführen, um Ihre speziellen Anforderungen an die Fenster- / Pufferumschaltung zu erfüllen. Hier ist ein Beispiel für das Umschalten des aktuellen Fensters mit dem oberen linken Fenster (normalerweise mache ich es vertikal maximiert):

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>
Bohr
quelle
1

Meiner Meinung nach hat http://vimcasts.org/episodes/working-with-windows/ die perfekte Antwort auf diese Frage. In Kürze:

  • ctrl-w w Zyklus zwischen den geöffneten Fenstern
  • ctrl-w h fokussiere das Fenster nach links
  • ctrl-w j Fokussieren Sie das Fenster nach unten
  • ctrl-w k fokussiere das Fenster nach oben
  • ctrl-w l fokussiere das Fenster nach rechts
  • ctrl-w r Alle Fenster drehen
  • ctrl-w x aktuelles Fenster mit seinem Nachbarn austauschen
  • ctrl-w H Verschieben Sie das aktuelle Fenster ganz nach links
  • ctrl-w J Verschieben Sie das aktuelle Fenster nach unten
  • ctrl-w K Verschieben Sie das aktuelle Fenster nach oben
  • ctrl-w L Verschieben Sie das aktuelle Fenster ganz nach rechts
Aman Dogra
quelle
3
Was ist der Grund für das Hinzufügen einer Antwort, die keine neuen nützlichen Informationen in den Beitrag bringt? Dies wurde vor 6 Jahren perfekt beantwortet. Machst du eine Werbekampagne für Vimcasts?
Mdrozdziel
@mdrozdziel Ich schätze diese Antwort 9 Jahre nach dem OP. Die prägnanteste Antwort mit nur den Informationen, die ich wollte.
Roro