Come preferisci passare da un buffer all'altro in Vim?


92

Ho provato MiniBufExplorer , ma di solito finisco con diverse finestre che lo mostrano o lo chiudono del tutto. Quello che vorrei è qualcosa come LustyJuggler con la ricerca incrementale, il modo in cui passo da un buffer all'altro in Emacs. Sicuramente esiste una sceneggiatura come questa?

Risposte:


23

Sto usando il plugin vim Command-T di Wincent Colaiuta da un paio di mesi. Wincent ha scritto le parti che devono essere veloci in C, e devo dire che lo è! E penso che la sua logica di corrispondenza dei modelli di file sia persino migliore di Command-T di Textmate. Guarda lo screencast .

Il plug-in Command-T per VIM fornisce un meccanismo estremamente veloce e intuitivo per aprire i file con un numero minimo di sequenze di tasti. Si chiama "Command-T" perché è ispirato alla finestra "Vai a file" associata a Command-T in TextMate.

I file vengono selezionati digitando i caratteri che compaiono nei loro percorsi e sono ordinati da un algoritmo che sa che ai caratteri che appaiono in determinate posizioni (ad esempio, immediatamente dopo un separatore di percorso) dovrebbe essere dato più peso.

La commutazione più semplice del buffer contiene molti suggerimenti utili. Ho adattato quanto segue al mio .vimrc, che esegue il completamento automatico del nome del buffer, mappa i comandi di commutazione del buffer più utili sul mio <Leader> e sui tasti della riga home sul lato sinistro e mostra il numero del buffer corrente nella riga di stato :

"" Tab triggers buffer-name auto-completion
set wildchar=<Tab> wildmenu wildmode=full

let mapleader = ","

map <Leader>t :CommandT<Return>
map <Leader>a :bprev<Return>
map <Leader>s :bnext<Return>
map <Leader>d :bd<Return>
map <Leader>f :b 

"" Show the buffer number in the status line.
set laststatus=2 statusline=%02n:%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

Uso anche MiniBufExplorer , che fornisce un elenco compatto di ogni buffer elencato nella propria parte superiore divisa in orizzontale.


73

Usavo una combinazione di schede e più istanze di gvim, mantenendo gruppi di file correlati come schede in ogni istanza. Finché non mi sono ritrovato con troppe schede in un'istanza, la barra delle schede mostra il nome di ogni file che stai modificando a colpo d'occhio.

Poi ho letto un post di Jamis Buck su come è passato da TextMate a vim e ho imparato alcuni trucchi fantastici:

  • Ctrl-w se Ctrl-w v per dividere la finestra corrente
  • Ctrl-6 per passare avanti e indietro tra due buffer nella stessa finestra.
  • il fantastico fuzzyfinder.vim che ti dà la ricerca di completamento automatico dei file nella tua directory corrente o dei buffer che hai attualmente aperto
  • Proprio Jamis' fuzzy_file_finder e fuzzyfinder_textmate , che un po 'modificare il modo in fuzzyfinder lavora a comportarsi più come una funzionalità simile in TextMate (per quanto posso dire, la differenza è che corrisponda in qualsiasi parte del nome del file anziché soltanto dalla partenza). Guarda questo video per vederlo in azione.

Ora ho solo un'istanza gvim, ingrandita e divisa in più finestre in modo da poter vedere diversi file contemporaneamente. Ho associato Ctrl-F a fuzzyfinder_textmate, quindi ora se digito (dico) Ctrl-F mod/usobsi apre app / models / user_observer.rb. Non mi preoccupo quasi più delle schede.

Aggiornamento 2010/08/07

Mentre fuzzyfinder_textmate rimane fantastico, come sottolinea Casey nei commenti, non è più mantenuto. Inoltre, (e / o fuzzyfinder.vim) diventa un po 'lento e instabile quando si lavora con progetti di grandi dimensioni (molte directory o file), quindi ho cercato un'alternativa.

Fortunatamente, sembra che ci sia una bella alternativa, sotto forma di Wincent Colaiuta s' Comando-T plug-in . Questo ha un comportamento molto simile (se non leggermente migliore) a fuzzyfinder_textmate, ma è notevolmente più veloce; ha anche caratteristiche interessanti come la possibilità di aprire il file trovato in una divisione o in una divisione verticale. Grazie (e voti positivi!) A David Rivers per averlo indicato.


Sì, il fuzzyfinder è molto vicino a ciò che voglio.
Alexey Romanov,

Fuzzyfinder_textmate di Jamis completa vim. Dovrebbe davvero diventare una caratteristica fondamentale!
csexton

