Comment puis-je avoir des tampons répertoriés dans une fenêtre de correction rapide dans Vim?

13

À l'aide de l'éditeur vim, une tâche courante consiste à parcourir les tampons. J'utilise maintenant des commandes standard comme :lsou a :bnext. En fait, je mets dans mon .vimrc:

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

Je voudrais parcourir les tampons sous forme de liste dans la fenêtre quickfix, de la manière simple (= excellente) que le plugin MRU implémente.

Existe-t-il un plugin aussi simple que MRU mais agissant sur des tampons?

OK, une solution possible pourrait être d'utiliser la :CtrlpBufferscommande, qui fait partie du plugin Ctrlp mais je ne suis pas un grand fan de Ctrlp, parce que parfois j'ai des beahviours étranges que je ne comprends pas complètement (les sélections en mode flou ...); donc je cherche quelque chose de vraiment simple comme plugin MRU.

BTW, j'ai plaisanté avec la :cexpr {expr}commande, essayant de remplir les fenêtres quickfix avec le contenu de la :buffersliste, sans succès (peut-être parce que mes programmes de programmation ignorés)

Toute suggestion ?

Giorgio Robino
la source
Voulez-vous dire :bnextau lieu de :cnext?
tommcdo
En avez-vous spécifiquement besoin pour être la fenêtre quickfix ? Ou voulez-vous simplement pouvoir voir les tampons ouverts dans une fenêtre? (Parce qu'il y a plusieurs plugins pour faire ce dernier).
Rich
Je veux pouvoir parcourir les tampons ouverts dans une fenêtre. En effet quickfix n'est pas réutilisé
Giorgio Robino
@tommcdo: oui désolé, mes fautes de frappe habituelles. Je veux dire: bnext et j'ai mis à jour la question
Giorgio Robino
en relation: stackoverflow.com/questions/28669101/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

18

Vous pouvez remplir la liste des correctifs rapides avec chaque tampon comme ceci:

:call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr": v:val}'))
  • setqflist()prend une liste d'éléments du dictionnaire décrivant chaque erreur (nom de fichier, numéro de ligne, position, etc.). Dans ce cas, nous spécifions un ensemble minimal d'informations: le numéro de tampon
  • map()prend une liste et une expression (une chaîne) et renvoie une nouvelle liste de l'expression appliquée à chaque élément de la liste d'entrée. Ici, nous prenons une liste des numéros de tampons répertoriés et les formatez pour les utiliser dans setqflist()( '{"bufnr": v:val}', où v:valest la valeur de l'élément dans la liste)
  • filter()filtre une liste, supprimant les éléments qui ne satisfont pas une expression donnée. Ici, l'expression est buflisted(v:val), ce qui signifie que le numéro de tampon existe et est répertorié, c'est-à-dire qu'il apparaît dans la :lssortie
  • range(a, b)génère une liste de nombres de aàb
  • bufnr()renvoie le numéro d'un nom de tampon donné. Si l'argument est '$', il renvoie le numéro de tampon le plus élevé

C'est beaucoup à taper et pas très mémorable, vous pouvez donc l'encapsuler dans une commande dans votre vimrc:

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

Maintenant, vous pouvez simplement utiliser :Qbufferspour remplir la liste des correctifs.


Si vous souhaitez que cela soit mis à jour automatiquement à mesure que de nouveaux tampons sont ajoutés, vous pouvez faire quelque chose comme ceci:

autocmd BufAdd * Qbuffers

Je ne recommanderais pas cela, cependant, car cela rendra la liste des correctifs assez inutilisable pour des choses comme :makeou :grep.

tommcdo
la source
1
merci pour les explications, tommcdo. Qbuffers est magnifique! Peut-être que j'ajouterais un: copen à la fin de votre appel pour ouvrir immédiatement la fenêtre de correction rapide et peut-être qu'il pourrait être utile de signaler la position du curseur. Je dois étudier un peu de vimscript :-)
Giorgio Robino
9

Vous devriez essayer ce mappage:

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

À l'invite, tapez le numéro de tampon souhaité et appuyez sur Entrée.

gb

romainl
la source
la question où sur la liste des tampons dans la fenêtre de recherche rapide.
VeXii
Oui, et ma réponse fournit une alternative légère.
romainl
1
OP indique qu'il connaît la liste des tampons mais aime l'avoir dans la fenêtre de correction rapide. et votre solution consiste simplement à utiliser la liste tampon?
VeXii
1

Jetez un œil au plugin bufexplorer . Il ouvre une liste consultable de tous les tampons dans une barre latérale, similaire au plug-in MRU mentionné. En outre, il existe plusieurs autres plugins de ce type sur vim.org .

PS: Vous avez posé la même question sur Stack Overflow ; veuillez ne pas soumettre la même question à plusieurs sites en parallèle!

Ingo Karkat
la source
tks Ingo, j'ai testé un peu bufexplorer et j'aime ça. J'ai également posté ici parce qu'un stackoverflow a suggéré de le faire
Giorgio Robino
1
Oui j'ai vu ça. J'aurais préféré que vous ayez ensuite supprimé le message SO original, ou du moins lié à la publication croisée.
Ingo Karkat