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.


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óż.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.