вставить bash вывод скрипта в файл vim - PullRequest
3 голосов
/ 06 августа 2020

Я пишу уценку в Vim и использую этот ярлык для установки правильного синтаксиса изображения уценки:

nnoremap <leader>p :s/.*/![](\0)/ <CR>

при нажатии ,p, /path/to/image/img.jpg (в моем текстовом файле vim) становится

![](/path/to/image/img.jpg)

Но я хочу добавить после этого { width = *variable*% }, вот так

![](img.jpg){ width = *variable*% }

Я сделал этот маленький bash скрипт (img.sh), который дает мне переменную в соответствии с размер изображения:

#!/bin/bash

VAR=$(identify -format '%h' $1)

echo "scale=3; 300 * (100/$VAR)" | bc

Если я сделаю это в vim :r !img.sh /path/to/image/img.jpg, я получу номер в этом случае 32

Я бы хотел запустить этот скрипт с помощью ярлыка выше, я пробовал это :

nnoremap <leader>p :s/.*/![](\0){ width=/ <CR> :r !img.sh /path/to/image/img.jpg <CR> % }

Я хочу, чтобы вы помогли мне найти способ не вводить путь к изображению для выполнения сценария. Путь к изображению уже записан в тексте, если бы я мог найти способ указать vim, чтобы поместить его в ярлык после img. sh было бы здорово!

1 Ответ

0 голосов
/ 06 августа 2020

Вы можете использовать выражение Vimscript на стороне замены вашей команды :s, таким образом вы можете ссылаться на текст в совпадении (который является путем к изображению), используя submatch(0) . Вы можете использовать выражение для замены :s, начав его с \=, подробнее см. :help sub-replace-expression.

Используя выражение замены, вы также можете использовать функция system() для вызова внешней команды вместо использования отдельной команды :r !... для чтения ее вывода в текущий буфер.

Собираем все вместе:

:s/.*/\='![]('.submatch(0).']{ width='.trim(system('img.sh '.submatch(0))).' }'/

Или добавить к нему сопоставление:

nnoremap <leader>p :s/.*/\='![]('.submatch(0).']{ width='.trim(system('img.sh '.submatch(0))).' }'/<CR>

(ПРИМЕЧАНИЕ: вы также можете добавить команду :noh в конец сопоставления, иначе поиск будет продолжать выделяться. для .*, что соответствует всему.)

nnoremap <leader>p :s/.*/\='![]('.submatch(0).']{ width='.trim(system('img.sh '.submatch(0))).' }'/\|noh<CR>
...