Duplikuj bufor do nowej karty zamiast go przenosić

10

Często chcę tymczasowo zmaksymalizować bufor na stronie zakładki, a następnie wrócić do starej konfiguracji bufora, na którą patrzyłem. Mój obecny proces roboczy polegający na robieniu czegoś takiego to albo zamknięcie wszystkich innych buforów za pomocą, <c-w>oalbo przeniesienie bufora, którego aktualnie szukam, na własną kartę <c-w>T. Problem z drugim podejściem polega na tym, że usuwa on bufor ze strony oryginalnej karty.

I wypełnić trzy pliki a.txt, b.txti c.txtz a, bi codpowiednio.

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

Kiedy otwieram wszystkie trzy z tych plików na jednej stronie karty, otrzymuję następujące informacje.

wprowadź opis zdjęcia tutaj

Następnie mogę a.txtsamodzielnie przejść do zakładki. Kiedy to zrobię, zostanie jednak a.txtusunięty ze strony oryginalnej karty. (Więc byłoby to po <c-w>Tgt)

wprowadź opis zdjęcia tutaj

Chciałbym mieć możliwość wyboru w tym momencie, kiedy naciskałbym, <c-w>Taby zachować zawartość oryginalnego bufora, utworzyć nową stronę z zakładkami zawierającymi tylko bufor, który jest aktualnie skoncentrowany, a następnie skoncentrować się na nowej stronie, którą właśnie wybrałem Utworzony. Innymi słowy, polecenie prawie tak samo, <c-w>Tz tym wyjątkiem, że oryginalna strona z zakładkami jest zachowana i teraz a.txtznajduje się na dwóch stronach z zakładkami.

Czy jest na to sposób?

Gregory Nisbet
źródło

Odpowiedzi:

13

Nie jestem pewien, ale możesz spróbować :tab split(lub krótsza wersja :tab sp).

:splitKomenda powinna powielać rzutnię wyświetlania a.txt, natomiast :tabmodyfikator należy przenieść tę rzutnię w dedykowanej zakładce.


Jeśli chcesz zmienić zachowanie C-w T, możesz zmienić mapowanie w następujący sposób:

nnoremap <C-w>T :tab split<CR>

Mówiąc bardziej ogólnie, za każdym razem, gdy znajdziesz polecenie, które dzieli okno i wolisz, aby zamiast tego tworzyło nową stronę z kartami, możesz je poprzedzić :tab.

Można go na przykład użyć do odczytania bufora pomocy na stronie nowej karty:

:tab help {your_topic}

Domyślnie strona nowej karty pojawi się po bieżącej. Ale jeśli chcesz, aby pojawił się gdzie indziej, możesz poprzedzić :tabgo liczbą.

Na przykład, aby powielić bieżącą rzutnię na stronie zakładki po trzeciej, możesz wpisać:

:3tab split

I żeby pojawił się jako pierwszy:

:0tab split

Aby uzyskać więcej informacji, możesz przeczytać :h :tab:

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one
użytkownik9433424
źródło
2

Głównie unikałem tabulatorów z powodu tego problemu, ale teraz mam funkcję, która ma takie zachowanie duplikacji tabulatorów, jakie chcę. Przetestowałem to, ale nie zacząłem używać go na poważnie. Może występować ukryta wada tego przepływu pracy.

Jednym z problemów związanych z funkcją jest to, że nie powiela ona niektórych stanów z poprzedniej pary bufor-okno (np. Czy set numberjest włączona, czy nie). Spekulując trochę, c-w Tprawdopodobnie nie ma tego problemu, ponieważ duplikacja nie jest wykonywana, a okno prawdopodobnie jest po prostu ponownie widoczne.

Vim ma kilka list opartych na 1, takich jak bufory, karty i okna. O ile mi wiadomo, są one oparte na 1, ponieważ 0klawisz służy do przejścia na początek linii, w wyniku czego przekazanie zera jako argumentu liczbowego jest niemożliwe.

Dbamy o trzy listy do emulacji tej funkcjonalności:

  • Globalna lista stron kart
  • Lista okien [strona zakładki]
  • Globalna lista buforów

Zapisujemy wszystkie te wartości, a następnie tworzymy nową kartę za pomocą „tabnew”. Nowe karty są zawsze tworzone po prawej stronie, więc żaden z indeksów pod kartą, z którego tabnewpochodzimy, nie jest unieważniony. (Bardziej solidny sposób na zrobienie tego prawdopodobnie byłby jednak lepszy).

tabnewPolecenie przenosi również fokus na nowej karcie i jednym oknie w nim. Stamtąd możemy użyć bufferpolecenia, aby utworzyć widok na bufor, który pierwotnie był aktywny.

Następnie używamy zapisanego indeksu oryginalnej karty, aby przywrócić fokus z powrotem do tej karty. A potem, głównie z powodu paranoi, skupiliśmy się na tej zakładce na oryginalnym oknie. Wydaje się, że Vim pamięta, które okno ma fokus w niewidocznych zakładkach, ale nie lubię na tym polegać.

(Kilka punktów stylistycznych: jawna konwersja liczbowa 0+, zmienne globalne i twierdzenia są celowe)

function! TabDuplicate()
  " set vars, sanity checking
  let g:tabdup_win      = 0+ winnr()
  let g:tabdup_buf      = 0+ bufnr('%')
  let g:tabdup_tabpage  = 0+ tabpagenr()
  call assert_true(g:tabdup_win > 0)
  call assert_true(g:tabdup_buf > 0)
  call assert_true(g:tabdup_tabpage > 0)
  " make a new tab page,
  " the new tab page will have focus
  " none of the indices, which are all
  " less than the current index, are
  " invalidated by creating a new tab
  execute "tabnew"
  " visit the buffer we saved
  execute "buffer " . g:tabdup_buf
  " return to the original tab page
  execute "tabnext " . g:tabdup_tabpage
  " return focus to original window
  execute g:tabdup_win . " windcmd w"
endfunction
Gregory Nisbet
źródło