Vim 将文件路径字符串转换为标记链接

Vim 将文件路径字符串转换为标记链接,vim,Vim,我有一长串文件路径,格式如下: *(00原子/图像/AI-004-image-2x1.md) 这些由新行分隔 我想将这些链接更改为标记链接,使用文件名(无破折号和无文件路径类型)作为每个路径的标题: *[AI 004 image 2x1](00原子/图像/AI-004-image-2x1.md) 所有这些文件路径都有两个级别,但前两个级别是可变的: *(00原子/表格和反馈/AFF-001-text-field.md) *(01分子/event text/MTE-006-event-addr

我有一长串文件路径,格式如下:

*(00原子/图像/AI-004-image-2x1.md)
这些由新行分隔

我想将这些链接更改为标记链接,使用文件名(无破折号和无文件路径类型)作为每个路径的标题:

*[AI 004 image 2x1](00原子/图像/AI-004-image-2x1.md)
所有这些文件路径都有两个级别,但前两个级别是可变的:

*(00原子/表格和反馈/AFF-001-text-field.md)
*(01分子/event text/MTE-006-event-address-bar-unordered-commercies-list.md)
此外,文件名中可以包含can波浪线,如下所示:

*(01 molecles/forms/MF-001-input-with-form-label~error message.md)
我正在寻找一种使用Vim(通过宏或字符串替换)的方法,以我需要的方式格式化该文件。我已经用字符串替换和宏进行了多次尝试,但都很难做到这一点。有人认为这些路径有什么独特之处可以帮助我解决这个问题吗?

这里有一种方法:

:%s!^\* \zs([^()]*/\([^()/]\+\)\.md)!\='[' . tr(submatch(1), '-', ' ') . ']' . submatch(0)!
想法:

  • 运行
    s所有行上的替换命令(
    %
  • 要替换的模式是
    ^\*\zs([^()]*/\([^()/]\+\)\.md)
    ,匹配
    • ^
      -行的开头
    • \*
      -星号和空格
    • \zs
      -标记比赛的正式开始(到目前为止的所有内容都不会被替换)
    • -左括号)
    • [^()]*
      -0个或更多非对等字符(这与路径中的目录匹配)
    • /
      -斜杠
    • \(
      -开始捕获组1
    • [^()/]\+
      -1个或多个非对等/非斜杠字符(basename部分)
    • \)
      -捕获组1结束
    • \.md
      -文件扩展名“.md”
    • -右括号
  • 更换零件是
    \='['.tr(子匹配(1),'-','.'])。子匹配(0)
    ,表示
    • \=
      -其余部分将作为表达式而不是字符串进行计算
    • 子匹配(1)
      -第一个捕获组的内容,即文件的基本名称(不带
      .md
      扩展名)
    • tr(…,'-','')
      -将字符串中的所有破折号转换为空格
    • '['…']'
      -前后连接
      [
      ]
      字符
    • 。子匹配(0)
      -附加整个匹配字符串
这将
*(foo/bar baz.md)
转换为
*[bar baz](foo/bar baz.md)

输入:

*(00原子/图像/AI-004-image-2x1.md)
*(00原子/表格和反馈/AFF-001-text-field.md)
*(01分子/event text/MTE-006-event-address-bar-unordered-commercies-list.md)
*(01 molecles/forms/MF-001-input-with-form-label~错误消息.md)
结果:

*[AI 004 image 2x1](00原子/图像/AI-004-image-2x1.md)
*[AFF 001文本字段](00原子/表格和反馈/AFF-001-text-field.md)
*[MTE 006事件地址栏无序便利设施列表](01/event text/MTE-006-event-address-bar-UNORDED-PROFESSIONS-list.md)
*[MF 001使用表单标签输入~错误消息](01/forms/MF-001-input-with-form-label~错误消息.md)

Wow。难以置信的从中我学到了很多,非常感谢。我在飞行中写作(相对于录制宏)的机会非常渺茫。。。但是很好!