2016-06-03 3 views
4

Внутри Vim я хочу сканировать текст по строкам и передать его содержимое внешней команде оболочки. Например, у меня есть список имен и хочу приветствовать каждое имя списка. Что мне уже удалось сделать, так это следующее.Передача аргумента в vim «выполнить»

Учитывая этот текст:

John Doe 

    Jane Doe 

Baby Doe 

я могу использовать эту команду, чтобы найти имя только и повторно использовать маркер в качестве замены команды с использованием синтаксиса обратной ссылки (\ 0 или \ 1).

:%g/\w\+/ s//--\0--/ 

Это выход:

--John-- Doe 

    --Jane-- Doe 

--Baby-- Doe 

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

Эта команда

:% г/\ ш \ +/ехе "мир"

работает отлично, но как спараметрировать это "эхо привет!"?

До сих пор, я попытался это:

:% г/\ ш \ +/ехе "эхо-привет!" \ 0

и это тоже:

:% г/\ ш \ +/ехе "! эхо привет" &

без успеха ...

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

+2

HTTP: // VIM .wikia.com/wiki/Power_of_g имеет несколько примеров. – bishop

+2

Специально этот: http://vim.wikia.com/wiki/Redirect_g_search_output – dNitro

ответ

2

Так вот ответ:

Следующая команда будет сканировать текст, обрезать строки и пробельные сказать «привет» с каждым именем в тексте:

%g/\<\w\+\>/ y A | exe ' !echo hello '. substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '') | let @a =""

Следующая один создаст каталог для каждой непустой строки файла. На этот раз, shellescape() добавлена ​​функция:

%g/\<\w\+\>/ y A | exe ' !mkdir '. shellescape(substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '')) | let @a =""

А если вам нужно создать "бесшумные" каталоги, вот команда:

%g/\<\w\+\>/ y A | exe 'silent !mkdir ' . shellescape(substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '')) | let @a =""

P.S.:

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

%g/\<\w\+\>/ y A | exe 'silent !echo ' . substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '') . ">> new_file.txt" | let @a =""