З довідки :help backtick-expansion:
On Unix and a few other systems you can also use backticks for the file name
argument, for example:
:next `find . -name ver\\*.c -print`
:view `ls -t *.patch \| head -n1`
The backslashes before the star are required to prevent the shell from
expanding "ver*.c" prior to execution of the find program. The backslash
before the shell pipe symbol "|" prevents Vim from parsing it as command
termination.
Якщо я введіть команду, взяту з довідки, я отримаю помилку:
:next `find . -name ver\\*.c -print
E79: Cannot expand wildcards
Чому в прикладі довідки використовується два зворотних риски замість одного, і чому це не працює?
Наступна робота:
Якщо я видаляю один із двох кутів, які захищають зірку від розширення оболонкою перед
findпрограмою::next `find . -name ver\*.c -print`Якщо я видаляю обидві нахили в нижній частині накиду і розміщую окремі лапки навколо шаблону
ver*.c::next `find . -name 'ver*.c' -print`
До цього моменту, здається, правило:
якщо ваша команда оболонки містить зірку, і ви не хочете, щоб оболонка розширювала її перед командою, покладіть один зворотний проріз перед ним або покладіть одинарні лапки навколо шаблону .
Але допомога дає ще один приклад:
:view `ls -t *.patch \| head -n1`
Ця команда працює без будь-яких модифікацій, не потребує одинарних лапок, немає зворотної косої риси.
Я припускаю, що причина цього працює в тому, що lsкоманда (всупереч -nameаргументу findкоманди) приймає кілька аргументів файлів і не бачить проблем з розширенням оболонки *.patch.
Тепер, давайте скажемо , я хочу , щоб шукати всі файли з розширенням .confвсередині /etcпапки і труб на вихід з findдо grepотримати тільки сірники , що містить рядок input.
У оболонці з будь-якого робочого каталогу я б набрав:
find /etc -name '*.conf' | grep input
І спрацювало б.
У vim я введу ту саму команду, що посилає навколо неї зворотні посилання, і зворотній косий ривок перед символом труби, щоб запобігти інтерпретації Vim як припинення команди:
:next `find /etc -name '*.conf' \| grep input`
І це працює.
Тепер, якщо я набираю ту саму команду без pipe та the grep input, я отримую помилку:
:next `find /etc -name '*.conf'`
E79: Cannot expand wildcards
Чому в цьому випадку є помилка, навіть якщо я захистив зірку єдиними цитатами?
І чому зараз є помилка, але не тільки раніше з трубою і grep input?
Щоб спробувати зрозуміти, я придумав більш просту команду:
find . -name '*.conf'
Він шукає всі файли з розширенням .confу робочому каталозі. Команда працює в оболонці.
Щоб перевірити його на vim, я набрав: :next `find . -name '*.conf'`
І це працює. У цьому випадку крапка відповідає моєму поточному робочому каталогу, як показано командою Ex, :pwdяка є моєю домашньою директорією /home/usernameз моменту запуску з неї сеансу vim.
Чому це працює, коли я прошу шукати в поточному робочому каталозі, тоді як він не працює, коли я прошу шукати в довільній папці, наприклад /etc?
Тепер, якщо я міняю свою робочу директорію з /home/usernameна /etcкоманду vim Ex :cd /etcі повторюю ту саму команду, що і раніше, вона знову помиляється:
:next `find . -name '*.conf'`
E79: Cannot expand wildcards
Чому та сама команда працює, коли я перебуваю у своїй домашній папці, але не коли я перебуваю /etc?
Я впевнений, що є якась логіка, але я не можу її знайти.
Який загальний і правильний синтаксис для заповнення аргументу за допомогою довільної команди оболонки (містить зірочку, трубу, пошук у будь-якому каталозі з будь-якого робочого каталогу)?
Я використовую версію vim 7.4.942, а zsh - моя оболонка за замовчуванням. Я перевірив ці команди з мінімальним ініціалізацією ( vim -u NORC -N) як від bash, так і з zsh.
Чи потрібно мені налаштувати vim для виклику bash, а не zsh?
vim $(find . -name ver\*.c -print), vim $(ls -t *.patch | head -n1), vim $(find /etc -name '*.conf' | grep input), vim $(find /etc -name '*.conf'),vim $(find . -name '*.conf')
--remoteдив.: Vi.stackexchange.com/a/5618/4939 ), але мені цікаво знати, як це зробити робити це безпосередньо з поточного сеансу. Якщо це неможливо, це добре, але, прочитавши допомогу, здається, це можна зробити. Якщо це так, я хотів би зрозуміти, чому vim так по-різному реагує на подібні команди.
find /etc -name '*.conf'не працює, я думаю, що з цієї команди виходять якісь кумедні імена, і це може бути причиною того, що воно спрацювало під час проходження grep.
vim $(find . -name ver*.c)