Was ist eine effizientere Methode, um Puffer zu verwenden?

13

In letzter Zeit habe ich die Anzahl der von mir verwendeten Plugins drastisch reduziert, sodass ich nur mit den integrierten Vim-Funktionen nach Antworten suche.

Ich habe einen Fehler in meinem Workflow festgestellt, als ich viele Puffer bearbeite: Ich bin in einem Puffer und möchte zu einem anderen wechseln, von dem ich mich nicht an den Namen erinnere und bei dem es sich nicht um den alternativen Puffer handelt . Die Verwendung :b#ist also nicht möglich und die Vervollständigung mit dem Befehl :bist auch nicht bequem.

Dazu habe ich folgendes gemacht:

  • Verwenden Sie zuerst :buffers, um die Liste der offenen Puffer abzurufen
  • Merke dir die Nummer des Puffers, den ich verwenden möchte
  • Drücken Sie Enter, um die Liste der Puffer zu schließen
  • Verwenden Sie :bXmit Xder Nummer des zu verwendenden Puffers.

Dieser Workflow schien mir ziemlich schwer zu sein, daher habe ich die folgenden Zeilen zu meinem hinzugefügt .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 

Dies gibt mir einen Befehl :B(und ein Mapping), der die Funktion :buffersauf eine Eingabe wartet und schließlich :bgefolgt von der Eingabe aufruft .

Es funktioniert gut, aber ich bin überrascht, dass ich eine solche Funktion entwickeln musste: Normalerweise verfügt Vim über einen recht effizienten Standardworkflow, weshalb ich mich frage, ob es eine bessere Möglichkeit gibt, zu einem Puffer zu wechseln, von dem ich nichts Außergewöhnliches kenne dass es in meiner Editiersitzung schon geöffnet wurde.

statox
quelle
3
Ich tue :lsgefolgt von :b#(muss nicht zuerst Return oder Escape drücken, kann direkt aus der Pufferliste in 'ls' gehen.) (Als Kommentar posten, weil es nicht substanziell genug zu sein scheint, um eine Antwort zu sein? Ich frage mich auch, ob ich fehle etwas und beantworte die falsche
frage
2
@ LindaJeanne: Wie gesagt :b#ist nicht das, wonach ich suche, aber die Tatsache, dass Sie einen Tastenanschlag speichern können, indem Sie direkt eingeben, :bohne entervorher zu drücken, ist interessant. (In der Tat ist das vielleicht zu leicht, um eine Antwort zu geben, aber es war einen Kommentar wert :-))
statox
Ich vermute, LindaJeanne meinte das #Zeichen eher als Ersatz für eine (Puffer-) Zahl als als das wörtliche #Zeichen.
8bittree,

Antworten:

12

Ich habe einen Fehler in meinem Workflow festgestellt, als ich viele Puffer bearbeite: Ich bin in einem Puffer und möchte zu einem anderen wechseln, von dem ich mich nicht an den Namen erinnere und bei dem es sich nicht um den alternativen Puffer handelt . Die Verwendung :b#ist also nicht möglich und die Vervollständigung mit dem Befehl :bist auch nicht bequem.

Im Gegenteil, ich finde die Tab-Vervollständigung äußerst praktisch. Das Einstellen der richtigen Optionen auf Werte, die für Sie funktionieren, kann sehr hilfreich sein. Dies sind die relevanten Zeilen von mir vimrc (sie funktionieren für mich, aber sie funktionieren möglicherweise nicht für Sie, kopieren Sie sie also nicht einfach) :

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

Damit ist der richtige Puffer selten mehr als fünf oder sechs Tastenanschläge entfernt:

Tab-Vervollständigung


Dies gibt mir einen Befehl :B(und ein Mapping), der die Funktion :buffersauf eine Eingabe wartet und schließlich :bgefolgt von der Eingabe aufruft .

Barry Arthur hat vor Jahren eine viel einfachere Lösung gefunden, die seitdem ziemlich populär geworden ist:

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