Sembra che Jami abbia smesso di lavorare a questo progetto. Forse l'autore originale inserirà queste caratteristiche? weblog.jamisbuck.org/2009/1/28/…
cmcginty

Sam, grazie per gli oggetti di scena che mi hai dato (il giorno del mio compleanno!): D
David Rivers

14
Prova il plug-in ctrlp vim ( kien.github.com/ctrlp.vim ) implementa fuzzyfinder ma con un sacco di funzioni più utili :)
Philip

33

Uso le basi - ' :ls' + ' :bn' / ' :bp' + ' :b <part-of-name>'


8
:-) Non avrei mai pensato di vedere "simple" e "': ls' + ': bn' / ': bp' + ': b <part-of-name>'" nella stessa frase.
paxdiablo

16
Pax, ancora non lo vedo. :-)
csexton

Questo, più :map <c-n> :bn<cr>e :map <c-p> :bp<cr>, poiché C-ne C-psono veloci da digitare e consentono di passare da un buffer all'altro se vengono premuti ripetutamente. (Ho mai usato la loro destinazione originaria.) E 'come andare in bicicletta tra le schede del browser con C-PgUpe C-PgDno qualunque scorciatoia tuo browser ha.
Tobia

Ctrl + N è lo standard per "Nuovo file" nella maggior parte degli altri editor e Ctrl + P è il comando incolla, quindi per la maggior parte delle persone questi saranno davvero confusi. Tim Pope's vim-unimpaired ti dà [bper il buffer precedente e ]bper il buffer successivo. Inoltre un sacco di altre chicche che utilizzano il concetto di ]per il prossimo e [per il precedente.
icc97

31

Mi piace "ctrl-w s" e "ctlr-w v" per dividere la finestra. Quindi mappa i tasti di movimento (h, j, k, l) tenendo premuto ctrl per spostarmi tra le finestre divise:

" Map ctrl-movement keys to window switching
map <C-k> <C-w><Up>
map <C-j> <C-w><Down>
map <C-l> <C-w><Right>
map <C-h> <C-w><Left>

Dover spostare la mano sui tasti freccia è fastidioso.

Successivamente, ho impostato ctlr-tab per passare da un buffer all'altro nella finestra corrente (come molti altri ambienti):

" Switch to alternate file
map <C-Tab> :bnext<cr>
map <C-S-Tab> :bprevious<cr>

Questi hanno funzionato abbastanza bene per me negli ultimi anni, anche se vim ha sempre più segreti di quanto tu possa sapere.


