Как я перенаправляю вывод в Gvim как список файлов, которые будут открыты?

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

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

9
задан Community 23 May 2017 в 12:17
поделиться

3 ответа

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

Use vimgrep

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

:vimgrep /background/ **/*.vim

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


Используйте встроенную функцию vim's cleverness

Используйте 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.


На моем месте я бы выбрал опцию "Использовать встроенный ум Вима". На самом деле, это не так: я бы использовал скрипт bash cygwin и просто использовал bash, но если бы я HAD сделал это с нативными инструментами, я бы использовал встроенный подход "ум".

.
6
ответ дан 4 December 2019 в 19:34
поделиться

Откройте Powershell:

gvim $(findstr /m background *.vim)
3
ответ дан 4 December 2019 в 19:34
поделиться

В bash:

grep -l background *.vim | xargs gvim

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


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

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

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

.
3
ответ дан 4 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: