Najszybszy sposób na przejście do bufora w vimie?

43

Jednym ze sposobów wyboru bufora w vimie może być przeglądanie listy buforów za pomocą standardowych poleceń as :lslub jakiegoś zewnętrznego kodu wtyczki / vimscript do przeglądania listy w oknie .

Powiedzmy, że chcę przejść bezpośrednio do bufora tak szybko, jak to możliwe.

Aby przeglądać listę buforów w trybie sekwencyjnym, używam teraz <C-J> <C-K>skrótów, po ustawieniu w moim .vimrc:

" move among buffers with CTRL
map <C-J> :bnext<CR>
map <C-K> :bprev<CR>

Innym sposobem (bezpośredni dostęp) może być przełączanie według numeru : znając numer bufora, można przełączać bezpośrednio, wprowadzając numer bufora, a następnie <C-^>. Więc jeśli chcę przełączyć się na bufor numer 5, naciskałbym 5<C-^>.

Ale wydaje mi się, że to nie działa (używam vim 7.4 na Ubuntu Box, od gościa Windows, z włoską klawiaturą ). Podejrzewam, że ^dzieje się tak dlatego, że znak jest pisany wielkimi literami na włoskiej klawiaturze, więc tak naprawdę ^muszę go nacisnąćSHIFT-^

Jakieś pomysły?

Giorgio Robino
źródło
2
Czy możesz nacisnąć <c-6>zamiast <c-^>?
Peter Rincker,
masz na myśli Ctrl-1, aby przejść do bufora nr 1? Niestety nie działa nic się nie stało
Giorgio Robino
1
Nie. Niektóre terminale potrafią zrozumieć Ctrl-6, który jest taki sam jak Ctrl-^ na klawiaturze amerykańskiej.
Peter Rincker,
2
+1 Świetnie, działa! Używam włoskiego układu klawiatury (za pomocą emulatora szpachli). Więc: 1<C-6>przełącza się na bufor numer 1. Dzięki!
Giorgio Robino
Możesz spróbować użyć CtrlSpace .
Hongbo Liu,

Odpowiedzi:

51

:bKomenda może także wziąć podciąg nazwy pliku buforu, który chcesz podróżować do tego, co jest bardzo wygodne.

Na przykład, jeśli masz trzy bufory foo, bari baz, a następnie

  • :b barprzejdzie do barpliku.

  • :b oprzejdzie do foopliku.

  • :b awyświetli błąd, ponieważ może to oznaczać albo, baralbo baz, ale możesz naprawić nazwę, aby była bardziej szczegółowa, na przykład : r Enter.

Może to być bardzo przydatne, ponieważ oznacza zamiast

:buffer very/very/long/path/to/a/veryVeryLongFileName.txt

możesz zrobić coś takiego

:b LongFileName

co jest znacznie krótsze i łatwiejsze.

To polecenie może również przyjmować liczbę, jeśli chcesz go użyć:

:b 5
Klamka
źródło
8
Zastrzeżenie dotyczące używania częściowych nazw buforów: jeśli nazwa częściowego bufora pojawia się na początku granicy słowa w ścieżce jakiegoś bufora, polecenie nie będzie dostępne dla bufora z częściową nazwą w środku słowa :b. Na przykład, jeśli masz dwa bufory path/to/fooi path/to/tofu, polecenie :b f<Tab>nigdy nie będzie pasować path/to/tofu, ponieważ pasuje na początku słowa w path/to/foo.
tommcdo
2
:5bjest wtedy nieco krótszy :b 5 ;-)
joeytwiddle
15

Oto, czego używam:

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

Teraz naciśnięcie \bwyświetli listę dostępnych buforów i przygotuje :bdla Ciebie.

Następnie wystarczy wpisać numer bufora i nacisnąć Enter.

Możesz też wpisać część nazwy pliku i nacisnąć Enter. (Jednak zwykle uderzam Tab przed naciśnięciem Enter, aby sprawdzić, czy mam odpowiedni bufor. Jeśli nie, kontynuuję jazdę na Tabie, dopóki nie otrzymam tego, którego chciałem.)


W rzeczywistości używam nieco ulepszonej wersji powyższego:

nnoremap <C-e> :set nomore <Bar> :ls <Bar> :set more <CR>:b<Space>

Zapobiegnie to wyświetlaniu -- More --monitu, gdy masz więcej buforów niż dostępnych linii do ich wyświetlenia.

Ale jeśli zwykle i tak masz 'more'wyłączoną opcję, to mapowanie naprawdę cię denerwuje, ponieważ ponownie włącza 'more'opcję po wykonaniu ls!

