Как использовать переменное содержимое в качестве аргумента для команды vim?

12

например, предположим, что я сделал

:let foo=pattern

и теперь я хочу выполнить, Ggrep patterно использовать переменную fooвместо литеральной patterстроки.

:echo foo

выходы pattern, но

:Ggrep foo

просто ищет фу

ОБНОВИТЬ:

создать строку команды и затем выполнить: выполнить ее не решение, это взломать. И это ломается с любыми нетривиальными значениями переменных.

Виталий Кушнер
источник
что такое Ggrep(заглавная G?)?
Акира
git grep из плагина vim 'fugutive'
Виталий Кушнер,
Пример команды неверен. это должно быть позволено foo = 'pattern'. Скажите, что: выполнить это взломать совершенно неправильно. Вот решение: вы хотите, чтобы vim оценил команду перед ее выполнением
albfan

Ответы:

2

Дело не в переменной, но, возможно, команда vim abbreviate может помочь. Попробуйте из командной строки:

:abbreviate foo pattern

потом

:Ggrep foo<space>

Это завершит «foo» для вашего «шаблона».

alexche8
источник
Теперь попробуй запустить echo foo. Оппс echo patternкоторый не является переменной. это взломать и ввести в заблуждение.
Альбфан
7

как насчет:

:execute ':grep ' . foo
Акира
источник
как мне правильно избежать содержимого foo? он может содержать специальные символы, такие как ", ', /, \ и т. д.
Виталий Кушнер,
1
@Vitaly Kushner: Смотрите ": help escape ()" и ": help fnameescape ()".
garyjohn
Я знаю escape (), но не уверен насчет того, каких персонажей бежать
Виталий Кушнер
fnameescape () не подходит, это не аргумент имени файла, это функция arg to plugin. предположим, я: let foo = "aaa \" bbbb'cccc "
Виталий Кушнер
1
Я тоже тяну волосы за это. Вы не можете выполнить команду, как let xyz = tabpagenr()тогда tabnext xyz. Язык сценариев Vim столь же несовершенен, как и его модальная среда.
Пук
2

Если вам не нравится :exeрешение, вы можете «прочитать» содержимое переменной в командную строку, используя =регистр выражений. Например, введите, :Ggrepзатем нажмите Ctrl-, rа затем введите =fooи нажмите Enter. Предполагая, что переменная fooсодержит «pattern», ваша командная строка должна выглядеть так:

:Ggrep pattern

Это имеет то преимущество, что вы можете видеть фактическую команду, которая будет выполняться, и даже изменять ее перед Enterповторным нажатием .

Увидеть:

:help "=
Heptite
источник