Der schnellste Weg, um in vim zu einem Puffer zu wechseln?


43

Eine Möglichkeit, einen Puffer in vim auszuwählen, besteht darin, die Pufferliste mit den Standardbefehlen as :lsoder mit einem externen Plugin / Vimscript-Code zu durchsuchen, um eine Liste in einem Fenster zu durchsuchen .

Nehmen wir an, ich möchte so schnell wie möglich direkt zu einem Puffer springen.

Um die Pufferliste im sequentiellen Modus zu durchlaufen, verwende ich jetzt <C-J> <C-K>Verknüpfungen, die in meiner .vimrc festgelegt wurden:

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

Ein anderer Weg (direkter Zugriff) könnte das Umschalten nach Nummer sein : Wenn Sie die Puffernummer kennen, können Sie direkt umschalten, indem Sie die Puffernummer gefolgt von eingeben <C-^>. Wenn ich also zu Puffer Nummer 5 wechseln möchte, würde ich drücken 5<C-^>.

Aber das scheint bei mir nicht zu funktionieren (ich benutze vim 7.4 auf Ubuntu-Box, von einem Windows-Gast, mit italienischer Tastatur ). Ich vermute, das liegt daran, dass das ^Zeichen auf der italienischen Tastatur in Großbuchstaben geschrieben ist. Um es zu bekommen, muss ^ich also drückenSHIFT-^

Irgendwelche Ideen?


2
Können Sie drücken <c-6>statt <c-^>?
Peter Rincker

Meinst du Strg-1, um zu Puffer Nummer 1 zu gehen? Funktioniert leider nicht. nichts passiert
Giorgio Robino

1
Nein. Einige Terminals können Strg-6 verstehen, was mit Strg- ^ auf der US-Tastatur identisch ist.
Peter Rincker

2
+1 Großartig, es funktioniert! Ich benutze ein italienisches Tastaturlayout (mit Putty Terminal Emulator). Also: 1<C-6>schaltet auf Puffer Nummer 1 um. Danke!
Giorgio Robino

Sie können versuchen, CtrlSpace zu verwenden .
Hongbo Liu

Antworten:


51

Der :bBefehl kann auch eine Teilzeichenfolge des Namens der Datei des Puffers verwenden, in den Sie reisen möchten, was sehr praktisch ist.

Wenn Sie beispielsweise drei Puffer foohaben bar, und bazdann

  • :b barwechselt zur barDatei.

  • :b owechselt zur fooDatei.

  • :b awird Ihnen eine Fehlermeldung geben, da dies entweder baroder bedeuten könnte. bazSie können den Namen jedoch auch genauer festlegen, z. B. mit : r Enter.

Dies kann sehr nützlich sein, weil es bedeutet, statt

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

Sie können so etwas tun

:b LongFileName

Das ist viel kürzer und einfacher.

Dieser Befehl kann auch eine Zahl annehmen, wenn Sie das verwenden möchten:

:b 5

8
Ein Vorbehalt zur Verwendung von Teilpuffernamen: Wenn der Teilpuffername am Anfang einer Wortgrenze im Pfad eines Puffers erscheint, kann der :bBefehl auf keinen Puffer mit dem Teilnamen in der Mitte eines Wortes zugreifen. Wenn Sie zum Beispiel zwei Puffer path/to/foound haben path/to/tofu, wird der Befehl :b f<Tab>niemals übereinstimmen path/to/tofu, da er am Anfang eines Wortes in übereinstimmt path/to/foo.
tommcdo

2
:5bist etwas kürzer dann :b 5 ;-)
joeytwiddle

15

Das benutze ich:

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

Durch Drücken von \bwerden die verfügbaren Puffer aufgelistet und :bfür Sie vorbereitet .

Dann können Sie einfach die Puffernummer eingeben und die Eingabetaste drücken.

Oder Sie können einen Teil des Dateinamens eingeben und die Eingabetaste drücken. (Normalerweise drücke ich jedoch die Tabulatortaste, bevor ich die Eingabetaste drücke, um zu überprüfen, ob der richtige Puffer vorhanden ist. Wenn nicht, fahre ich mit Tabulatortaste fort, bis ich den gewünschten erhalte.)


In der Tat verwende ich eine leicht überarbeitete Version des oben genannten:

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

Auf diese Weise wird verhindert, dass die -- More --Eingabeaufforderung angezeigt wird, wenn Sie mehr Puffer als verfügbare Zeilen zum Anzeigen haben.