joeytwiddle
źródło
1
Prawdę mówiąc, tak naprawdę nie używam żadnego z nich, używam własnej małej wtyczki , ale funkcjonalność jest bardzo podobna. Za pomocą wtyczki mogę także wykonać Tab-complete na nazwach plików nieotwartych buforów.
joeytwiddle
1
Chociaż ta technika nie jest tak szybka jak użycie, [count]<C-^>gdy znasz numer bufora, jest dość przydatna, gdy nie wiesz.
joeytwiddle
2
dzięki joeytwiddle za twoje notatki. Sprawdzę twoją wtyczkę jak najszybciej. W moim przypadku (patrz problem z klawiaturą powyżej) [count]<C-6>wydaje mi się najszybszy sposób na przejście do znanego bufora
Giorgio Robino
Tak, również używam [count]<C-^>tych dni. Ale to oznacza, że ​​muszę uruchomić MiniBufExplorer lub coś podobnego, aby wiedzieć, jakie są numery buforów!
joeytwiddle
dlaczego potrzebujesz <CR> i <SPACE>? Na początku wydaje mi się, że bez nich działa dobrze ...
Felix Crazzolara,
9

:CtrlPBufferz wtyczki CtrlP (4k ★)

Główną cechą tej wtyczki jest zapewnienie rozmytego dopasowania, aby wygodnie otworzyć inny bufor z wizualnym sprzężeniem zwrotnym.

Otwórz listę buforów rozmytych za pomocą :CtrlPBufferlub naciśnij, <C-p>a następnie, <C-b>aby zmienić tryb na buffer.

Wprowadź wystarczającą liczbę znaków, aby określić bufor, który chcesz otworzyć.
Możesz także używać <C-j>i, <C-k>aby przewijać listę i ręcznie wybierać bufor.

wprowadź opis zdjęcia tutaj

Dostosowywanie

Jeśli chcesz natychmiast otworzyć listę buforów <C-p>, dodaj następujący wiersz do vimrc:

let g:ctrlp_cmd = 'CtrlPBuffer'

Możesz użyć <C-f/b>do przełączenia trybu okna Ctrlp.

Ja osobiście korzystam let g:ctrlp_cmd = 'CtrlPMRU'. Lista ostatnio używanych (mru) zawiera również otwarte bufory. Jeśli używasz różnych trybów Ctrlp i chcesz pozostać przy ostatnim trybie, możesz ustawić let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'.

Podobne wtyczki

Istnieje więcej wtyczek, które zapewniają listę buforów z interaktywnym monitem z rozmytym dopasowaniem, np

  • fzf.vim (4k ★) autor: Junegunn (+ terminal, go)
  • Command-t przez Wincentego (+ ruby)
  • denite.nvim przez Shougo (+ python3, vim8 lub neovim)

Ciemna strona kontra jasna strona

(tj. konfiguracja vim-heavy vim vs. vim)

Zanim zdecydujesz się na użycie bardziej złożonych wtyczek, zapoznaj się z odpowiedziami @Doorknob i @joeytwiddle . W szczególności sprawdź, czy jeden z nich już spełnia twoje potrzeby.

  1. nnoremap <Leader>b :b <C-d>
  2. nnoremap <Leader>b :ls<Cr>:b<Space>

Zainstalowanie wtyczek tylko do przełączania buforów może być przesadą. Zobacz także uwagi na https://www.vi-improved.org/recommendations oraz artykuł Drew Neila „O ostrzeniu piły” .

Hotschke
źródło
tak Hotschke, przyznaję, że często używam: CtrlPBuffer
Giorgio
Używam, map <leader>a <ESC>:CtrlPBuffer<CR><CR>aby przejść do poprzednio otwartego bufora za pomocą <leader>a(podczas gdy <leader>bwłaśnie otwiera dla mnie listę buforów)
Rolf
@Rolf: czy wiesz <C-^>(= <C-6>)? zob :h CTRL-^. Afaik, robi to tylko to, co <leader>awydaje się robić twoje mapowanie . Dlatego myślę, że właśnie podałeś przykład, dlaczego ludzie mówią, że używanie wtyczek może prowadzić do użytkowników vimów, którzy nie wiedzą, co vim może zrobić samodzielnie.
Hotschke,
@Hotschke: Nie, nie wiedziałem o tym. Nauczyłem się czegoś, dzięki! Zmapuję <C - ^>.
Rolf
Doskonałe odniesienie do <Cd> z waniliowym vimem. Nigdzie indziej nie widziałem tego odniesienia.
radke
8

Oprócz naprawdę przydatnych odpowiedzi autorstwa joeytwiddle i Doorknob nie zapomnij o tym :b#, który przełącza się na ostatnio używany bufor. Można to również zrobić za pomocą just <C-^>. Gdy masz wiele buforów i ciągle się między nimi przełączasz, najnowszy bufor jest zwykle najczęstszym miejscem docelowym.

Osobiście używam kombinacji wielu metod. Kiedy pracuję głównie z dwoma buforami, a reszta jest otwierana tylko dla sporadycznych odniesień, zwykle przełączam się między nimi za pomocą :b#lub <C-^>. Kiedy muszę pracować z większą liczbą z nich i częściej się przełączać, do ich uzupełnienia używam liczb (jak w wskazówce Joeytwiddle) lub części nazw (jak we wskazówce Doorknob). Kiedy nazwy są mylące, a otwartych jest wiele buforów (zwykle ponad 10), częściej używam wtyczki Ctrl-P ( https://github.com/kien/ctrlp.vim ). Dwa szybkie naciśnięcia klawiszy spowodowały, że otrzymałem listę wszystkie i jestem w stanie użyć potężnego wyszukiwania rozmytego nad nimi, aby szybko znaleźć to, czego chcę.

