image - 在 vim 文件中插入 bash 脚本输出

我在 Vim 中编写 markdown 并使用此快捷方式设置正确的 markdown 图像语法:

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 之后的快捷方式中,那就太好了!

最佳答案

您可以在 :s 命令的替换端使用 Vimscript 表达式,这样您就可以使用 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>

https://stackoverflow.com/questions/63283012/

相关文章:

node.js - cors 问题与 passport.js google oauth 策略

angular - 如何更新 Angular 中提供者提供的值?

python - 当某些列值为空时,如何合并 Dataframe 中的多行?

php - 在 Laravel 中通过表格获得一行的最佳方法是什么?

angular - ionic /Angular 将对象推送到数组对象

reactjs - EsLint 错误解释 no-unused-vars 中的导入语句

.net-core - 如何停止 blazor @onclick 重新渲染页面

caching - Mike Acton 的面向数据设计 - 'loops per cache li

c# - EpiServer DynamicDataStore LINQ 语句中的 sql 语法不正

azure - 如何在函数应用中为Azure SignalR服务使用不同的连接字符串?