Як я можу вказати буфери у вікні швидкого виправлення у Vim?


13

За допомогою редактора vim поширене завдання - перегляд буферів. Зараз я використовую стандартні команди типу :lsa або :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швидкої виправлення вмістом списку, без успіху (можливо, тому, що моє незнання програмування вимскриптів)

Будь-яка пропозиція?


Ви мали на увазі :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 - це красиво! Можливо, я би додав: вчасно нарешті свого дзвінка, щоб негайно відкрити вікно швидкої виправлення, і, можливо, це може бути корисно повідомити про позицію курсора. Мені належить вивчити трохи викскрипту :-)
Джорджіо Робіно

9

Спробуйте скористатися цим картографуванням:

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

У запиті введіть потрібний номер буфера і натисніть Enter.

гб


qgery де про перерахування буферів у вікні швидкого пошуку.
VeXii

Так, і моя відповідь дає легку альтернативу.
romainl

1
ОП заявляє, що він знає про буферний список, але любить його мати у вікні швидкого виправлення. і ти вирішуєш просто використовувати буферний список?
VeXii

1

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

PS: Ви задали те саме питання щодо Stack Overflow ; будь ласка, не надсилайте ідентичне питання паралельно на декілька сайтів!


tks Ingo, я тестував трохи bufexplorer і мені це подобається. Я також розміщував тут, тому що запропоновано зробити
стаквервер

1
Так, я це бачив. Я вважаю за краще, щоб ви видалили оригінальну публікацію SO або принаймні прив’язали до перехресного повідомлення.
Інго Каркат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.