qiubix
źródło
2
<C - ^> sam (<C-6> w moim przypadku, jak sugerował Peter Rincker) jest dobrą sztuczką w przypadku tylko 2 buforów :-)
Giorgio Robino
5

[bi ]bz wtyczki vim-unimpaired(> 2k ★)

Jeśli masz zainstalowany vim-unimpaired, możesz użyć

  • [b( :bp[revious]) i
  • ]b( :bn[ext])

do przechodzenia przez otwarte bufory. Nie ma potrzeby definiowania cenniejszych mapowań dla tych samych poleceń. Ponadto można przejść do pierwszego i ostatniego bufora

  • [B( :bf[irst]) i
  • ]B( :bl[ast]).

Jest o wiele więcej mapowań nawiasów, w vim-unimpairedktórych możesz się przydać. Wszystkie są zgodne z tym samym schematem, co ułatwia ich zapamiętanie.

Ciemna strona kontra jasna strona

Wtyczkę tę można uznać za lekką i „vimish”. Jest ona oznaczona #vim społeczności jako plugin „nie szkodzić”.

Hotschke
źródło
+1 Warto również zauważyć, że możesz podać liczbę. 3[bprzeskoczyć trzy bufory z powrotem.
joeytwiddle
1

Obecnie używam klawisza <Leader>+ numberdo przełączania. Klucz lidera jest moim <space>kluczem. Używam również vim-Airlines, aby wyświetlić bufor nr na górze okna.

" airline settings
let g:airline#extensions#tabline#buffer_nr_show = 1
let g:airline#extensions#tabline#enabled = 1

Podczas gdy bufor często przekracza 10, więc poprawiam własne mapowanie, jeśli numberjest to jedyne dopasowanie, natychmiast przełączaj bufor, w przeciwnym razie poczekaj na więcej danych liczbowych lub <space>klawisz, aby potwierdzić:

nnoremap <expr> <Leader>1 tweak#wtb_switch#key_leader_bufnum(1)
nnoremap <expr> <Leader>2 tweak#wtb_switch#key_leader_bufnum(2)
nnoremap <expr> <Leader>3 tweak#wtb_switch#key_leader_bufnum(3)
nnoremap <expr> <Leader>4 tweak#wtb_switch#key_leader_bufnum(4)
nnoremap <expr> <Leader>5 tweak#wtb_switch#key_leader_bufnum(5)
nnoremap <expr> <Leader>6 tweak#wtb_switch#key_leader_bufnum(6)
nnoremap <expr> <Leader>7 tweak#wtb_switch#key_leader_bufnum(7)
nnoremap <expr> <Leader>8 tweak#wtb_switch#key_leader_bufnum(8)
nnoremap <expr> <Leader>9 tweak#wtb_switch#key_leader_bufnum(9)




func! tweak#wtb_switch#key_leader_bufnum(num)
    let l:buffers = tweak#wtb_switch#buflisted()
    let l:input = a:num . ""

    while 1

        let l:cnt = 0
        let l:i=0
        " count matches
        while l:i<len(l:buffers)
            let l:bn = l:buffers[l:i] . ""
            if l:input==l:bn[0:len(l:input)-1]
                let l:cnt+=1
            endif
            let l:i+=1
        endwhile

        " no matches
        if l:cnt==0 && len(l:input)>0
            echo "no buffer [" . l:input . "]"
            return ''
        elseif l:cnt==1
            return ":b " . l:input . "\<CR>"
        endif

        echo ":b " . l:input

        let l:n = getchar()

        if l:n==char2nr("\<BS>") ||  l:n==char2nr("\<C-h>")
            " delete one word
            if len(l:input)>=2
                let l:input = l:input[0:len(l:input)-2]
            else
                let l:input = ""
            endif
        elseif l:n==char2nr("\<CR>") || (l:n<char2nr('0') || l:n>char2nr('9'))
            return ":b " . l:input . "\<CR>"
        else
            let l:input = l:input . nr2char(l:n)
        endif

        let g:n = l:n

    endwhile
endfunc

func! tweak#wtb_switch#buflisted()
  return filter(range(1, bufnr('$')), 'buflisted(v:val)')
endfunc

Kod jest wklejany stąd

Nawiasem mówiąc, używam również <S-h>i <S-l>dla :bpi :bn, lub :tabpi :tabnjeśli obecnie otwartych jest więcej niż jedna strona. Jest to dla mnie dość intuicyjne.

rox
źródło
1

Obecnie używam [buffer_number]<Ctrl-^>do przełączania buforów, ponieważ jest to bardzo szybkie.

Ale jak poznać numer bufora? Używam MiniBufExplorer, więc zawsze mogę zobaczyć numery buforów na górze Vima.

Używam również następującego mapowania, ponieważ <C-^>jest to trochę trudne do osiągnięcia jedną ręką.

:nmap <C-E> <C-^>

Na nowej maszynie bez konfiguracji wracam do :b [part_of_filename]<Tab><Enter>

joeytwiddle
źródło