首页 > 解决方案 > 在 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 之后的快捷方式中,那么图像的路径已经写在文本中,那就太好了!

标签: imagevim

解决方案


您可以在:s命令的替换端使用 Vimscript 表达式,这样您就可以使用submatch(0). :s您可以使用以 开头的表达式来替换 a ,有关详细信息\=,请参阅: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>

推荐阅读