Как я могу просмотреть пути к файлам для всех открытых буферов vim? - PullRequest
6 голосов
/ 30 августа 2011

Есть ли способ перечислить все открытые буферы в vim? Я хотел бы просмотреть полный путь к файлу для каждого открытого буфера и сохранить список во внешнем файле или восстановить его для вставки в другой текстовый документ.

Решение

Это был очень тяжелый конкурс! Все 3 предложения ниже работали хорошо. Я пошел с Luc Hermitte's и добавил это в свой vimrc:

noremap <silent> <leader>so :call writefile( map(filter(range(0,bufnr('$')), 'buflisted(v:val)'), 'fnamemodify(bufname(v:val), ":p")'), 'open_buffers.txt' )<CR>

Так что теперь, набрав ,so, вы сохраните полный путь всех открытых буферов в текущий каталог в файле open_buffers.txt

Ответы [ 4 ]

7 голосов
/ 30 августа 2011

Я бы использовал «простой»:

echo map(filter(range(0,bufnr('$')), 'buflisted(v:val)'), 'fnamemodify(bufname(v:val), ":p")')

С:

  • range(0,bufnr('$')), чтобы иметь | Список |из всех возможных номеров буферов
  • filter(possible_buffers, 'buflisted(v:val)'), чтобы ограничить список только теми буферами, которые фактически перечислены - вы можете предпочесть bufexist(), который также покажет справочные буферы и т. д.
  • map(listed_buffer, 'nr_to_fullpath(v:val)') для преобразования всех номеров буферов в полные пути
  • bufname() для преобразования одного номера буфера в (упрощенное) имя пути
  • fnamemodify(pathname, ':p') для получения полного абсолютного пути изотносительный путь.

Измените :echo на call writefile(pathname_list, 'filename'), и все, или на :put= и т. д.

2 голосов
/ 30 августа 2011

Это должно работать:

:redi @"|ls|redi END
:new +pu
:%s/[^"]*"\([^"]*\)".*/\=fnamemodify(submatch(1), ":p")/e
:g/^$/d

Объяснение:

  • :redi перенаправит сообщения
  • :redi @" перенаправит сообщение на @" он же безымянный регистр
  • :redi END остановка перенаправления
  • :ls распечатает все не скрытые буферы
  • :new создаст буфер в разбиении
  • :new +{cmd} +cmd выполнит команду для нового буфера.
  • :new +pu выполнит команду :pu или поместит в новый буфер
  • регулярное выражение в основном совпадаетвся строка и захватывает содержимое между кавычками
  • \= в заменяющей части :s/ выполнит выражение
  • fnamemodify(submatch(1), ":p") расширит захваченные данные ака submatch(1)
  • :g/^$/d удалить все пустые строки

Дополнительная информация:

:h /\=
:h :g
:h :new
:h :pu
:h :redi
:h :ls
:h fnamemodify()
:h :d
2 голосов
/ 30 августа 2011

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

:!echo %:p

Если вы обернетесь в записи, вы получите то, что вам нужно, например ::10000

qq
:!echo %:p >> my_buffers
:bnext
q

Теперь выполняйте макрос несколько раз, когда у вас есть буферы, например ::100100

10@q

и у вас будет результат в файле my_buffers

Вероятно, лучший способ, хотя: -)

0 голосов
/ 30 августа 2011

Сценарий bufexplorer показывает путь всех открытых буферов, однако он также показывает другую информацию, поэтому он не идеален для восстановления и вставки в другой документ. Вот скриншот

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...