Czy istnieje sposób niezawodnego przeglądania historii plików

15

Chciałbym przejść do pliku, który właśnie edytowałem ostatni i następny rodzaj, jak wtyczki MRU.

:bnexti :bprevczasem działa, ale najczęściej kończę w jakimś niejasnym pliku, którego nie pamiętam i zmuszony jestem wrócić do wtyczki MRU.

Czy istnieje sposób, aby to naprawić?

Ctrl-^zamienia między dwoma ostatnimi plikami. Jaki jest najlepszy sposób na nawigację między więcej?

Rozumiem, że może to być trudne, ale zgadzam się na wszystko, co może poprawić obecne :bn :bpzachowanie. Bufory, które często widzę, są zupełnie nie na miejscu. Może istnieje wtyczka, która może śledzić najnowsze pliki i zapewniać zaczepki, dzięki czemu mogę tworzyć mapowania?

Odpowiadanie na komentarze nieco oczyściło moje myśli. Wierzę, że chcę, aby móc przenosić pliki w kolejności najnowszych zapisów. W ten sposób, jeśli wrócę do historii, kolejność nie zmieni się, dopóki nie zapiszę pliku, który następnie staje się ostatni i nie zrobię kroku wstecz do pliku zapisanego tuż przed nim, tj. Od tego, od którego zacząłem.

Coś w rodzaju Ctrl-O Ctrl-Ipary, która natychmiast przełącza pliki bez przeskakiwania bieżącego bufora. Coś jak ui Uw sieci:

   u    Change to recently-visited directory                 |netrw-u|
   U    Change to subsequently-visited directory             |netrw-U|
firedev
źródło
Przez „plik, który ostatnio edytowałem” masz na myśli dosłownie „plik, który ostatnio edytowałem”? A może masz na myśli ostatnią, którą widziałeś w Vimie?
Bogaty
2
Jeśli to drugie, osobiście po prostu zacieram Ctrl-O(lub czasami Ctrl-T), aż tam dotrę.
Bogaty
Tak, to też robię Ctrl-Oi Ctrl-I. Ale przeskakuje między punktami edycji i przerywa przepływ. Chcę tylko przechodzić między buforami w kolejności dostępu. W jaki sposób wtyczki wyświetlają listę najnowszych plików? Czy śledzą je wewnętrznie?
firedev
Ctrl-^zamienia między dwoma ostatnimi plikami. Ale jaki jest najlepszy sposób na nawigację między kolejnymi?
firedev
Przez dostęp nadal nie jest jasne, czy masz na myśli kolejność, w jakiej zostały otwarte, zapisane, w skoncentrowanym oknie lub zmienione. Ctrl-O/Isą oknami specyficznymi dla okna, podczas gdy MRU jest zwykle globalny. Jeśli chcesz uporządkować według ostatniego dostępu, gdy tylko cofniesz się raz, kolejność listy zmienia się, co jeszcze bardziej komplikuje sytuację.
Matt Boehm,

Odpowiedzi:

7

Napisałem małą funkcję, aby kilkakrotnie nacisnąć CTRL-O dla mnie, dopóki bufor się nie zmieni.

Możesz go znaleźć tutaj . Odwzorowałem to na CTRL-U, ale możesz zastąpić CTRL-O, jeśli chcesz.

function! GoBackToRecentBuffer()
  let startName = bufname('%')
  while 1
    exe "normal! \<c-o>"
    let nowName = bufname('%')
    if nowName != startName
      break
    endif
  endwhile
endfunction

nnoremap <silent> <C-U> :call GoBackToRecentBuffer()<Enter>

Prawdopodobnie mógłbyś napisać coś podobnego <C-I>.

Problemy:

  • Jeśli nie ma wcześniejszego bufora, będzie on nadal dyskretnie zapętlał, dopóki nie naciśniesz CTRL-C!

Związane z:

  • :jumps wymienia historyczne lokalizacje, przez które CTRL-O się cofnie.
  • Domyślna CTRL-T Vima jest dobrą alternatywą dla zacierania CTRL-O, ponieważ jest gruboziarnista: przesuwa się tylko poprzez skoki znaczników.
