Jaki jest bardziej wydajny sposób korzystania z buforów?

13

Ostatnio drastycznie zmniejszam liczbę wtyczek, których używam, więc szukam odpowiedzi za pomocą tylko wbudowanych funkcji Vima.

Podczas edytowania wielu buforów zauważyłem błąd w przepływie pracy: korzystam z bufora i chcę przejść na inny, z którego nie pamiętam nazwy i który nie jest alternatywnym buforem . Tak więc używanie :b#nie jest możliwe, a używanie uzupełniania za pomocą polecenia również :bnie jest wygodne.

Aby to zrobić, wykonałem następujące czynności:

  • Najpierw użyj, :buffersaby uzyskać listę otwartych buforów
  • Zapamiętaj numer bufora, którego chcę użyć
  • Naciśnij, Enteraby zamknąć listę buforów
  • Użyj :bXz Xnumerem używanego bufora.

Ten przepływ pracy wydawał mi się dość ciężki, dlatego dodałem następujące wiersze do mojego .vimrc:

" Improve the navigation in the buffers 
nnoremap <Leader><S-b> :B<CR> 
command! B call Buffers() 

function! Buffers() 
    execute "buffers" 
    let buffer=input("Enter a buffer:") 
    execute "b" . buffer 
endfunction 

To daje mi polecenie :B(i mapowanie), które wywołują funkcję, :buffersczekają na dane wejściowe i na koniec wywołują :bdane wejściowe.

Działa dobrze, ale jestem zaskoczony, że musiałem opracować taką funkcję: zwykle Vim ma dość wydajny domyślny przepływ pracy, więc zastanawiam się, czy istnieje lepszy sposób na przejście do bufora, o którym nie wiem nic poza wyjątkiem że został już otwarty w mojej sesji edytorskiej.

statox
źródło
3
Po :lsnim następuje :b#(nie muszę najpierw naciskać Return ani Escape, mogę przejść bezpośrednio z listy buforów w „ls”). (Publikowanie jako komentarz, ponieważ nie wydaje się wystarczająco istotne, aby być odpowiedzią? Zastanawiam się również, czy ja coś mi brakuje i odpowiadam na złe pytanie.)
LindaJeanne,
2
@LindaJeanne: Jak już powiedziałem, :b#nie szukam tego, ale tak, fakt, że można zapisać naciśnięcie klawisza, wprowadzając bezpośrednio :bbez naciskania enterwcześniej, jest interesujący. (Rzeczywiście to może być zbyt lekkie, aby być odpowiedzią, ale warto było skomentować :-))
statox
Zgaduję, że LindaJeanne oznaczała tę #postać jako zastępstwo dla liczby (buforowej), a nie dosłownie #.
8bittree,

Odpowiedzi:

12

Podczas edytowania wielu buforów zauważyłem błąd w przepływie pracy: korzystam z bufora i chcę przejść na inny, z którego nie pamiętam nazwy i który nie jest alternatywnym buforem . Tak więc używanie :b#nie jest możliwe, a używanie uzupełniania za pomocą polecenia również :bnie jest wygodne.

Wręcz przeciwnie, uznaję uzupełnianie za pomocą tabulacji za niezwykle wygodne. Ustawienie odpowiednich opcji dla wartości, które działają dla Ciebie, może bardzo pomóc. Oto odpowiednie wiersze z mojego vimrc (działają dla mnie, ale mogą nie działać dla ciebie, więc nie kopiuj ich) :

