Przenieś istniejące okno do istniejącej karty

14

Czasami muszę przenieść okna do już istniejącej karty i zastanawiałem się, czy może to zrobić skrót poleceń / klawiatury. Wiem, że mogę zamknąć okno, przejść do zakładki, a następnie otworzyć ją w nowym podziale, ale zastanawiałem się, czy istnieje krótszy sposób na osiągnięcie tego. Pamiętaj, że chcę przenieść go na istniejącą kartę, a nie nową, jak to <C-w>Trobi.

Wiecznie zielone drzewo
źródło
Nie można przenosić okien między kartami.
lcd047
Hmm, to źle. Prawdopodobnie mógłbym stworzyć jakieś mapowanie lub polecenie, które by to mogło zrobić.
EvergreenTree,
Myślę, że najlepsze, co możesz zrobić, to zapisać wszystkie ustawienia okna, a następnie odtworzyć je na istniejącej karcie.
tommcdo

Odpowiedzi:

10

Chociaż istnieją polecenia do przenoszenia istniejących okien na bieżącej stronie karty (tj. Wpływają na układ okna poprzez obracanie, zmianę rozmiaru i przesuwanie), nie ma poleceń, aby przenieść okno na inną kartę.

Ponieważ okno to tylko rzutnia do załadowanego bufora, musisz:

  1. Zanotuj numer bufora wyświetlany w bieżącym oknie.
  2. :close! okno.
  3. Przejdź do istniejącej strony zakładki docelowej.
  4. :sbuffer numer bufora, aby go ponownie otworzyć.

Przez to stracisz wszelkie opcje specyficzne dla okna. Możesz również zapisać i przywrócić je w skrypcie.

Ingo Karkat
źródło
Uznałem, że tak jest. Prawdopodobnie mógłbym napisać mały skrypt, który właśnie to robi.
EvergreenTree
2
  1. przejdź do istniejącej zakładki docelowej
  2. podziel to, jak chcesz
  3. :b ab(wypełnij resztę tabulatorem)

abto tylko losowe litery, zamień na początek żądanej nazwy pliku. :buzupełnianie tabulatorów działało dla mnie bardzo dobrze, zwykle może znaleźć odpowiedni bufor źródłowy na podstawie tylko jednej litery i 1-2 Tabnaciśnięć klawiszy.

Zaletą tego podejścia w porównaniu do Ingo jest brak zauważania lub zapamiętywania czegokolwiek, co oznacza mniejsze obciążenie poznawcze. Nazwa pliku i tak już znasz.

lkraav
źródło
2

Dwa zdefiniowane poniżej polecenia przenoszą wszystkie bufory z zakładki po prawej do bieżącej, a następnie zamykają zakładkę po prawej. Mtabspprzesuwa je, dzieląc poziomo i dzieląc Mtabvsppionowo. Przed użyciem poleceń należy przenieść scaloną kartę. Użyj +tabm, -tabmlub <n>tabm.

Ustawiać

Dodaj poniższy skrypt vim do vimrc:

function! Mtab(vert)
    if tabpagenr() == tabpagenr("$")
        return 0
    endif
    +tabnext
    let s:killed_tab = tabpagenr()
    let s:buf_list = tabpagebuflist()
    -tabnext
    for item in s:buf_list
        if a:vert
            vsp
        else
            sp
        endif
        execute "buf " . item
    endfor
    execute "tabclose " . s:killed_tab
endfunction

command! Mtabsp call Mtab(0)
command! Mtabvsp call Mtab(1)

Szczegóły techniczne

Funkcja Mtab otrzymuje jeden parametr vert. Określa, czy bieżąca karta jest podzielona poziomo czy pionowo.

Pożądany rezultat osiąga się, wykonując następujące kroki:

  1. Tymczasowo przechodzimy do następnej karty
  2. Użyj dwóch zmiennych, aby odwołać się do numeru karty i buforów
  3. Wróć do bieżącej karty
  4. Rozdzielamy kartę i otwieramy każdy bufor
  5. Na koniec zamykamy prawą kartę

Jeśli nasza bieżąca karta jest ostatnia, polecenia są ignorowane.

evpo
źródło
1

Jeśli jest to bufor plików (nie działa dla buforów scratch itp.), Możesz:

  1. :let @f=@%ENTER - w oknie źródłowym;
    • Zastępuje to zawartość zwykłego rejestru f zawartością specjalnego rejestru % , który zawiera bieżącą nazwę pliku.
    • Uwaga: wybrałem rejestr f jak w pliku , ale możesz użyć dowolnego innego rejestru.
    • Możesz sprawdzić, czy rejestr zawiera poprawną ścieżkę za pomocą: :echo @f
  2. Opcjonalnie: Ctrl-WCtrl-Q- aby zamknąć stare okno;
  3. gt/ gT- przejdź do zakładki docelowej (i okna);
  4. Ctrl-Ws - podziel kartę w dowolny sposób, aby otworzyć nowe okno;
  5. :e␣Ctrl-RfENTER
    • w nowo otwartym oknie ładuje plik ze ścieżki zapisanej w rejestrze f ;
    • Uwaga: tutaj znak here oznacza zwykłą spację.

Ważna uwaga: ostatni krok nie będzie działał poprawnie, jeśli ścieżka zawiera spacje lub niektóre znaki specjalne! :-( Aby obejść ten problem, następujące, nieco dłuższe polecenie powinno działać w przypadku ścieżek ze spacjami (chociaż może się nie powieść w przypadku niektórych innych znaków specjalnych):

  • :e␣"Ctrl-Rf"ENTER

(to znaczy cytuje wynik Ctrl-R, f )

Zainspirowany odpowiedziami Lkraav i Ingo-Karkat .

akavel
źródło
To fantastyczne, muszę skonfigurować mapowanie dla „wycinania i wklejania” systemu Windows do kart.
dragon788