: диапазон ! команда
записывает текст из диапазона в канал (удаляя его из буфера файлов), запускает команду для канала, считывает стандартный вывод команды и вставляет его в буфер, в котором находился диапазон . Это
vim
функция, которую вы используете. Эта функция очень полезна сsort
командой. Я не могу вспомнить, чтобы когда-либо видел какую-либо другую ситуацию, где этаvim
функция полезна; это, кажется, не один.Ты хочешь
: диапазон w! команда
который записывает диапазон в канал (но не удаляет его из буфера файлов), запускает команду для канала и позволяет стандартному выводу команды (если есть) просто перейти на экран (т.vim
е. стандарт выход). (Пробел между диапазоном иw
опциональным.)- Диапазон может быть от одной марки к другой (
'<
и'>
эффективно отмечает), одной линии на другую, или просто одна строка. Пока у вас есть только один{{…}}
на линии, вы можете просто перейти на линию (вам не нужно выделять ее) и использовать в.
качестве диапазона. Если у вас есть только один{{…}}
файл, вы можете использовать/{{.*}}/
(или даже/{{/
, если он уникален) в качестве диапазона. Так ваша команда становится: / {{/ w! седь бла бла бла
- Я предпочитаю заключать в кавычки строки, которые нужно заключать в кавычки, а не бросать в них миллион обратных косых черт. Я думаю, это просто личное предпочтение; если обратная косая черта работает на вас, используйте их.
- Необычные регулярные выражения (использующиеся
|
для поиска того или иного шаблона) имеют свое место в мире. Я склоняюсь к использованию несколькихsed
команд. Опять что угодно. - Так что моя версия того, что вы делаете сейчас, будет выглядеть примерно так:
: / {{/ w! Sed -e 's /. xargs xdg-open
который удаляет{{
и все до него, и удаляет}}
и все после него. Но это все еще требует, чтобы вы были в каталоге, где находится файл PNG. Файл PNG находится в том же каталоге, что и текстовый файл. Полезно отметить, что когда вы запускаете команду оболочки с помощью
!
fromvim
, неэкранированный%
в командной строке заменяется именем файла, который вы в данный момент редактируете. (Попробуйте: введите:!echo abc%def
.) Мы можем использовать это, чтобы определить путь к каталогу, в котором находятся файлы. Таким образом, мы можем улучшить приведенную выше команду, чтобы:: / {{/ w!sed -e 's.. * {{|% {{|' -e 's | [^ /] * {{||' -e 's |}}. * ||' | xargs xdg-open
Первая подкоманда seds|.*{{|%{{|
, удаляет все до{{
и заменяет его именем файла и оставляет{{
. Обратите внимание, что эта подкоманда должна использовать (непустой) разделитель, который не будет отображаться в пути / имени файла, поэтому мы не можем его использовать/
. Если у вас есть имена каталогов или имена файлов с вертикальными чертами в них, выберите какой-либо другой символ для использования в качестве разделителя. Вторая подкоманда,s|[^/]*{{||
удаляет часть имени%
файла в имени файла, оставляя часть каталога (если есть), и удаляет{{
. Третья подкоманда,s|}}.*||
такая же, как вторая подкоманда (s/}}.*//
) из предыдущей команды; он удаляет}}
и все после него.В то время как командам всегда нужно использовать разделитель, который не появляется в или тексте (или экранировать символ разделителя, когда он появляется), это проблема только для первой команды. Я использовал во всех трех только для согласованности.
s/pattern/replacement/
pattern
replacement
s
|
TL; DR
Использование:
: / {{/ w! sed -e 's.. * {{|% {{|' -e 's | [^ /] * {{||' -e 's |}}. * ||' | xargs xdg-open
PS Я предполагаю, что вы понимаете, что они не будут работать, если имя файла содержит пробелы.