von denen ich vor ein paar Jahren eine etwas vielseitigere Variante vorgeschlagen habe:

nnoremap gb :ls<CR>:b

gb


Da es sich um Vimscript handelt, habe ich hier eine nette kleine Funktion geschrieben, die die Befehlszeile nach listenartigen Befehlen wie :lsoder "automatisch auffüllt" :ilist. Der Vorteil dieser Funktion gegenüber den obigen Zuordnungen ist, dass ich mich nicht an bestimmte Zuordnungen erinnern muss. Es funktioniert genau wie Vim, nur mit einem kleinen Dreh .

" 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


Trotzdem bin ich ein großer Befürworter der "symbolbasierten Navigation" gegenüber der "dateibasierten Navigation". Gegebenenfalls ist die symbolbasierte Navigation viel schneller und wirtschaftlicher als die dateibasierte Navigation.

Das letzte GIF zeigt übrigens ein Mittel der symbolbasierten Navigation. Das Beispiel ist albern, aber ... na ja.

romainl
quelle
Ich denke, ich habe nicht genug mit den wild*Optionen gespielt, ich werde versuchen, es auf meine Weise zu optimieren. Bezüglich der Barry Arthur-Lösung ist die Antwort von @ nobe4 ziemlich nahe, was interessant ist. Schließlich muss ich Ihre CCR()Funktion genauer betrachten, um sie wirklich zu verstehen, aber sie sieht vielversprechend aus. Danke für deine Antwort.
statox
5
Siehe diese Antwort von mir . Besonders der Comic.
Romainl
Ich werde auf jeden Fall einige davon stehlen!
statox
7

Ich bin vor einiger Zeit auf das gleiche Problem gestoßen und habe eine Lösung gefunden:

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

Dadurch wird die Pufferliste geöffnet , und Sie haben die Möglichkeit, den Puffer zu wechseln, ohne ihn auszublenden.

Ich denke, dass es Sinn macht, dass Vim hier keine "List and Select" -Option hat, das sind zwei separate Aktionen. Aber Vim ist mächtig genug, um Befehle miteinander zu kombinieren.

Betrachten Sie es als die Unix-Philosophie: Machen Sie eine Sache und machen Sie es gut.

:bufferslistet die Puffer auf und :buffer xxxermöglicht die Auswahl eines Puffers.

nobe4
quelle
1
Das ist eine gute Möglichkeit, die in meiner Frage vorgeschlagene Funktion zu vereinfachen, interessant!
statox
1
Wenn Sie das Leerzeichen am Ende sichtbarer machen möchten, können Sie Folgendes tun: nnoremap <leader> b: puffers <CR>: buffer <Space> |
Tyler Durden
1

Für eine Weile habe ich die folgende Technik von nobe4 verwendet:

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

Dann habe ich damit angefangen, Tab-Vervollständigung zu verwenden (wie romainl vorschlägt)

Aber in letzter Zeit habe ich die schnellste Methode mit den wenigsten Tastenanschlägen gefunden :

{count} CTRL-^

Das ist nicht so anders, :b#<Enter>aber wie Sie sagen, müssen Sie die Puffernummer kennen !

Deshalb starte ich das MiniBufExplorer- Plugin, das eine Liste von Dateinamen oben anzeigt (wie fast jeder andere Editor). Ich bin sicher, es gibt zahlreiche Alternativen.

Schließlich habe Ctrl-^ich es , da meine Finger ein wenig gestreckt sind und dies eine sehr häufige Operation ist, auf verschoben Ctrl-E. Die Implementierung dafür ist nicht zu komplex:

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

Mein aktueller Buffer Switching-Prozess sieht also so aus:

  1. Schauen Sie sich den MiniBufExplorer an
  2. Schlagen 3 Ctrl-E

Leider sind MBE und das obige Skript nicht Vim-integriert, wie Sie es gewünscht haben. Wenn ich auf einem entfernten Rechner ohne Konfiguration bin, benutze ich einfach :b [partial]und Tab-Vervollständigung.

joeytwiddle
quelle