Как перенаправить вывод в Gvim в виде списка файлов, которые нужно открыть? - PullRequest
9 голосов
/ 24 декабря 2009

Я бы хотел findstr /m background *.vim | gvim, чтобы открыть все *.vim файлы, содержащие background, в одном экземпляре gvim - но я не могу заставить работать трубопровод.

Это очень похоже на этот вопрос , но вместо того, чтобы захватывать вывод stdin, я бы хотел, чтобы GViM рассматривал вывод как список открываемых файлов - и в системе Windows, поэтому xargs не гарантировано. Есть идеи?

Ответы [ 4 ]

6 голосов
/ 24 декабря 2009

Я могу придумать несколько способов сделать это:

Используйте vimgrep

Использовать vimgrep: после запуска gvim введите:

:vimgrep /background/ **/*.vim

Это заполнит список быстрых исправлений всеми совпадениями (возможно, более одного на файл), поэтому вы можете использовать такие вещи, как :copen, :cw, :cn и т. Д. Для навигации (см. :help quickfix)


Использовать встроенный ум vim

Используйте findstr, чтобы получить список файлов, а затем получите vim, чтобы открыть эти файлы:

findstr /m background *.vim > list_of_files.txt
gvim list_of_files.txt

" In Gvim, read each file into the buffer list:
:g/^/exe 'badd' getline('.')

" Open the files in tabs:
:bufdo tabedit %

Это загрузит каждый файл, но также сохранит список файлов открытым (вы всегда можете загрузить его или что-то еще).

Редактировать :

Использование :tabedit в списке файлов не работало (я только проверял :badd). Вы можете обойти это, используя badd и затем bufdo (как указано выше) или сделав что-то вроде этого (поместите это в ваш vimrc):

command! -range=% OpenListedFiles <line1>,<line2>call OpenListedFiles()

function! OpenListedFiles() range
    let FileList = getline(a:firstline, a:lastline)
    for filename in FileList
        if filereadable(filename)
            exe 'tabedit' filename
        endif
    endfor
endfunction

Затем просто откройте файл, содержащий все необходимые имена файлов, и введите:

:OpenListedFiles

Используйте функциональность сервера Vim и некоторые ужасные пакетные сценарии

Используйте функциональность сервера и некоторую магию пакетного сценария (которую я не понимаю, когда использую bash)

@echo off
REM Welcome to the hideous world of Windows batch scripts
findstr /m background *.vim > list_of_files.txt
REM Run GVIM (may not be required)
gvim
REM Still in command prompt or .bat file here
REM for each line in the file "list_of_files.txt", pass the line to OpenInTab
for /f %%i in (list_of_files.txt) do call:OpenInTab %%i
goto:eof

:OpenInTab
REM Open the file in a separate tab of an existing vim instance
gvim --remote-tab %~1
goto:eof

Eeeurrgh.


Если бы это был я, я бы выбрал опцию «Использовать встроенный ум vim». На самом деле, это не так: я бы использовал скрипт bash cygwin и просто использовал bash, но если бы я ДОЛЖЕН делать это с помощью встроенных инструментов, я бы использовал встроенный подход к интеллекту.

3 голосов
/ 24 декабря 2009

В Баш:

grep -l background *.vim | xargs gvim

Ключ xargs. Он берет строки из стандартного ввода и передает их в качестве аргументов командной строки. grep -l просто печатает имена файлов со совпадениями.


Другая идея: если у вас нет xargs и вы не можете их загрузить, вы можете преобразовать строки в команды vim (:edit filename) и заставить vim выполнять их, то есть открывать все файлы. Опять же, в моем окружении, где у меня есть sed:

grep -l background *.vim | sed 's/^/:edit /' > files
vim -s files

Даже если у вас нет sed, вы, вероятно, можете заменить его на vi -e (ed).

3 голосов
/ 24 декабря 2009

Открыть Powershell:

gvim $(findstr /m background *.vim)
0 голосов
/ 08 февраля 2017

Любой из них откроет отдельный экземпляр gvim с каждым именем файла - особенно полезно, если существует только одно имя файла, но работает для нескольких имен файлов, если вы в порядке с несколькими экземплярами gvim:

1) findstr в течение

for /f "delims=" %f in ('findstr /m background *.vim') do gvim "%f"

2) труба findstr для

findstr /m background *.vim | for /f "delims=" %f in ('more') do gvim "%f"

3) .bat file Создайте файл с именем gvim_stdin.bat, скажем, содержащий эту единственную строку, как в (2), за исключением того, что знаки% удваиваются:

for /f "delims=" %%f in ('more') do gvim "%%f"

и затем выполните:

findstr /m background *.vim | gvim_stdin
...