我在 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