Aber wenn Sie die 'more'Option normalerweise sowieso deaktiviert haben, wird Sie diese Zuordnung wirklich ärgern, da sie die 'more'Option nach dem Ausführen wieder aktiviert ls!


1
Um ehrlich zu sein, ich benutze keines von beiden, ich benutze mein eigenes kleines Plugin , aber die Funktionalität ist sehr ähnlich. Mit dem Plugin kann ich auch Tab-complete für die Dateinamen von ungeöffneten Puffern ausführen.
Joeytwiddle

1
Obwohl diese Technik nicht so schnell ist wie die Verwendung, [count]<C-^>wenn Sie die Puffernummer kennen, ist sie ziemlich nützlich, wenn Sie nicht wissen.
Joeytwiddle

2
danke joeytwiddle für deine notizen. Ich werde Ihr Plugin so schnell wie möglich überprüfen. In meinem Fall (siehe Tastaturproblem oben) [count]<C-6>scheint mir der schnellste Weg zu bekanntem Puffer zu wechseln
Giorgio Robino

Ja, ich benutze [count]<C-^>diese Tage auch. Das bedeutet aber, dass ich MiniBufExplorer oder ähnliches ausführen muss, um die Puffernummern zu kennen!
Joeytwiddle

Warum brauchen Sie das <CR> und das <SPACE>? Zunächst scheint es mir, als ob es ohne sie gut funktioniert ...
Felix Crazzolara

9

:CtrlPBuffervom Plugin CtrlP (4k ★)

Hauptmerkmal dieses Plugins ist die Bereitstellung eines Fuzzy-Matchings zum bequemen Öffnen eines anderen Puffers mit visuellem Feedback.

Öffnen Sie die Fuzzy-Puffer-Liste mit :CtrlPBufferoder drücken Sie <C-p>gefolgt von <C-b>, um den Modus auf zu ändern buffer.

Geben Sie eine ausreichende Anzahl von Zeichen ein, um den Puffer anzugeben, den Sie öffnen möchten.
Sie können auch <C-j>und verwenden, <C-k>um durch die Liste zu blättern und den Puffer manuell auszuwählen.

Bildbeschreibung hier eingeben

Anpassung

Wenn Sie die Pufferliste sofort mit öffnen möchten <C-p>, fügen Sie Ihrem vimrc folgende Zeile hinzu:

let g:ctrlp_cmd = 'CtrlPBuffer'

Mit können Sie <C-f/b>den Modus des CTRLP-Fensters wechseln.

Ich persönlich benutze let g:ctrlp_cmd = 'CtrlPMRU'. Die zuletzt verwendete (mru) Liste enthält auch die geöffneten Puffer. Wenn Sie verschiedene Strg-Modi verwenden und an Ihrem letzten Modus festhalten möchten, können Sie festlegen let g:ctrlp_cmd = 'CtrlPLastMode [--dir]'.

Ähnliche Plugins

Es gibt weitere Plugins, die eine Pufferliste mit einer interaktiven Eingabeaufforderung mit Fuzzy-Matching bereitstellen, z

Die dunkle Seite gegen die helle Seite

(dh Plugin-lastiges Vim-Setup vs. Vim Way)

Bevor Sie sich für die Verwendung dieser komplexeren Plugins entscheiden, lesen Sie die Antworten von @Doorknob und @joeytwiddle . Überprüfen Sie insbesondere den Einzeiler, ob einer von ihnen bereits Ihren Anforderungen entspricht.

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

Das Installieren der Plugins nur für die Pufferumschaltung ist möglicherweise ein Overkill. Siehe auch die Anmerkungen unter https://www.vi-improved.org/recommendations und den Artikel von Drew Neil über das Schärfen der Säge .


ja hotschke, ich gestehe, ich benutze oft: CtrlPBuffer
Giorgio Robino

Ich benutze map <leader>a <ESC>:CtrlPBuffer<CR><CR>, um zum zuvor geöffneten Puffer mit zu springen <leader>a(während <leader>bnur die Pufferliste für mich geöffnet wird )
Rolf

@Rolf: weißt du <C-^>(= <C-6>)? sehen :h CTRL-^. Afaik, dies macht genau das, was Ihre Zuordnung <leader>azu tun scheint. Ich denke, Sie haben nur ein Beispiel angeführt, warum Leute sagen, dass die Verwendung von Plugins zu vim-Benutzern führen könnte, die nicht wissen, was vim bereits alleine kann.
Hotschke

