З довідки :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)