Come posso elencare i buffer in una finestra di aggiornamento rapido in Vim?


13

Usando l'editor vim, un'attività comune è quella di sfogliare i buffer. Ora uso comandi standard come :lso a :bnext. In effetti ho impostato nel mio .vimrc:

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

Vorrei sfogliare i buffer come elenco nella finestra di quickfix, nel modo semplice (= eccellente) implementa il plugin MRU .

Esiste un plugin semplice come MRU ma che agisce sui buffer?

OK, una possibile soluzione potrebbe essere quella di utilizzare il :CtrlpBufferscomando, parte del plugin Ctrlp, ma non sono un grande fan di Ctrlp, perché a volte ho strani comportamenti che non capisco completamente (le selezioni in modalità fuzzy ...); quindi sto cercando qualcosa di veramente semplice come plugin MRU.

A proposito, ho scherzato con il :cexpr {expr}comando, provando a popolare le finestre di fastfix con il contenuto :buffersdell'elenco, senza successo (forse perché la mia ignoranza programmava i vimscripts)

Qualche suggerimento ?


Intendevi :bnextinvece di :cnext?
Tommaso,

Ne hai bisogno specificamente per essere la finestra di quickfix ? O vuoi solo essere in grado di vedere i buffer aperti in una finestra? (Perché ci sono diversi plugin per fare quest'ultimo).
Ricco

Voglio essere in grado di sfogliare i buffer aperti in una finestra. In effetti, non è necessaria la correzione rapida
Giorgio Robino,

@tommcdo: si scusa, i miei soliti errori di battitura. Voglio dire: prima e ho aggiornato la domanda
Giorgio Robino,

Risposte:


18

È possibile popolare l'elenco di aggiornamenti rapidi con ciascun buffer in questo modo:

:call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr": v:val}'))
  • setqflist()prende un elenco di voci del dizionario che descrivono ogni errore (nome file, numero riga, posizione, ecc.). In questo caso stiamo specificando un set minimo di informazioni: il numero del buffer
  • map()accetta un elenco e un'espressione (una stringa) e restituisce un nuovo elenco dell'espressione applicato a ciascun elemento dell'elenco di input. Qui, stiamo prendendo un elenco dei numeri di buffer elencati e li formattiamo per l'uso in setqflist()( '{"bufnr": v:val}', dove si v:valtrova il valore dell'elemento nell'elenco)
  • filter()filtra un elenco, rimuovendo elementi che non soddisfano una determinata espressione. Qui l'espressione è buflisted(v:val), il che significa che il numero di buffer esiste ed è elencato, cioè appare :lsnell'output
  • range(a, b)genera un elenco di numeri da aab
  • bufnr()restituisce il numero di un determinato nome del buffer. Se l'argomento è '$', restituisce il numero di buffer più alto

È molto da scrivere e non molto memorabile, quindi puoi racchiuderlo in un comando nel tuo vimrc:

command! Qbuffers call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr":v:val}'))

Ora puoi semplicemente usare :Qbuffersper popolare l'elenco degli aggiornamenti rapidi.


Se vuoi che questo venga aggiornato automaticamente quando vengono aggiunti nuovi buffer, puoi fare qualcosa del genere:

autocmd BufAdd * Qbuffers

Non lo consiglierei, tuttavia, poiché renderà la lista degli aggiornamenti rapidi piuttosto inutilizzabile per cose come :makeo :grep.


1
grazie per le spiegazioni, tommcdo. Qbuffers è bellissimo! Forse aggiungerei un: copen alla fine della tua chiamata per aprire immediatamente la finestra di correzione rapida e forse potrebbe essere utile riportare la posizione del cursore. Devo studiare un po 'di vimscript :-)
Giorgio Robino,

9

Dovresti provare questo mapping:

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

Al prompt, digitare il numero di buffer desiderato e premere Invio.

gb


la qustion in cui sono elencati i buffer nella finestra di quickfind.
VeXii,

Sì, e la mia risposta fornisce un'alternativa leggera.
Romainl,

1
OP afferma di conoscere l'elenco buffer ma gli piace averlo nella finestra di quickfix. e la tua soluzione è usare solo la bufferlist?
VeXii,

1

Dai un'occhiata al plugin bufexplorer . Apre un elenco sfogliabile di tutti i buffer in una barra laterale, simile al plug-in MRU menzionato. Inoltre, ci sono molti altri plugin di questo tipo su vim.org .

PS: hai fatto la stessa domanda su Stack Overflow ; per favore non inviare la stessa domanda a più siti in parallelo!


tks Ingo, ho testato un po bufexplorer e mi piace. Ho pubblicato anche qui perché uno stackoverflow mi ha suggerito di fare
Giorgio Robino,

1
Sì, l'ho visto. Avrei preferito che tu avessi quindi eliminato il post SO originale, o almeno collegato al cross-posting.
Ingo Karkat,
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.