joeytwiddle
źródło
Wydaje się, że Vim oferuje tylko jeden poziom historii plików MRU, ujawniony na CTRL- ^. Zauważyłem jednak, gdy przy :kwbdzamykaniu kilku buforów Vim cofał się do poprzednich buforów w oczekiwanej kolejności wstecznej. Być może Vim ma listę MRU, której nie dzieli się z nami, a może wybiera bufor, do którego ma wrócić, na podstawie historii lokalizacji CTRL-O ( :jumps).
joeytwiddle
1
Alternatywnie, autocmd InsertLeave * normal mZbędzie pamiętał ostatni plik edytowane w globalnej znak Z . Możesz wrócić do tego za pomocą g'Z. // Mam, nmap <C-y> g'Zale nadal częściej używam Ctrl-U.
joeytwiddle
6

Możesz użyć, :lsaby wyświetlić wszystkie bufory. Na przykład:

:ls
  1      "vim.markdown"                 line 160
  2      "ext.markdown"                 line 0
  3 #    "~/to"                         line 1
  4 %a   "~/TODO"                       line 68

Aby wrócić do bufora ext.markdown, użyj :e +Nbuf, gdzie Njest numerem bufora z pierwszej kolumny. Na przykład: :e +2buf.

Możesz stworzyć prostą funkcję zapewniającą bardziej interaktywne wrażenia:

fun! ChooseBuf()
    redir => buffers
        silent ls
    redir end

    echo l:buffers
    let l:choice = input('Which one: ')
    execute ':edit +' . l:choice . 'buf'
endfun
command! ChooseBuf call ChooseBuf()
nnoremap <Leader>b :call ChooseBuf()<CR>

Po użyciu :ChooseBuflub <Leader>bmożesz po prostu wpisać numer bufora, który chcesz edytować.

Nie jest to do końca „ostatnio używane”, ponieważ zamówienie jest „ostatnio otwarte” (prawdopodobnie jest to również powód :bnext/ :bprevbrak działania zgodnie z oczekiwaniami).

Martin Tournoij
źródło
4

<C-6>to, czego potrzebujesz, to zabierze Cię z powrotem do poprzedniego bufora, który miałeś otwarty przed bieżącym. Są też :bprevi :bnextktórych możesz użyć do tego samego.

Dhruva Sagar
źródło
<C-6>nie jest źle, ale nie mogę tego użyć do przeskoczenia dwóch buforów. bprevi bnextnie są w kolejności skoków.
Praxeolitic,
Tak, nie sądzę, aby istniał dobry sposób na głębsze zapoznanie się z historią. Musiałbyś użyć wtyczki MRU, nawet CtrlP ma taką, muszą być inne
Dhruva Sagar
2
Uwaga: to nie jest <C-6>, to jest <C-^>. Podczas gdy w wielu emulatorach terminali nie ma rozróżnienia, w niektórych (w tym w tym, które są dostarczane z OS X), istnieje. W drugim przypadku Shiftwymagane jest użycie klucza (przy założeniu układu Qwerty).
tommcdo
@tommcdo ciekawe, jestem na OSX, ale używaj iterm zamiast terminal.app, działa to samo dla mnie. Wymaganie na nim klawisza Shift byłoby bummer.
Dhruva Sagar
Pomyśl o tym, być może mój system operacyjny pobiera to powiązanie klucza i nie propaguje go w Vimie. Mój system operacyjny musi zostać zatrzymany!
tommcdo
2

Możesz także użyć, :oldfilesaby uzyskać listę edytowanych plików.

Lista będzie miała numery związane z nazwami plików. Wybierz plik, zanotuj numer (powiedzmy 14) i otwórz go za pomocą:edit #<14

Możesz także uruchomić inne polecenia z tego pliku lub przekazać wiele plików do polecenia jednocześnie. Więcej o tym TUTAJ

Karolis Koncevičius
źródło
1
Inna odpowiedź w linku nauczył mnie:bro[wse] ol[dfiles][!]
Steve