@Hotschke: Nein, das wusste ich nicht. Etwas gelernt, wusste, danke! Ich werde allerdings <C - ^> neu zuordnen.
Rolf

Hervorragender Bezug zu <Cd> mit Vanille-Vim. Ich habe diesen Hinweis nirgendwo anders gesehen.
Radke

8

Neben wirklich nützlichen Antworten von joeytwiddle und Doorknob vergessen Sie nicht :b#, welches auf den zuletzt verwendeten Puffer umschaltet. Es kann auch mit nur getan werden <C-^>. Wenn Sie über viele Puffer verfügen und ständig zwischen diesen wechseln, ist in der Regel der neueste Puffer das häufigste Ziel.

Persönlich verwende ich eine Kombination vieler Methoden. Wenn ich hauptsächlich mit zwei Puffern arbeite und der Rest nur zum gelegentlichen Nachschlagen geöffnet ist, neige ich dazu, mit :b#oder zwischen ihnen zu wechseln <C-^>. Wenn ich mit mehr von ihnen arbeiten und öfter wechseln muss, verwende ich entweder Zahlen (wie im Joeytwiddle-Tipp) oder Teile von Namen (wie im Doorknob-Tipp) mit TAB, um sie zu vervollständigen. Wenn die Namen verwirrend sind und viele Puffer geöffnet sind (normalerweise über 10), verwende ich das Ctrl-P-Plugin häufiger ( https://github.com/kien/ctrlp.vim ). Mit zwei schnellen Tastenanschlägen erhielt ich die Liste von sie alle und ich bin in der Lage, leistungsstarke Fuzzy-Suche über sie zu verwenden, um schnell zu finden, was ich will.


2
<C - ^> alleine (<C-6> in meinem Fall, wie Peter Rincker vorgeschlagen hat) ist ein guter Trick bei nur 2 Puffern :-)
Giorgio Robino

5

[bund ]bvom Plugin vim-unimpaired(> 2k ★)

Wenn Sie installiert haben vim-unimpaired, können Sie verwenden

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

zum Radfahren durch offene Puffer. Es müssen keine wertvolleren Zuordnungen für dieselben Befehle definiert werden. Darüber hinaus kann mit zum ersten und letzten Puffer gesprungen werden

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

Es sind noch viele weitere Bracket-Mappings enthalten, vim-unimpaireddie Sie möglicherweise nützlich finden. Sie folgen alle dem gleichen Schema, was es einfach macht, sie auswendig zu lernen.

Die dunkle Seite gegen die helle Seite

Dieses Plugin kann als leichtgewichtig und "vimish" angesehen werden. Es wird von der #vim-Community als Plugin bezeichnet, das keinen Schaden anrichtet.


+1 Erwähnenswert ist auch, dass Sie eine Zählung angeben können. 3[bum drei Puffer zurückzuspringen.
Joeytwiddle

1

Zur Zeit benutze ich die <Leader>+ numberTaste um zu wechseln. Der Anführerschlüssel ist mein <space>Schlüssel. Ich benutze auch vim-airline , um die Puffernummer oben im Fenster anzuzeigen.

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

Während die bufnr oft 10 überschreitet, optimiere ich mein eigenes Mapping. Wenn dies die numbereinzige Übereinstimmung ist, schalte den Puffer sofort um. Andernfalls warte auf weitere Zahleneingabe oder <space>Bestätigungstaste:

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

Der Code wird von hier eingefügt

Übrigens verwende ich auch <S-h>und <S-l>für :bpund :bn, oder :tabpund :tabnwenn gerade mehr als eine Registerkarte geöffnet ist. Es ist ziemlich intuitiv für mich.


1

In diesen Tagen verwende ich [buffer_number]<Ctrl-^>Puffer zu wechseln, weil es sehr schnell ist.

Aber wie erkennt man die Puffernummer? Ich benutze den MiniBufExplorer, damit ich die Puffernummern immer oben in Vim sehen kann.

Ich benutze auch das folgende Mapping, da <C-^>es mit einer Hand etwas schwer zu erreichen ist.

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

Auf einem frischen Rechner ohne Config greife ich zurück :b [part_of_filename]<Tab><Enter>

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.