перенаправление в файл поиска в Vim - PullRequest
5 голосов
/ 11 февраля 2009

Моя проблема проста. Я ищу определенный шаблон в файле (скажем, метка в Tex-файле)

:g/label/#

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

У вас есть трюк или команда, которую я не знаю?

Ответы [ 5 ]

12 голосов
/ 13 февраля 2009

из исходного поста неясно, что вы подразумеваете под «легко работать с ним», но часто полезно видеть и быстро переключаться между всеми совпадениями в буфере, не «извлекая» совпадения в отдельный буфер.

В vim встроен внутренний grep. Ваш пример будет примерно таким (в vim % обозначает текущий файл)

:vimgrep /label/ %

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

:cope

Теперь вы можете просто прокрутить круг и нажать enter на строке, чтобы перейти к точному положению матча.

Список ошибок быстрого исправления - это тот же буфер, который вы используете, если вы запускаете make изнутри vim и ваш компилятор выдает ошибки: он дает вам список того, что и где находятся ошибки.

После того, как вы перепрыгнули в одно место, на которое указывает быстрое исправление, вы можете перейти вперед и назад в списке с помощью :cn и :cp. :ccl закрывает список ошибок.

Вы также можете расширить свой список «ошибок» с помощью :vimgrepa /newpattern/ % или :vimgrepadd

(задокументированное) предостережение в том, что внутренний grep в vim медленнее, чем в большинстве собственных реализаций grep (но вы, например, получаете его "бесплатно" в windows). Если у вас установлен grep, вы можете использовать: grep вместо: vimgrep для похожих результатов.

цитирование :help grep

У Vim есть два способа найти совпадения для рисунок: внутренний и внешний. Преимущество внутреннего grep в том, что он работает на всех системах и использует мощные шаблоны поиска Vim. внешняя программа grep может использоваться, когда Vim grep не делает то, что вы хочу.

Внутренний метод будет медленнее, потому что файлы читаются в память. Преимущества: - Разделители строк и кодировка автоматически распознаются, как будто файл редактируется. - Использует шаблоны поиска Vim. Можно использовать многострочные шаблоны. - Когда плагины включены: можно искать сжатые и удаленные файлы.

Вы также можете использовать список местоположений, если вы уже используете список ошибок для обработки ошибок компиляции. просто добавьте l (для location) в начало команды grep (:lvimgrep, :lvimgrepa :lgrep, :lgrepa) и используйте :lopen :ln :lp :lcl вместо :c* из них.

Для дополнительных команд обратитесь к

:help grep
:help quickfix-window 
:help quickfix
:help quickfix-error-lists
4 голосов
/ 12 февраля 2009
:redir > matches.txt|execute 'g/foo/#'|redir END

См. :h :redir, вы также можете перенаправить на регистры, переменные, буфер обмена и т. Д.

3 голосов
/ 11 февраля 2009

То, что вы делаете, по сути, 'grep -n label file ' из командной строки. Таким образом, вы можете легко запустить эту команду и> в файл.

Происхождение 'grep' происходит даже из одного и того же источника.

2 голосов
/ 11 февраля 2009

В какой-то момент я получил это из сети:

function GoToLine(mainbuffer)
   let linenumber = expand("<cword>")
   silent bd!
   silent execute "buffer" a:mainbuffer
   silent execute ":"linenumber
   silent nunmap <Enter>
endfunction
command -nargs=1 GoToLine :call GoToLine(<f-args>)

function GrepToBuffer(pattern)
   let mainbuffer = bufnr("%")
   silent %yank g

   enew
   silent put! g
   execute "%!egrep -n" a:pattern "| cut -b1-80 | sed 's/:/ /'"
   silent 1s/^/\="# Press Enter on a line to view it\n"/
   silent :2

   silent execute "nmap <Enter> 0:silent GoToLine" mainbuffer "<Enter>"
   " silent nmap <C-G> <C-O>:bd!<Enter>
endfunction
command -nargs=+ Grep :call GrepToBuffer(<q-args>)

Поместите его в свой .vimrc, затем: Grep Foo

Для нормальной работы требуется внешняя программа grep.

0 голосов
/ 11 февраля 2009

(Просто идея - не проверено.)

Вы можете удалить все строки с вашим шаблоном, записать в другой файл и отменить удаление.

:g/label/d
:w matches
u
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...