Как мне перечислить буферы в окне быстрого исправления в Vim?


13

С помощью редактора vim обычной задачей является просмотр буферов. Теперь я использую стандартные команды, такие как :lsили :bnext. На самом деле я установил в моем .vimrc:

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

Я хотел бы просмотреть буферы в виде списка в окне быстрого исправления простым (= превосходным) способом, который реализует плагин MRU .

Есть ли такой простой плагин, как MRU, но работающий на буферах?

Хорошо, возможное решение могло бы состоять в том, чтобы использовать :CtrlpBuffersкоманду, часть плагина Ctrlp, но я не большой поклонник Ctrlp, потому что иногда у меня странное поведение, которое я не до конца понимаю (выбор нечеткого режима ...); поэтому я ищу что-то действительно простое, как плагин MRU.

Кстати, я пошутил с :cexpr {expr}командой, пытаясь заполнить окна быстрого исправления содержимым :buffersсписка, но безуспешно (возможно, из-за моего невежественного программирования vimscripts)

Любое предложение ?


Вы имели в виду :bnextвместо :cnext?
Tommcdo

Вам конкретно нужно, чтобы это было окно быстрого исправления ? Или вы просто хотите видеть открытые буферы в окне? (Потому что есть несколько плагинов, чтобы сделать последнее).
Богатый

Я хочу иметь возможность просматривать открытые буферы в окне. Действительно, быстрое исправление не требуется
Джорджио Робино

@tommcdo: да, извините, мои обычные опечатки. Я имею в виду: bnext и я обновил вопрос
Джорджио Робино

Ответы:


18

Вы можете заполнить список быстрых исправлений каждым буфером следующим образом:

:call setqflist(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '{"bufnr": v:val}'))
  • setqflist()принимает список элементов словаря, описывающих каждую ошибку (имя файла, номер строки, положение и т. д.). В этом случае мы указываем минимальный набор информации: номер буфера
  • map()принимает список и выражение (строку) и возвращает новый список выражения, примененного к каждому элементу входного списка. Здесь мы берем список перечисленных номеров буферов и форматируем их для использования в setqflist()( '{"bufnr": v:val}'где v:valзначение элемента в списке)
  • filter()фильтрует список, удаляя элементы, которые не удовлетворяют данному выражению. Здесь выражение означает buflisted(v:val), что номер буфера существует и указан в списке, то есть появляется в :lsвыходных данных.
  • range(a, b)генерирует список номеров от aдоb
  • bufnr()возвращает номер заданного имени буфера. Если аргумент равен '$', он возвращает самый большой номер буфера

Это много для ввода, и не очень запоминающимся, так что вы можете заключить его в команду в вашем vimrc:

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

Теперь вы можете просто использовать :Qbuffersдля заполнения списка быстрых исправлений.


Если вы хотите, чтобы это обновлялось автоматически при добавлении новых буферов, вы можете сделать что-то вроде этого:

autocmd BufAdd * Qbuffers

Однако я бы не рекомендовал это, поскольку это сделает список быстрых исправлений непригодным для таких вещей, как :makeили :grep.


1
спасибо за объяснения, Tommcdo. Qbuffers это красиво! Возможно, я бы добавил: copen в конце вашего звонка, чтобы немедленно открыть окно быстрого исправления, и, возможно, было бы полезно сообщить о позиции курсора. Я должен немного изучить vimscript :-)
Джорджио Робино

9

Вы должны попробовать это отображение:

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

В командной строке введите желаемый номер буфера и нажмите Enter.

гигабайт


вопрос о списках буферов в окне быстрого поиска.
VeXii

Да, и мой ответ предоставляет легкую альтернативу.
Роменл

1
ОП заявляет, что он знает о списке буферов, но хотел бы иметь его в окне быстрого исправления. а у вас есть решение просто использовать буферный список?
VeXii

1

Взгляните на плагин bufexplorer . Он открывает просматриваемый список всех буферов в боковой панели, аналогично упомянутому плагину MRU. Также на vim.org есть еще несколько таких плагинов .

PS: вы задали тот же вопрос о переполнении стека ; Пожалуйста, не задавайте одинаковый вопрос нескольким сайтам параллельно!


tks Ingo, я немного протестировал bufexplorer и мне это нравится. Я также опубликовал здесь, потому что предложено сделать
переполнение стека

1
Да, я видел это. Я бы предпочел, чтобы вы затем удалили исходный пост SO или, по крайней мере, связались с перекрестной публикацией.
Инго Каркат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.