nnoremap ,b :buffer *
set wildmenu
set wildignore+=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=*/min/*,*/vendor/*,*/node_modules/*,*/bower_components/*
set wildignore+=tags,cscope.*
set wildignore+=*.tar.*
set wildignorecase
set wildmode=full

Dzięki temu odpowiedni bufor rzadko znajduje się w odległości większej niż pięć lub sześć naciśnięć klawiszy:

uzupełnianie tabulatorów


To daje mi polecenie :B(i mapowanie), które wywołują funkcję, :buffersczekają na dane wejściowe i na koniec wywołują :bdane wejściowe.

Barry Arthur wymyślił wiele lat temu znacznie prostsze rozwiązanie, które od tego czasu stało się dość popularne:

nnoremap <leader>b :ls<CR>:b<Space>

z czego kilka lat temu zaproponowałem nieco bardziej wszechstronny wariant:

nnoremap gb :ls<CR>:b

gb


Ponieważ mówimy o vimscript, oto miła mała funkcja, którą napisałem, że „automatycznie wypełnia” wiersz polecenia odpowiednim skrótem polecenia po poleceniach podobnych do list, takich jak :lslub :ilist. Zaletą tej funkcji nad powyższymi mapowaniami jest to, że nie muszę pamiętać konkretnych mapowań. Działa podobnie jak Vim, ale z niewielką zmianą .

" smooth listing
cnoremap <expr> <CR> <SID>CCR()

function! s:CCR()
    if getcmdtype() == ":"
        let cmdline = getcmdline()
            if cmdline =~ '\v\C^(dli|il)' | return "\<CR>:" . cmdline[0] . "jump  " . split(cmdline, " ")[1] . "\<S-Left>\<Left>"
        elseif cmdline =~ '\v\C^(cli|lli)' | return "\<CR>:silent " . repeat(cmdline[0], 2) . "\<Space>"
        elseif cmdline =~ '\C^changes' | set nomore | return "\<CR>:sil se more|norm! g;\<S-Left>"
        elseif cmdline =~ '\C^ju' | set nomore | return "\<CR>:sil se more|norm! \<C-o>\<S-Left>"
        elseif cmdline =~ '\C^ol' | set nomore | return "\<CR>:sil se more|e #<"
        elseif cmdline =~ '\C^undol' | return "\<CR>:u "
        elseif cmdline =~ '\C^ls' | return "\<CR>:b"
        elseif cmdline =~ '/#$' | return "\<CR>:"
        else | return "\<CR>" | endif
    else | return "\<CR>" | endif
endfunction

ccr


To powiedziawszy, jestem wielkim zwolennikiem „nawigacji opartej na symbolach” zamiast „nawigacji opartej na plikach”. W stosownych przypadkach nawigacja oparta na symbolach jest znacznie szybsza i bardziej ekonomiczna niż nawigacja oparta na plikach.

Nawiasem mówiąc, ostatni GIF pokazuje jeden sposób nawigacji opartej na symbolach. Przykład jest głupi, ale… no cóż.

romainl
źródło
Chyba nie grałem wystarczająco dużo z wild*opcjami, postaram się to poprawić. Jeśli chodzi o rozwiązanie Barry Arthur, jest ono bardzo zbliżone do interesującej odpowiedzi @ nobe4. Wreszcie będę musiał głębiej przyjrzeć się twojej CCR()funkcji, aby naprawdę ją zdobyć, ale wygląda obiecująco. Dziękuję za odpowiedź.
statox
5
Zobacz moją odpowiedź . Szczególnie komiks.
romainl,
Zdecydowanie ukradnę niektóre z nich!
statox
7

Jakiś czas temu napotkałem ten sam problem i znalazłem rozwiązanie:

nnoremap <leader>b :buffers<CR>:buffer<space>

Spowoduje to otwarcie listy buforów i bez ukrywania jej, umożliwi Ci przełączenie bufora.

Myślę, że to ma sens, że Vim nie ma tutaj opcji „lista i wybranie”, są to dwie osobne akcje. Ale Vim jest wystarczająco potężny, aby połączyć dowodzenie razem.

Pomyśl o tym jak o filozofii Uniksa: zrób jedną rzecz i zrób to dobrze.

:bufferswyświetla listę buforów i :buffer xxxpozwala wybrać jeden.

nobe4
źródło
1
To dobry sposób na rozjaśnienie funkcji, którą zasugerowałem w moim pytaniu, interesujący!
statox
1
Jeśli chcesz, aby przestrzeń na końcu była bardziej widoczna, możesz: nnoremap <lider> b: bufory <CR>: bufor <przestrzeń> |
Tyler Durden,
1

Przez jakiś czas korzystałem z techniki nobe4 w następujący sposób:

nnoremap <Leader>b :set nomore<Bar>:ls<Bar>:set more<CR>:b<Space>

Potem zacząłem używać z tym uzupełniania tabulatorów (jak sugeruje romainl)

Ale ostatnio znalazłem najszybszą metodę z najmniejszą liczbą naciśnięć klawiszy :

{count} CTRL-^

Nie różni się to tak bardzo, :b#<Enter>ale, jak mówisz, musisz znać numer bufora!

W tym celu uruchamiam wtyczkę MiniBufExplorer , która wyświetla listę nazw plików u góry (jak prawie każdy inny edytor). Jestem pewien, że istnieje wiele alternatyw.

Wreszcie, ponieważ Ctrl-^moje palce są trochę rozciągnięte i jest to bardzo częsta operacja, przeniosłem ją na Ctrl-E. Implementacja że nie jest zbyt skomplikowane:

nnoremap <C-E> :<C-U>call SwitchToBuffer()<CR>

function! SwitchToBuffer()
  if v:count > 0
    exec v:count . "b"
    return
  endif

  " Whatever you want to do if you didn't provide a count
  " In this case, fall back to nobe4's technique:
  call feedkeys(":ls\n:b ")
endfunction

Mój obecny proces przełączania bufora przebiega mniej więcej tak:

  1. Spójrz na MiniBufExplorer
  2. Trafienie 3 Ctrl-E

Niestety MBE i powyższy skrypt nie są wbudowanymi funkcjami Vima, tak jak prosiłeś. Kiedy jestem na zdalnym komputerze bez konfiguracji, po prostu używam :b [partial]i Tab-uzupełniania.

joeytwiddle
źródło