Переменная, которая содержит «список всех открытых буферов» в Vim? - PullRequest
9 голосов
/ 07 ноября 2008

:vimgrep выглядит действительно полезной вещью.

Вот как это использовать:

:vim[grep][!] /{pattern}/[g][j] {file} ... 

:help говорит, что вы можете просто написать {file}, чтобы назвать, скажем, *.c для текущего каталога. Возможно, я запустил Vim со списком файлов, который достаточно сложен, поэтому я не хочу вводить его вручную для {file}, и, кроме того, Vim уже знает, что это за файлы.

Что бы я хотел сделать, это vimgrep по любому из:

  • :args
  • :files
  • :buffers

Какую переменную (переменные) я бы использовал вместо {file} для именования, соответственно, любого из этих списков в команде vimgrep?

Ответы [ 4 ]

11 голосов
/ 07 ноября 2008

Не можете ли вы перехватить результат этих команд в регистр (:h :redir) и вставить его обратно в вызов :vimgrep:exe).

Что-то вроде:

:exe "vimgrep/pattern/ " . lh#askvim#Exe(':args')

Примечания:

  • lh # askvim # Exe - это просто оболочка вокруг :redir; ничего действительно сложного
  • некоторые из этих результатов могут нуждаться в некоторой обработке (см. :args, который добавляет квадратные скобки)
  • Иногда есть функция, которая возвращает именно то, что вы ищете, см. join(argv(), ' ') в :args случае
  • Относительно: буферов, может быть что-то вроде:

.

function BuffersList()
  let all = range(0, bufnr('$'))
  let res = []
  for b in all
    if buflisted(b)
      call add(res, bufname(b))
    endif
  endfor
  return res
endfunction
:exe 'vimgrep/pattern/ '.join(BuffersList(),' ')
5 голосов
/ 07 ноября 2008

Вы можете сделать это:

:bufdo vimgrep /pattern/ %

% заменяет имя буфера.

3 голосов
/ 07 декабря 2011

Вот слегка уточненная версия одного из ответов. Следующая команда ищет шаблон во всех открытых вкладках и запоминает результаты в списке быстрых исправлений:

:cex [] | tabdo vimgrepa /pattern/ %

cex [] устанавливает содержимое списка быстрых исправлений в пустой список. Сначала нужно вызвать его, потому что vimgrepa накапливает результаты поиска со всех вкладок. Также вы можете заменить tabdo на argdo, bufdo и windo.

Для просмотра результатов поиска выполните:

:cope

Этот метод, однако, имеет ограничение: он может искать только во вкладках, которым уже присвоены имена файлов (% не будет расширяться в новой вкладке).

EDIT: Вы также можете использовать команду в функции в ~/.vimrc следующим образом:

function TS(text)
    exe "cex [] | tabdo vimgrepa /" . a:text . "/ %"
endfunction
command -nargs=1 TS call TS(<q-args>)
cnoreabbrev ts TS

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

:ts from game import

где слова после ts являются шаблоном поиска. Без последней строки вы должны ввести имя функции в верхнем регистре.

2 голосов
/ 14 октября 2013

Чтобы [vim] получить список файлов в списке аргументов, вы можете использовать ## (см. :help cmdline-special).

:vimgrep /re/ ##

Я не знаю аналогичного сокращения для списка буферов, но вы можете сделать что-то вроде:

:argdelete ##
:bufdo argadd %

... и затем используйте ##. Или используйте :n для открытия новых файлов (которые будут добавлены в список аргументов) вместо :e.

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