3
Il tuo commento "passa al file alternativo" è fuorviante perché Vim ha già un file alternativo, è il file precedente in cui ti trovavi, e puoi cambiare facilmente il file corrente (%) e quello alternativo (#) usando ctrl-6.
graywh

10
Inoltre, <Cw> con hjkl cambierà le finestre - i tasti freccia non sono richiesti.
graywh

4
<CS-Tab> chiede RSI. Ho mappato <SJ> su :bpe <SK> su:bn
puk

3
Rimappare <SJ> sembra una scelta sbagliata in modalità normale, poiché è comunemente usata (per concatenare le linee).
Michael Percy

18
nmap <Leader>bb :ls<CR>:buffer<Space>

e nessuno ha menzionato il bel plugin ctrlp.vim . Usando questo plugin puoi cercare nel buffer per nome.


Mi piace quella mappatura! Intelligente e flessibile.
ivan


5
imap <A-1> <Esc>:tabn 1<CR>i
imap <A-2> <Esc>:tabn 2<CR>i
imap <A-3> <Esc>:tabn 3<CR>i
imap <A-4> <Esc>:tabn 4<CR>i
imap <A-5> <Esc>:tabn 5<CR>i
imap <A-6> <Esc>:tabn 6<CR>i
imap <A-7> <Esc>:tabn 7<CR>i
imap <A-8> <Esc>:tabn 8<CR>i
imap <A-9> <Esc>:tabn 9<CR>i

map <A-1> :tabn 1<CR>
map <A-2> :tabn 2<CR>
map <A-3> :tabn 3<CR>
map <A-4> :tabn 4<CR>
map <A-5> :tabn 5<CR>
map <A-6> :tabn 6<CR>
map <A-7> :tabn 7<CR>
map <A-8> :tabn 8<CR>
map <A-9> :tabn 9<CR>

1
La cosa più interessante di Vim è che puoi imparare qualcosa ogni giorno!
Luc M

La domanda riguarda i buffer , non le schede ... ma puoi :tab sballprima, o invece di usare :tabndovresti usare:buffer
pera

5

Di recente sono diventato più minimalista.

Per ciclare i buffer che uso ]be [bda unimpaired: https://github.com/tpope/vim-unimpaired

Per passare direttamente a un buffer aperto basta usare il completamento con tab di Vim con :b. Alcune lettere sono sufficienti per accedere a qualsiasi buffer aperto con una o due tabulazioni.

Analogamente ai buffer aperti che utilizzo :econ percorsi relativi e scheda completa.

Lo uso anche :lsoccasionalmente per vedere quali buffer ho aperto (e per controllare il loro stato modificato).

Per sbarazzarmi di un buffer che uso :bwper pulire il buffer. Di solito faccio una divisione temporanea e cambio i buffer per preservare il mio layout, dato che :bwchiude anche la finestra attiva.

Tutte le cose di minibuf che ho provato hanno finito per infastidirmi e non voglio che qualche cosa di abbinamento intelligente apra file casuali per me. Se ho davvero bisogno di cercare qualcosa, utilizzo NERDtree ( :e .).

IDK, Ultimamente ho anche abbandonato Yankring (perché fa un errore xp) e ho iniziato a usare i registri, e recentemente ho deciso che i movimenti f/ tsono la cosa più grande di sempre ...


Questo è tutto un ottimo consiglio. Ho mappato <leader>lla :ls. Inoltre è davvero utile assicurarsi di avere set wildmenunel proprio .vimrccome allora si ottiene un piccolo menu che presenta tutte le alternative per:b
icc97

2

L'eccellente Buffer Explorer , è diventato una memoria muscolare così forte che mi ritrovo a desiderare di poterlo usare in altre applicazioni. Trovo che sia estremamente veloce quando si modifica attivamente più di due file.


2

Ho passato un bel po 'di tempo a costruire il mio .vimrc per lavorare con questo progetto HTML :: Mason su cui ho lavorato per quattro anni, quindi ho uno strano mix di schede e finestre divise. Per il tuo divertimento visivo:

map ;o :Sex <CR>
map <C-J> <C-W>j
map <C-K> <C-W>k
map <C-l> <C-W>l
map <C-h> <C-W>h
map ;] :tabnext<CR>
map ;[ :tabprev<CR>
map <C-t> :tabe +"browse ."<CR>
map <C-O> :NERDTreeToggle ~/curr/trunk/<CR>

2

Uso tselectbuffer . È davvero veloce e, a differenza di bufexplorer, non occupa spazio nella tua finestra. Ha anche una ricerca incrementale, ho provato minibufexplorer e ho trovato un po 'difficile la navigazione nel buffer.


Grazie per il puntatore, ora li uso entrambi. Le impostazioni predefinite per BufExplorer sono ,be, ,bs, ,bv, così ho mappato TSelectBuffer a ,bb.
Brady Trainor

2

Per elencare e passare da un buffer all'altro:

nnoremap <Leader>l :ls<CR>:b<space>

Per passare da un buffer all'altro:

map <Leader>n :bn<CR>
map <Leader>p :bp<CR>

2

Ho mappato <S-J>e <S-K>su :bpe :bn, anche se ammetto di non usarlo perché il numero di file è maggiore di 10. Ho quindi mappato <C-J>e <C-K>alle schede precedente e successiva di Gnome Terminal, e di solito eseguo 4 istanze di vim per ciascuna delle i 4 diversi progetti su cui lavoro. Vorrei ancora davvero che il buffer successivo e precedente andasse alla cronologia dei buffer su cui ho lavorato, e non all'ordine nella lista dei buffer.


2

Uso tselectbuffer. È davvero veloce e, a differenza di bufexplorer, non occupa spazio nella tua finestra. Ha anche una ricerca incrementale, ho provato minibufexplorer e ho trovato un po 'difficile la navigazione nel buffer.


0

Io uso simple: vsplit con ^ W + w / ^ W + r e: tabnew con le combinazioni di tasti Ctrl + Alt + PgUp / PgDown.


1
Sono d'accordo con quello che ha detto Zathrus qui . Le schede in Vim (o Emacs con TabBar per quella materia) semplicemente non funzionano come nelle solite interfacce a schede.
Alexey Romanov

0

Quando ci sono diversi buffer aperti in una sessione di Vim, può diventare difficile tenere traccia dei buffer e dei rispettivi numeri di buffer. In questo caso, il passaggio a un file diverso può essere semplificato utilizzando una semplice mappa:

: nnoremap (F5): buffer (CR): buffer (spazio)

vim.wikia.com

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.